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) + 数据(两个数据为一组代表一个寄存器) + 校验码