1.Modbus介绍
串行通信协议,支持rs232,rs485,以太网等。主-从方式通信,格式分为Modbus-RTU(二进制)、Modbus-ASCII(字符)、Modbus-TCP(tcp/ip)三种。此项目使用Modbus RTU方式传输数据。RT-Thread Nano + FreeModebusV1.6
缩写:
ADU(Application Data Unit):应用数据单元
PDU(Protocol Data Unit ):协议数据单元
1.1 协议格式
ADU:设备地址+功能码+数据+校验码,最大数据长度为 256bytes
PDU:功能码+数据,最大数据长度为 256-1-2=253bytes
设备地址:1byte,范围为0-255,其中设0为广播地址,因此理论一个主机上最多可以挂载255个从机
功能码:1byte,根据寄存器不同,适用的功能码也不同
数据:252bytes,根据功能码不同,数据结构也不同
校验码:2bytes,CRC,计算域为:设备地址+PDU
1.2 寄存器说明
寄存器种类 | 读写状态 | 操作位数 | 适用功能码 |
---|---|---|---|
线圈寄存器 | 读/写 | 1bit | 01H(读); 05H(写单个位); 0FH(写多个位) |
离散输入寄存器 | 只读 | 1bit | 02H |
保持寄存器 | 读/写 | 16bit | 03H(读); 06H(写单个字节); 10H(写多个字节) |
输入寄存器 | 只读 | 16bit | 04H |
1.3 数据帧格式
本项目只使用 保持寄存器 和 输入寄存器
1.3.1 保持寄存器操作(03H、06H、10H)
-
读操作 03H:
FreeModebus中接口:eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut )
主机发送数据帧格式:从机地址 + 功能码 (03H) + 起始寄存器地址 + 寄存器数量 + 校验码
从机应答数据帧格式:本机地址 + 功能码 (03H) + 数据长度(寄存器数量*2) + 数据(两个数据为一组代表一个寄存器) + 校验码
-
单个写操作 06H:
FreeModebus中接口:eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut )
主机发送数据帧格式:从机地址 + 功能码 (06H) + 寄存器地址 + 数据(2bytes) + 校验码
从机应答数据帧格式:从机地址 + 功能码 (06H) + 寄存器地址 + 数据(2bytes) + 校验码
-
多个写操作 10H:
FreeModebus中接口:eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, USHORT * pusDataBuffer, LONG lTimeOut )
主机发送数据帧格式:从机地址 + 功能码 (10H) + 起始寄存器地址 + 寄存器数量 + 数据长度(2*寄存器数量) + 数据 + 校验码
从机应答数据帧格式:本机地址 + 功能码 (10H) + 起始寄存器地址 + 寄存器数量 + 校验码
1.3.2 输入寄存器操作(04H)
-
读操作 04H:
FreeModebus中接口:eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut )
主机发送数据帧格式:从机地址 + 功能码 (04H) + 起始寄存器地址 + 寄存器数量 + 校验码
从机应答数据帧格式:本机地址 + 功能码 (04H) + 数据长度(寄存器数量*2) + 数据(两个数据为一组代表一个寄存器) + 校验码