本帖最后由 cdebyte 于 2022-7-22 15:29 编辑
Modbus通讯协议详解 Modbus RTU通讯协议在数据通讯上采用主从应答的方式进行。只能由主机(PC,HMI等)通过唯一从机地址发起请求,从机(终端设备)根据主机请求进行响应,即半双工通讯。该协议只允许主机发起请求,从机进行被动响应,因此从机不会主动占用通讯线路造成数据冲突。 类似 Modbus RTU协议的主从应答协议还有西门子的PPI、电表常用的DL/T645-2007等协议。 一、modbus协议格式信息传输为异步方式,使用16进制进行通讯,信息帧格式:
地址码地址码是每个通讯信息帧的第一个字节,一般支持1到247,部分设备也支持0地址,用于接收主机的广播数据,每个从机在总线上地址必须唯一,只有与主机发送的地址码相符的从机才能响应返回数据。 功能码功能码是每个通讯信息帧的第二个字节。主机发送,通过功能码告知从机设备应当执行何种操作。 常见的八种功能码:
数据区数据区随功能码以及数据方向的不同而不同,这些数据可以是“寄存器首地址+读取寄存器数量”、“寄存器地址+操作数据”、“寄存器首地址+操作寄存数量+数据长度+数据”等不同的组合,在“功能码分析”详解不同功能码的数据区。 Modbus CRC校验Modbus RTU协议常用与工业现场对数据传输的稳定性和正确性有较高的要求,因此通过CRC校验保证数据传输的正确性和完整性。 二、错误反馈地址与CRC校验错误并不会收到从机的数据反馈,其他错误将向主机返回错误码。数据帧的第二位加上0X80表示请求发生错误(非法功能码、非法数据值等),错误数据帧如下: 常见错误码如下:
三、通讯信息传输过程通讯命令由主机发送从机时,与主机发送的地址码相符的从机接收通讯命令,如果CRC校验无误,则执行相应的操作,然后把执行结果(数据)返回给主机。返回信息中包含地址码、功能码、执行后的数据以及CRC校验码。如果地址不匹配或者CRC校验出错就不返回任何信息。 四、功能码分析功能码01H:读线圈例如:主机要读取从机地址为01H,起始线圈地址为00H的1个线圈状态,主机发送:
如果从机寄存器00H线圈闭合,从机返回: 仿真演示: 功能码0FH:写多个线圈例如:主机要控制从机地址为01H,起始线圈地址为00H的4个线圈状态,主机发送:
功能码0FH操作,从机返回:
仿真演示: 功能码02H:读离散输入例如:主机要读取从机地址为01H,起始离散量地址为00H的4个输入状态,主机发送:
如果从机首地址00H开始的4离散输入全部检测到输入,从机返回:
仿真演示: 功能码04H:读取输入寄存器例如:主机要读取从机地址为01H,起始寄存器地址为02H的1个输入寄存器数据,主机发送:
如果从机输入寄存器02H的数据为3344H,从机返回:
仿真演示: 功能码03H:读保持寄存器例如:主机要读取从机地址为01H,起始寄存器地址为05H的2个保持寄存器数据,主机发送:
如果从机保持寄存器05H、06H的数据为1122H、3344H,从机返回:
仿真演示: 功能码06H:写单个保持寄存器例如:主机写入9988H的数据给从机地址为01H,寄存器地址为0050H的寄存器,主机发送: 从机返回与主机请求相同; 功能码10H:写多个保持寄存器例如:主机要把数据0005H、2233H保存到从机地址为01H,起始寄存器地址为0020H的2个寄存器中,主机发送:
功能码10H操作,从机返回:
仿真演示: https://www.ebyte.com/new-view-info.html?id=1916
|