Modbus是一个工业上常用的通讯协议,主要用于控制器之间通信或者控制器通过以太网和其他设备(如PC)通信。
1.Modbus是主/从通信协议,主站发送报文,只有与主站发送报文中呼叫地址相同的从站才能向主站发送回答报文。
2.报文以0地址发送为广播报文,无需从站回答。
3.Modbus规定了2种字符传输模式,ASCII模式,RTU(二进制)模式,两种模式不能混用,本文采用RTU模式。
4.传输错误校验(RTU模式采用循环冗余校验),当检验出错时,报文停止处理从机不再继续通信,不对此报文产生回应,主机在一定时间过后未收到从站回答后,即做出“通信错误已发生”的判断。
地址 | 功能码 | 数据 | CRC校验 |
1 byte | 1 byte | N bytes | 2 bytes |
Modbus涉及到的控制器存储区以0xxxx,1xxxx,3xxxx,4xxxx标识。
存储区标识 | 名称 | 类型 | 读/写 | 存储单元地址 |
0xxxx | 输出线圈 | 位 | 读/写 | 00001-0xxxx |
1xxxx | 输入线圈 | 位 | 只读 | 10001-1xxxx |
3xxxx | 输入寄存器 | 字 | 只读 | 30001-3xxxx |
4xxxx | 保持寄存器 | 字 | 读/写 | 40001-4xxxx |
下面介绍几种常见的功能报文:
1.读取输出线圈 功能码0x01
Tx:01 01 00 00 00 0A BC 0D
从站地址(0x01)+功能码(0x01)+起始地址(高位0x00 低位0x00)+线圈数(高位0x00 低位0x0A)+CRC(0xBC 0x0D)
功能:读取1号从站输出线圈00001-00010,共10个线圈状态。
Rx:01 01 02 0F 00 BC 0C
从站地址(0x01)+功能码(0x01)+字节数(0x02)+线圈状态1-8(0x0F)+线圈状态9-10(0x00)+CRC(BC 0C)
功能:返回输出线圈状态,1个字节表示8个线圈状态,尾部不足则充余。
2.读取输入线圈 功能码0x02
除开功能码以及起始地址表示含义,与上相同。
3.读取保持型寄存器 功能码0x03
Tx:01 03 00 00 00 0A C5 CD
从站地址(0x01)+功能码(0x03)+起始地址(高位0x00 低位0x00)+寄存器数量(0x00 0x0A)+CRC(0xC5 0xCD)
功能:读取1号从站保持寄存器40001-40010,共10个字(即20个字节,1个字=2个字节=16位)
Rx:01 03 14 00 37 00 2C 00 21 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 7C CC
从站地址(0x01)+功能码(0x03)+字节数(0x14)+字节状态(00 37 00 2C 00 21 00 0A 00 00 00 00 00 00 00 00 00 00 00 00)+CRC(0x7C 0xCC)
功能:返回保持型寄存器状态
4.强制单线圈 功能码0x05
Tx:01 05 00 03 00 00 3D CA
从站地址(0x01)+功能码(0x05)+线圈地址(高位0x00 低位0x03)+操作数(0x00 0x00)+CRC(0x3D 0xCA)
功能:强制1号从站4号线圈位OFF状态,ON状态操作数即(0xFF 0x00)
Rx:01 05 00 03 00 00 3D CA
原报文返回
5.预置单保持型寄存器 功能码0x06
Tx:01 06 00 10 42 C8 76 69
从站地址(0x01)+功能码(0x06)+寄存器地址(高位0x00 0x10)+数据值(高位0x42 低位0xC8)+CRC(76 69)
功能:预置1号从站40017号寄存器数据
Rx:01 06 00 10 42 C8 76 69
原文返回
6.预置多保持型寄存器 功能码0x10
Tx:01 10 00 00 00 02 04 42 C8 00 00 66 29
从站地址(0x01)+功能码(0x10)+起始地址(0x00 0x00)+寄存器数量(0x00 0x02)+字节数量(0x04)+预置数(0x42 0xC8 0x00 0x00)+CRC(0x66 0x29)
功能:预置1号从站40001-40002号寄存器数据
Rx:01 10 00 00 00 02 41 C8
从站地址(0x01)+功能码(0x10)+起始地址(0x00 0x00)+寄存器数量(0x00 0x02)+CRC(0x41 0xC8)
功能:确认40001-40001预置成功