网络上的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: 写单个线圈寄存器---------- 写输出模拟量通道sd(未测试)
0x06: 写单个保持寄存器---------- 单个写d
0x0f: 写多个线圈寄存器---------- 批量写输出模拟量通道sd(未测试)
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
0x06 单个写d
发送:站号1字节-0x01,功能码1字节-0x06,起始地址2字节-0x00 0x07,数据2字节-0x0a 0xa0,crc2字节
返回:同发送
解释:请求写d7模拟量状态,响应相同报文,写入 0x0a 0xa0
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个模拟量状态,响应修改的变量总数2。
其他:
crc16校验-nodejs https://blog.csdn.net/yaojinj...
功能码及错误码 https://www.cnblogs.com/fishp...