Modbus协议完全资料与程序解析
下面开始分析定时器,定时器的目的其实就1个,判断一帧是否接收完毕,如果完毕,则进入下一步。在定时器中断函数中,首先要对定时器值进行初始化,这个就不多说了,然后是判断程序是否处于接受状态if(Modbus_recevie_flag == 1),这个状态只有在串口中断函数中才会被置位,其他的情况不会被置位。若程序不是接收状态,则直接跳出定时器中断,若程序处于接收状态,则定时计数自加Modbus_timeout_cnt++;,自加后进入判断if(Modbus_timeout_cnt > 首先判断程序是否处于命令解析状态if(Modbus_cmd_flag == 1)。命令解析状态标志只有在超时后置位,其他情况下不置位。之后是判断接收数据是否大于4字节,if(Modbus_recevie_count > Modbus_send_buf[temp] = modbus_crc >> Modbus_send_buf[4] = modbus_crc >> Modbus_send_buf[i+3]=(data_v&0xff00)>> for(i=8; i> ACC = ACC >> ds1302-> ds1302-> ds1302-> ds1302-> ds1302-> ds1302-> ds1302-> ds1302->timestr[0] = ds1302-> ds1302->timestr[1] = ds1302-> ds1302-> ds1302-> ds1302-> ds1302->timestr[3] = ds1302-> ds1302->timestr[4] = ds1302-> ds1302-> ds1302->crc校验了可以利用返回字节数来确定crc的校验个数temp = temp + 3;,最后计算发送字节的个数 send_cnt = Modbus_recevie_buf[5]*2 + 5 ; //数据发送个数 数据+地址+命令+返回数据个数+crc低+crc高 最后将数据发送出去即可。 5.4 04读只可读模拟量寄存器(输入寄存器) 和03的区别是04就是读ad,ad输入输入模拟两,只能读,不能改,同样也是以模拟两的方式来进行传输的。其程序 与03类似 5.5 05写数字量(线圈状态) 05则是修改io口输出状态,数字量输出。 计算机发送命令:[设备地址] [命令号05] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位] 设备响应:若执行成功,则原样返回 写程序时,首先确定需要修改的io口,然后根据0xff00或0x0000来置位或清零该数据位。执行完成后,将接收到的数据重新发送即可 Uart0_senddata(Modbus_recevie_buf,8); 5.6 06写单个模拟量寄存器(保持寄存器) 06为修改设备da数据,模拟量传输数据。 计算机发送命令:[设备地址] [命令号06] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位] 设备响应:若执行成功,原样返回即可 5.7 16主机设置寄存器 简单的说,就是一次设置多个da,以一个偏移量为准,一次设置多个输出模拟里量 计算机发送命令:[设备地址] [命令号10] [开始地址高8位] [低8位] [寄存器个数高8位] [低8位] [第一个寄存器数据高][第一个寄存器数据低][第二个寄存器数据高][第二个寄存器数据低]……[CRC校验的低8位] [CRC校验的高8位] 命令响应:功能码[0x10],寄存器起始地址高字节,低字节,要写的寄存器数量的高字节,低字节,CRC校验低字节,高字节 在程序中,首先要获取寄存器个数 num = Modbus_recevie_buf[6] - 2; 然后进入循环,一次把寄存器数据提取出来for(i = 0; i < num; i = i + 2) 在循环的内部提取数据temp = (((unsigned int)(Modbus_recevie_buf[i+7])<8)|(Modbus_recevie_buf[i+8])); 以上就是我在项目中涉及到的一点modbus的通讯的下位机程序,不全,但总体的思路,接收数据并解析,解析后提取数据在设备上加载或采集,然后再按照响应的方式发送回去。 下回改进的方向,1,增加功能码2,增加宏定义及编译定义,3增加单片主机的程序,和pc主从机的程序。4,增加ascii的程序,和rtu同时设置。Pc机程序,采用c#号编写。 完整的程序请参考:http://www.51hei.com/bbs/dpj-23230-1.html
Modbus协议完全资料程序解 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)