Modbus_RTU_TCP协议解析.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Modbus_RTU_TCP协议解析.pdf

天津易博达动力科技有限公司 内部资料 注意保密 Modbus RTU/TCP 协议解析 Modbus 通信协议由 Modicon 公司(现已经为施耐德公司并购,成为其旗下的子品牌) 于1979 年发明的,是全球最早用于工业现场的总线规约。由于其免费公开发行,使用该协 议的厂家无需缴纳任何费用,Modbus 通信协议采用的是主从通信模式(即Master/Slave 通 信模式),其在分散控制方面应用极其广泛,从而使得 Modbus 协议在全球得到了广泛的应 用。 Modbus 通信协议具有多个变种,其具有支持串口(主要是 RS-485 总线),以太网多个 版本,其中最著名的是Modbus RTU,Modbus ASCII 和Modbus TCP 三种。其中Modbus RTU 与 Modbus ASCII 均为支持RS-485 总线的通信协议,其中Modbus RTU 由于其采用二进制表现形 式以及紧凑数据结构,通信效率较高,应用比较广泛。而Modbus ASCII 由于采用ASCII 码传 输,并且利用特殊字符作为其字节的开始与结束标识,其传输效率要远远低于Modbus RTU 协议,一般只有在通信数据量较小的情况下才考虑使用 Modbus ASCII 通信协议,在工业现 场一般都是采用Modbus RTU 协议,一般而言,大家说的基于串口通信的Modbus 通信协议 都是指Modbus RTU 通信协议。 在此我们着重讨论 Modbus RTU 协议,而 Modbus TCP 协议则是在 RTU 协议上加一个 MBAP 报文头,由于TCP 是基于可靠连接的服务,RTU 协议中的CRC 校验码就不再需要,所 以在Modbus TCP 协议中是没有CRC 校验码,用一句比较通俗的话说就是:Modbus TCP 协议 就是Modbus RTU 协议在前面加上五个0 以及一个6,然后去掉两个CRC 校验码字节就OK. 虽然这句话说得不是特别准确,但是也基本上把RTU 与TCP 之间的区别说得比较清楚了。 RTU 协议中的指令由地址码(一个字节),功能码(一个字节),起始地址(两个字节),数据 (N 个字节),校验码(两个字节)五个部分组成,其中数据又由数据长度(两个字节,表 示的是寄存器个数,假定内容为M)和数据正文(M 乘以2 个字节)组成,而RTU 协议是 采用3.5 个字节的空闲时间作为指令的起始和结束,一般而言,只有当从机返回数据或者主 机写操作的时候,才会有数据正文,而其他时候比如主机读操作指令的时候,没有数据正文, 只需要数据长度即可。(本章的讨论只涉及寄存器的读写,其他比如线圈的读写指令我们暂 时不涉及)。在此我们通过两个指令(0x03H :读多个寄存器指令以及0x10H:写多个寄存器指 令)来解释Modbus RTU 协议。在此我们使用的RTU 设备是ND-1084 型485 总线I/O 模块采 用 RS-485 总线通信,支持四路开关量输出以及八路开关量输入,我们只讲述读取开关量输 出的状态以及通过写指令控制开关量的输出。其中储存开关量输出状态的四个寄存器分别: 天津易博达动力科技有限公司 内部资料 注意保密 0x18E,0x18F,0x190,0x191 。在此我们假设模块的地址为默认的0x01,当我们要去读取开关量 输出对应的四个寄存器的状态的时候,我们下发的十六进制的指令为: “01 03 01 8E 00 04 25 DE”,其中“01 ”为模块的地址码,“03 ”为功能码,即表示读寄存器,“01 8E ”为寄存器地 址,即从该寄存器地址开始读取数据,“00 04 ”则表示读取4 个寄存器,而“25 DE”则为前 面“01 03 01 8E 00 04 ”的CRC 校验码,该数值通过CRC16 校验算法计算出来的,我们会在 其他文章中阐述。该指令的完整解读就是,在地址码为“01 ”的模块中,从“01 8E ”寄存器 开始,读取4 个寄存器的数据返回至主机。在此,我们可以看到,读取指令中并没有什么数 据正文,因为它只是读取相应数量的寄存器,并不需要数据正文,而写操作指令则相反,我 们会在后面讲到。 模块返回的指令是:“01 03 08 00 01 00 01 00 01 00 01 28 D7 ”,返回的指令内容解读就 是:“01 ”

文档评论(0)

ziyouzizai + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档