二、报文分析
简单分析一条Modbus-RTU报文,例如:01 06 00 01 00 17 98 04
01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验
这一串数据的意思是:把数据 0x0017(十进制23) 写入 1号从机地址 0x0001数据地址。
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。
98 04是它前面的数据(01 06 00 01 00 17)通过一算法(见附录2)计算出来的结果,其实就像是计算累加和那样(就是010600010017加起来的值,它的算法就是加法运算)
1、主机对从机写操作
如果单片机接收到一个报文那么就对报文进行解析执行相应的处理,如上面报文:
01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验 假如本机地址是 1 ,那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是: HoldDataReg[1] = 0x0017; Modbus主机就完成了一次对从机数据的写操作,实现了通讯。 2、主机对从机读操作
主机进行读HoldDataReg[1] 操作,则报文是:
01 03 00 01 00 01 D5 CA
从机地址 功能号 数据地址 读取数据个数 CRC校验
那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的:
返回内容:
01 03 02 0017 F8 4A
从机地址 功能号 数据字节个数 两个字节数据 CRC校验
Modbus主机就完成了一次对从机数据的读操作,实现了通讯。 三、Modbus报文模型 以上了解到了Modbus的一帧报文是如何通讯的,其实每个报文的格式都基本一样的。
入门篇,不冗长,很好理解!(转自中国工控网)” style=”margin:0px; padding:0px; border:0px; list-style:none”>ADU: 应用数据单元 PDU: 协议数据单元 四、Modbus数据模型
入门篇,不冗长,很好理解!(转自中国工控网)” style=”margin:0px; padding:0px; border:0px; list-style:none”> 入门篇,不冗长,很好理解!(转自中国工控网)” style=”margin:0px; padding:0px; border:0px; list-style:none”>五、Modbus事务处理
下列状态图描述了在服务器侧Modbus事务处理的一般处理过程。
入门篇,不冗长,很好理解!(转自中国工控网)” style=”margin:0px; padding:0px; border:0px; list-style:none”>六、Modbus请求与响应
看Modbus协议手册,中文第 10 页开始,英文第 24 页开始。手册非常详细举例说明了Modbus协议各个功能号的请求与响应。
Modbus任务处理函数(在单片机上实现过程)
入门篇,不冗长,很好理解!(转自中国工控网)” style=”margin:0px; padding:0px; border:0px; list-style:none”>函数中,RcvBuf 为串口接收缓冲区,如果接收了一个报文则,RcvBuf[0] 为从机地址,RcvBuf[0] 为MODBUS功能号。根据功能号做出响应,而具体的操作根据功能号在各自的函数中执行,相当于解析接收到的数据。 附录1:Modbus-RTU功能码 最常用功能码: 下面“线圈”“寄存器”其实分别直的就是“位变量”“16位变量” 01 (0x01) 读线圈 02 (0x02) 读离散量输入 03 (0x03) 读保持寄存器 04(0x04) 读输入寄存器 05 (0x05) 写单个线圈 06 (0x06) 写单个寄存器 15 (0x0F) 写多个线圈 16 (0x10) 写多个寄存器
入门篇,不冗长,很好理解!(转自中国工控网)” style=”margin:0px; padding:0px; border:0px; list-style:none”>
附录2:CRC Generation
入门篇,不冗长,很好理解!(转自中国工控网)” style=”margin:0px; padding:0px; border:0px; list-style:none; max-width:100%”> 转自: http://blog.csdn.net/doyoung1/article/details/49804311 http://bbs.gkong.com/archive.aspx?id=340353
这两篇都是一样的