ModBus RTU 协议
通讯信息传输过程:
当通讯命令由发送设备(主机)发送至接收设备(从机)时,符合相应地址码的从机接收通讯命令,并根据功能码及相关要求读取信息,如果CRC校验无误,则执行相应的任务,然后把执行结果(数据)返送给主机。
返回的信息中包括地址码、功能码、执行后的数据以及CRC校验码。
如果CRC校验出错就不返回任何信息。
1.1 地址码:
地址码是每次通讯信息帧的第一字节(8位),从0到255。
这个字节表明由用户设置地址的从机将接收由主机发送来的信息。
每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。
当从机回送信息时,回送数据均以各自的地址码开始。
主机发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。
相应的地址码表明该信息来自于何处。
1.2功能码:
是每次通讯信息帧传送的第二个字节。
ModBus通讯规约可定义的功能码为1到 127。
PDM系列仪表/变送器仅用到其中的一部分功能码。
作为主机请求发送,通过功能码告诉从机应执行什么动作。
作为从机响应,从机返回的功能码与从主机发送来的功能码一样,并表明从机已响应主机并且已进行相关的操作。
1.3 数据区:
数据区包括需要由从机返送何种信息或执行什么动作。
这些信息可以是数据(如:开关量输入/输出、模拟量输入/输出、寄存器等等)、参考地址等。
例如,主机通过功能码03告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。
对于不同的从机,地址和数据信息都不相同(应给出通讯信息表)。
功能码“01”:
读1路或多路开关量输出状态 例如:主机要读取地址为01,开关量DO1,DO2的输出状态。从机(PDM)数据寄存器的地址和数据为: 起始位地址DO寄存器数据(16进制)备 注 0000 2 DO2输出状态为“1”,DO1输出状态为“0” 主机发送的报文格式:主机发送字节数发送的信息备 注 从机地址11发送至地址为01的从机 功能码11读开关量输出状态起始BIT位20000起始BIT位地址为0000 读数据长度20002读取2路继电器输出状态位 CRC码 2 BDCB 由主机计算得到CRC码 从机(PDM)响应返回的报文格式:从机响应字节数返回的信息备 注 从机地址101来自从机01 功能码101读开关量输出状态 数据长度1011个字节(8个BIT位) DO状态数据102DO寄存器内容 CRC码 2 D049 由主机计算得到CRC码
功能码“02”:读1路或多路开关量状态输入 例如:主机要读取地址为01,开关量DI1—DI4的输入状态。从机(PDM)数据寄存器的地址和数据为:起始位地址DI寄存器数据(16进制)备 注 0000 0B DI1/DI2/DI4状态为“1”,DI3状态为“0” 主机发送的报文格式:主机发送字节数发送的信息备 注 从机地址101发送至地址为01的从机 功能码102读开关量输入状态起始BIT位20000起始BIT位地址为0000 读数据长度20004读取4路继电器输入状态位 CRC码 2 79C9 由主机计算得到CRC码 从机(PDM)响应返回的报文格式: 从机响应字节数返回的信息备 注 从机地址101来自从机01 功能码102读开关量输入状态 数据长度1011个字节(8个BIT位) DI状态数据10BDI寄存器内容 CRC码 2 E04F 由主机计算得到CRC码
功能码“03”:
读多路寄存器输入 例如:主机要读取地址为01,起始地址为0116的3个从机寄存器数据。从机(PDM)数据寄存器的地址和数据为:寄存器地址寄存器数据(16进制)对应PDM电量 01161784UA01171780UB 0118 178A UC 主机发送的报文格式:主机发送字节数发送的信息备 注 从机地址101发送至地址为01的从机
功能码103读取寄存器 起始地址20116起始地址为0116 读数据长度30003读取3个寄存器(共6个字节) CRC码 2 E5F3 由主机计算得到CRC码 从机(PDM)响应返回的报文格式:从机响应字节数返回的信息备 注 从机地址101来自从机01
功能码103读取寄存器 读取字1063个寄存器共6个字节 寄存器数据121784地址为0116内存的内容 寄存器数据221780地址为0117内存的内容 寄存器数据32178A地址为0118内存的内容 CRC码 2 5847 由从机计算得到CRC码 功能码“05”:写1路开关量输出(“遥控”) 例1:开关量输出点DO1,其当前状态为“分”,主机要控制该路继电器“合”。 控制命令为: “FF00”为控制继电器“合”;“0000”为控制继电器“分”; 主机发送的报文格式:主机发送字节数发送的信息备 注 从机地址101发送至地址为01的从机
功能码105写开关量输出状态输出BIT位20000对应输出继电器BIT位(DO1) 控制命令2FF00控制该路继电器输出为“合”状态位 CRC码 2 8C3A 由主机计算得到CRC码 从机(PDM)响应返回的报文格式: 与主机发送的报文格式及数据内容完全相同。 例2:开关量输出点DO2,其当前状态为“合”,主机要控制该路继电器“分”。主机发送的报文格式:主机发送字节数发送的信息备 注 从机地址101发送至地址为01的从机
功能码105写开关量输出状态输出BIT位20001对应输出继电器BIT位(DO2) 控制命令20000控制该路继电器输出为“合”状态位 CRC码 2 9C0A 由主机计算得到CRC码 从机(PDM)响应返回的报文格式: 与主机发送的报文格式及数据内容完全相同。 功能码“06”:写单路寄存器 例如:主机要把数据07D0,保存到地址为002C的从机寄存器中去(从机地址码为01)。通讯数据保存结束后,地址为002C的PDM表原存储信息为: 地址原来存储数据(16进制) 002C 04B0 主机发送的报文格式: 主机发送字节数发送的信息备 注 从机地址101发送至地址为01的从机
功能码106写单路寄存器起始地址2002C要写入的寄存器地址 写入数据207D0对应的新数据 CRC码 2 4BAF 由主机计算得到CRC码 从机(PDM)响应返回的报文格式: 与主机发送的报文格式及数据内容完全相同。 功能码“10”:写多路寄存器 主机利用这个功能码把多个数据保存到PDM表的数据存储器中去。Modbus通讯规约中的寄存器指的是16位(即2字节),并且高位在前。这样PDM的存储器都是二个字节。由于Modbus通讯规约允许每次最多保存60个寄存器,因此PDM一次也最多允许保存60个数据寄存器。 例如:主机要把0064,0010保存到地址为002C,002D的从机寄存器中去(从机地址码为01)。通讯数据保存结束后,地址为002C/002D的PDM表内存储信息为:地址原来存储数据(16进制) 002C04B0 002D 1388 主机发送的报文格式:主机发送字节数发送的信息备 注 从机地址101发送至地址为01的从机 功能码110写多路寄存器起始地址2002C要写入的寄存器的起始地址 保存数据字长度20002保存数据的字长度(共2字) 保存数据字节长104保存数据的字节长度(共4字节)保存数据1204B0数据地址002C保存数据221388数据地址002D CRC码 2 FC63 由主机计算得到CRC码 从机(PDM)响应返回的报文格式:从机响应字节数返回的信息备 注 从机地址101来自从机01
功能码110写多路寄存器 起始地址2002C起始地址为002C 保存数据字长度20002保存2个字长度的数据 CRC码 2 8001 由从机计算得到CRC码 通讯错误信息及数据的处理: 当PDM表检测到除了CRC码出错以外的错误时,必须向主机回送信息,功能码的最高位置为1,即从机返送给主机的功能码是在主机发送的功能码的基础上加128 。以下的这些代码表明有意外的错误发生。 PDM从主机接收到的信息如有CRC错误,则将被PDM表忽略。
PDM返送的错误码的格式如下(CRC码除外): 地址码: 1字节 功能码: 1字节(最高位为1) 错误码: 1字节 CRC码:2字节。 PDM响应回送如下错误码: 81.非法的功能码。 接收到的功能码PDM表不支持。 82.非法的数据位置。 指定的数据位置超出PDM表的范围。 83.非法的数据值。 接收到主机发送的数据值超出PDM相应地址的数据范围。