在之前的文章中,我们介绍了Modbus RTU协议的内容和实现方法。最近在进行网络通讯的时候又用到了Modbus TCP协议,因此这里把自己对Modbus TCP的了解总结一下。
文章目录
- 一、Modbus TCP协议解析
- Modbus TCP和Modbus RTU的区别
- Modbus TCP协议的构成
- Modbus TCP的报文头
- Modbus TCP的功能码
- Modbus TCP的数据码
- 二、持续更新:Modbus TCP实现各种功能码的示例
- 1.功能码 05 (0x05)
一、Modbus TCP协议解析
Modbus TCP和Modbus RTU的区别
这两个都是Modbus协议,但是两者之间有有何区别呢?在我看来,Modbus TCP协议是一个运行在TCP/IP网络连接中的一种协议,而Modbus RTU则是运行在工业控制领域的一种协议,就传递数据的功能来说,两者都能实现。就传递数据的路径来说,Modbus TCP可能更多的是在网络环境下的数据传输。就传递的数据的格式来说,二者存在着一定的区别,但是又有相同的地方。下面我们通过具体的例子,来说明。
Modbus TCP协议的构成
Modbus TCP的协议构成可以分为 报文头 功能码 数据码 (校验码)这几个部分,这里校验码在一般的Modbus TCP中是没有的。对比Modbus RTU,我们可以看到这两个协议的组成基本上是一样的。
Modbus TCP的报文头
Modbus TCP的报文头一般来说又分为以下几个码:
名称 | 长度 | 示例 | 备注 |
事务处理标识符 | 2个字节 | 97 79 | 客户机发起,服务器复制,用于事务处理配对,可以自行设定 |
协议标识符 | 2个字节 | 00 00 | 客户机发起,服务器复制,表示该协议是TCP协议,是固定值,不可以更改 |
长度标识符 | 2个字节 | 00 06 | 表示该数据帧中,从本子节到最后一个字节的字节个数,根据当前数据帧的情况设定 |
单元标识符 | 1个字节 | 03 | 客户机发起,服务器复制,这是一个站点号,在多设备通讯时,用来表示该数据的来源于哪个设备或者该数据要去往哪个设备 |
Modbus TCP的功能码
除了Modbus的构成基本相似,其中的功能码、数据码两部分也是采用通用的格式,例如3为读寄存器功能码,16为写寄存器功能码等等。这里对功能码和数据码不做深入的展开。
名称 | 长度 | 示例 | 备注 |
功能码 | 1个字节 | 05 | 功能码根据Modbus通用功能码的定义进行设定,这里05表示对线圈进行写操作 |
Modbus TCP的数据码
这里数据码也是同Modbus RTU协议一样,不同的功能码后面的数据码是不同的。这里具体什么样的功能码对应什么样的数据码,请自行查阅资料。这里只是简单的举几个例子。
名称 | 长度 | 示例 | 备注 |
线圈地址 | 2个字节 | 00 10 | 表示对地址为17的线圈进行操作 |
操作命令 | 2个字节 | FF 00 | FF 00 表示将该线圈置1,00 00 表示将该线圈置0 |
二、持续更新:Modbus TCP实现各种功能码的示例
1.功能码 05 (0x05)
功能码0x05表示写指令线圈,也就是控制某线圈通断。代码的构成如下:
结构 | 名称 | 长度 | 示例 | 备注 |
报文头 | ||||
事务处理标识符 | 2个字节 | 97 79 | 客户机发起,服务器复制,用于事务处理配对,可以自行设定 | |
协议标识符 | 2个字节 | 00 00 | 客户机发起,服务器复制,表示该协议是TCP协议,是固定值,不可以更改 | |
长度标识符 | 2个字节 | 00 06 | 表示该数据帧中,从本子节到最后一个字节的字节个数,根据当前数据帧的情况设定 | |
单元标识符 | 1个字节 | 03 | 客户机发起,服务器复制,这是一个站点号,在多设备通讯时,用来表示该数据的来源于哪个设备或者该数据要去往哪个设备 | |
功能码 | 功能码 | 1个字节 | 05 | 05表示对线圈进行写操作 |
数据码 | ||||
线圈地址 | 2个字节 | 00 10 | 表示对地址为17的线圈进行操作 | |
操作命令 | 2个字节 | FF 00 | FF 00 表示将该线圈置1,00 00 表示将该线圈置0 |
发送:97 79 00 00 00 06 03 05 00 10 FF 00
收到:97 79 00 00 00 06 03 05 00 10 FF 00
因为这里不需要主机返回数据,因此主机将收到的指令复制一下直接发送回来表示接受正常。