likes
comments
collection
share

Modbus的报文格式(plc)

作者站长头像
站长
· 阅读数 27

网络上的modbus说明都是 读保持寄存器 之类很难懂的词汇,在这里做个简化说明的笔记。modbus详细功能码及错误码参考 【其他】 部分的链接

plc 的寄存器分类:

开关量通道,用x、y表示,寄存器序号8进制计数,x0-x7,x10-x15为输入,只读。y0-y7,y10-y15为输出。内存变量记为m,寄存器序号十进制,比如m19。单变量长度为1位

模拟量通道,sd表示。内存模拟量记为d,寄存器序号十进制。单变量长度为2字节

常用功能码

0x01: 读线圈寄存器---------- 批量读y
0x02: 读离散输入寄存器----------  批量读x
0x03: 读保持寄存器---------- 批量读d
0x04: 读输入寄存器---------- 读输入模拟量通道sd(未测试)
0x05: 写单个线圈寄存器----------  单个写y
0x06: 写单个保持寄存器----------  单个写d
0x0f:  写多个线圈寄存器----------  批量写y
0x10: 写多个保持寄存器---------- 批量写d

详解:

0x01 批量读y

发送:站号1字节-0x01,功能码1字节-0x01,起始地址2字节-0x00 0x00,数据长度2字节-0x00 0x10,crc2字节

返回:站号1字节-0x01,功能码1字节-0x01,数据字节计数1字节-0x02,数据2字节-0x20 0x00,crc2字节解释:请求读y0起16个开关量状态,响应0x20 0x00,即y7-y0状态为0010 0000,y17-y10状态为0000 0000,只有y5是1(根据设备大小端不同注意顺序)

0x02 批量读x同0x01

0x03 批量读d发送:站号1字节-0x01,功能码1字节-0x03,起始地址2字节-0x00 0x00,数据长度2字节-0x00 0x02,crc2字节

返回:站号1字节-0x01,功能码1字节-0x03,数据字节计数1字节-0x04,数据4字节-0x06 0xa4 0x0a 0x8c,crc2字节

解释:请求读d0起2个模拟量状态,响应0x06 0xa4 0x0a 0x8c,即d1为0x06 0xa4=1700,d2为2700

0x05 单个写y发送:站号1字节-0x01,功能码1字节-0x05,起始地址2字节-0x00 0x00,数据2字节-0xff 0x00,crc2字节返回:同发送解释:y0置为1.置0时,数据发送0x0000

0x06 单个写d发送:站号1字节-0x01,功能码1字节-0x06,起始地址2字节-0x00 0x07,数据2字节-0x0a 0xa0,crc2字节

返回:同发送解释:请求写d7模拟量状态,响应相同报文,写入 0x0a 0xa0

0x0f 批量写y发送:站号1字节-0x01,功能码1字节-0x0f,起始地址2字节-0x00 0x01,数据长度2字节-0x00 0x01,数据字节数1字节-0x01,数据1字节-0x02,crc2字节

返回:站号1字节-0x01,功能码1字节-0x0f,起始地址2字节-0x00 0x01,数据长度2字节-0x00 0x01,crc2字节解释:从y1起,写入一字节,0000 0001对应变量 y10-y1(8进制)。与功能码0x10不同,长度单位为1字节,0x10为2字节,1个模拟量

0x10 批量写d发送:站号1字节-0x01,功能码1字节-0x10,起始地址2字节-0x00 0x07,数据长度2字节-0x00 0x02,数据字节数1字节-0x04,数据4字节-0xab 0xcd 0x98 0x76,crc2字节

返回:站号1字节-0x01,功能码1字节-0x10,起始地址2字节-0x00 0x07,操作数据长度2字节-0x00 0x02,crc2字节解释:从d7起,写入2个数据,d7为0xabcd,d8为0x9876,响应修改的变量总数2。

其他:

crc16校验-nodejs https://blog.csdn.net/yaojinj...

功能码及错误码 https://www.cnblogs.com/fishp...