在之前的文章中,我们介绍了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

因为这里不需要主机返回数据,因此主机将收到的指令复制一下直接发送回来表示接受正常。