新浪博客

ModbusTCP报文格式详解

2023-03-01 17:37阅读:
(这次写MODBUS-TCP协议,主要点是报文,困扰很久了,现在有点明白,记录一下)
1. 什么是Modbus协议
Modbus协议是一种广泛应用于工业控制领域的通讯协议,按照格式可以分为MODBUS-RTUMODBUS-ASCIIMODBUS-TCP,前面两种适合用于串行通信(例如RS485RS232等),最后一种适合用于以太网TCP/IP通信的控制网络中。
通过此协议,上位机、控制器和其他设备之间进行通信。
Modbus协议使用的是主从通讯技术,即主设备(Master)主动查询和操作从设备(Slave)。例如:主设备(工业控制器),从设备(PLC控制器)等
通讯过程大致如下:
主设备向从设备发送请求
从设备分析并处理主设备的请求,向主设备发送结果
如果出现错误,从设备返回异常功能码
2. Modbus协议格式
MODBUS-RTU报文格式(用于串口通讯,例如RS
485、RS232等)
ModbusTCP报文格式详解
MODBUS-TCP报文格式(用于以太网通讯)
ModbusTCP报文格式详解
注:报文头的说明

ModbusTCP报文格式详解MODBUS官网
3. MODBUS部分常用功能码
ModbusTCP报文格式详解西门子通讯官网
寄存器地址说明
寄存器信息地址(PLC地址)
寄存器信息地址:存放于控制器中的地址,这些地址可以是PLC、触摸屏或者文本显示器。比如40001/30002等,一般用十进制表示。
寄存器寻址地址(协议地址)
寄存器寻址地址:通信时使用的寄存器地址。比如0x00000x0001等,一般用十六进制表示。
寄存器信息地址和寻址对应关系:例如寄存器信息地址40001对应寻址地址0x000040002对应0x000230002对应0x0002
4. MODBUS-RTU协议
这次没用到暂且不写了,可以查询别的博主文章
5. MODBUS-TCP协议详解(参考MODBUS官方网站,我只写了这次用到的功能码 01 03 15 16
a. 读取输出线圈(功能码:01,读取数字量输出位开关状态)
发送报文格式如下:


ModbusTCP报文格式详解
报文含义:读取0xff从站输出线圈,地址从0x0000,共0x0008个线圈的状态值。
00 00寄存器起始地址,从哪里开始读 0x0000 = X1开始读
00 08要读多少路,十六进制0x0008 = 十进制8,读取8
返回报文格式如下:
例子1
ModbusTCP报文格式详解
报文含义:返回服务器0xff从站输出线圈,返回0x01个字节,线圈状态为0x01
01数据长度(按照位读取,一个字节是八位,所以这数据长度为1)
01返回数据,十六进制0x01(换算成二进制0000 0001对应X7 X6 X5 X4 X3
X2 X1 X0X0=1
例子2 :
ModbusTCP报文格式详解
报文含义:返回服务器0xff从站输出线圈,返回0x01个字节,线圈状态为0x81
01数据长度
81返回数据,十六进制0x81,换算成二进制1000 0001X0=1X7=1

b. 读取保持寄存器(功能码:03,读寄存器多个字)
发送报文格式如下:
ModbusTCP报文格式详解
报文含义:读取0xff从站保持寄存器,起始地址0x0113,寄存器数量0x000E
01 13寄存器起始地址(十六进制0x0113,十进制为275,对应PLC地址VD550
00 0E要读取的寄存器数(十六进制0x000E,十进制为14
实际含义: 从地址VD550开始读,读取14个寄存器,读到VD574(一个VDXX,占两个寄存器,4个字节)
返回报告格式如下:
ModbusTCP报文格式详解
报文含义:返回服务器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),写数字量输出位开关状态)
发送报文格式如下:
ModbusTCP报文格式详解
报文含义:预置0xff从站输出线圈,起始地址0x0000,线圈数 0x0008,字节数0x01,预置内容0x20(十进制0x20,换算成二进制0010 0000X5=1
返回报文格式如下:
ModbusTCP报文格式详解
报文含义:在原报文基础上除去字节数和字节返回。

d. 写多个寄存器(功能码:16(十进制10),写寄存器多个字)
发送报文格式如下:
ModbusTCP报文格式详解
报文含义:预置0xff从站寄存器的值,起始地址0x0038,寄存器数0x0002,字节数0x04,预置内容0x00000000(字节数为4,写入的内容也要为4个字节)
00 38寄存器起始地址(十六进制0x0038,十进制为56,对应PLC地址VD112
00 00 00 00 写入的数据
返回报文格式如下:
ModbusTCP报文格式详解
报文含义:在原报文基础上除去字节数和字节返回。
e. 还有其他功能码,目前没用到,暂且不写了。

我的更多文章

下载客户端阅读体验更佳

APP专享