Modbus协议是一种应用层的报文传输协议,分为RTU、ASCII、TCP 三种协议
协议:是规定的一种格式。
ModeSub RTU通信协议:
通信其实就是”读取“和”写入“
如果想实现读取功能必须要有存储区。
存储区和存储范围:
存储区 | 存储范围(单元) | |||||
“5位”标准地址 | “6位”扩展地址 | |||||
名称 | 功能码 | 读/写 | 最小范围 | 最大范围 | 最小范围 | 最大范围 |
输出线圈 | 0 | 读/写 | 00001 | 09999 | 000001 | 065536 |
输入线圈 | 1 | 只读 | 10001 | 19999 | 100001 | 165536 |
输出寄存器 | 4 | 只读 | 40001 | 49999 | 400001 | 465536 |
输入寄存器 | 3 | 读/写 | 30001 | 39999 | 300001 | 365536 |
存储区分位:输出线圈、输入线圈、输出寄存器、输入寄存器
线圈最小单位是布尔
寄存器最小单位是16个位,一个寄存器等于16各位
如果做布尔就可以用线圈存储区、如果做数据就可以用寄存器存储区
存储区范围:任何存储区都是有范围的。
存储区范围分为“5位”标准地址、“6位”扩展地址
实例:
地址:Y XXXX Y为功能码 XXXX为范围
对ModBusRTU的“读取”和“写入”操作
读取 | 功能码 | 写入 | 功能码 |
输出线圈 | 01 | 单个输出线圈 | 05 |
输入线圈 | 02 | 单个输出寄存器 | 06 |
输出寄存器 | 03 | 多个输出线圈 | 15(十进制的) |
输入寄存器 | 04 | 多个输出寄存器 | 16(十进制的) |
ModbusRTU/ASCII → 报文格式:从站地址(设备编号)(1 byte) + 功能码(1 byte) + 数据(N byte) + 校验 (2 byte)
对于读取来说: 对于写入来说:
从站地址(设备编号) → 找谁? 从站地址(设备编号) → 找谁?
功能码 → 干嘛 功能码 → 干嘛
数据 → 具体干嘛的细节 数据 → 具体干嘛的细节(多了个写入的具体数值)
效验 → 验证 效验 → 验证
发送读取实例:
站地址 | 读取输出寄存器 | 数据 | 数据 | 数据 | 数据 | 校验 | 校验 |
01 | 03 | 00 | 00 | 00 | 02 | C4 | 0B |
数据反馈实例:
站地址 | 读取输出寄存器 | 字节计数 | 数据 | 数据 | 数据 | 数据 | 校验 | 校验 |
01 | 03 | 04 | 01 | 46 | 02 | 3B | C4 | 0B |