ModbusTCP报文格式详解
2023-03-01 17:37阅读:
(这次写MODBUS-TCP协议,主要点是报文,困扰很久了,现在有点明白,记录一下)
1.
什么是Modbus协议
Modbus协议是一种广泛应用于工业控制领域的通讯协议,按照格式可以分为MODBUS-RTU、MODBUS-ASCII和MODBUS-TCP,前面两种适合用于串行通信(例如RS485、RS232等),最后一种适合用于以太网TCP/IP通信的控制网络中。
通过此协议,上位机、控制器和其他设备之间进行通信。
Modbus协议使用的是主从通讯技术,即主设备(Master)主动查询和操作从设备(Slave)。例如:主设备(工业控制器),从设备(PLC控制器)等
通讯过程大致如下:
主设备向从设备发送请求
从设备分析并处理主设备的请求,向主设备发送结果
如果出现错误,从设备返回异常功能码
2.
Modbus协议格式
MODBUS-RTU报文格式(用于串口通讯,例如RS
485、
RS232等)
MODBUS-TCP报文格式(用于以太网通讯)
注:报文头的说明
MODBUS官网
3.
MODBUS部分常用功能码
西门子通讯官网
寄存器地址说明
寄存器信息地址(
PLC地址)
寄存器信息地址:存放于控制器中的地址,这些地址可以是
PLC、触摸屏或者文本显示器。比如
40001/30002等,一般用十进制表示。
寄存器寻址地址(协议地址)
寄存器寻址地址:通信时使用的寄存器地址。比如
0x0000、
0x0001等,一般用十六进制表示。
寄存器信息地址和寻址对应关系:例如寄存器信息地址
40001对应寻址地址
0x0000,
40002对应
0x0002,
30002对应
0x0002等
4
.
MODBUS-RTU协议
这次没用到暂且不写了,可以查询别的博主文章
5.
MODBUS-TCP协议详解(参考
MODBUS官方网站,我只写了这次用到的功能码
01 03 15 16)
a.
读取输出线圈(功能码:01,读取数字量输出位开关状态)
发送报文格式如下:
报文含义:读取
0xff从站输出线圈,地址从
0x0000,共
0x0008个线圈的状态值。
00
00:
寄存器起始地址,从哪里开始读 0x0000 = X1开始读
00
08:
要读多少路,十六进制0x0008 =
十进制8,读取8路
返回报文格式如下:
例子
1:
报文含义:返回服务器
0xff从站输出线圈,返回
0x01个字节,线圈状态为
0x01。
01:
数据长度(按照位读取,一个字节是八位,所以这数据长度为1)
01:
返回数据,十六进制0x01(换算成二进制0000
0001对应X7 X6 X5 X4 X3
X2 X1
X0,X0=1)
例子2 :

报文含义:返回服务器
0xff从站输出线圈,返回
0x01个字节,线圈状态为
0x81。
01:
数据长度
81:
返回数据,十六进制0x81,换算成二进制1000
0001,X0=1,X7=1
b.
读取保持寄存器(功能码:03,读寄存器多个字)
发送报文格式如下:
报文含义:读取
0xff从站保持寄存器,起始地址
0x0113,寄存器数量
0x000E。
01 13:
寄存器起始地址(十六进制0x0113,十进制为275,对应PLC地址VD550)
00
0E:
要读取的寄存器数(十六进制0x000E,十进制为14)
实际含义:
从地址VD550开始读,读取14个寄存器,读到VD574(一个VDXX,占两个寄存器,4个字节)
返回报告格式如下:

报文含义:返回服务器
0xff从站保持寄存器,返回
0x1C个字节,寄存器具体数据。
1C
:
读到的字节数(十六进制0x1C,十进制28,读14个寄存器,返回28个字节)
00 01 XX
XX:
读到的数据,(PLC寄存器地址VD550对应的数据,4个字节,如果是VW550,就是2个字节。不具体解释了,可以看PLC数据类型划分)
XX XX XX XX :
后面还应该有24个字节,对应VD554-VD572,就不具体写了。
c.
写多个线圈(功能码:15(十进制0F),写数字量输出位开关状态)
发送报文格式如下:

报文含义:预置
0xff从站输出线圈,起始地址
0x0000,线圈数
0x0008,字节数
0x01,预置内容
0x20(十进制
0x20,换算成二进制
0010
0000,
X5=1)
返回报文格式如下:

报文含义:在原报文基础上除去字节数和字节返回。
d.
写多个寄存器(功能码:16(十进制10),写寄存器多个字)
发送报文格式如下:

报文含义:预置
0xff从站寄存器的值,起始地址
0x0038,寄存器数
0x0002,字节数
0x04,预置内容
0x00000000(字节数为
4,写入的内容也要为
4个字节)
00
38:
寄存器起始地址(十六进制0x0038,十进制为56,对应PLC地址VD112)
00 00 00 00
:
写入的数据
返回报文格式如下:

报文含义:在原报文基础上除去字节数和字节返回。
e.
还有其他功能码,目前没用到,暂且不写了。