文档介绍:Modbus 通讯协议下表是 Modbus 的功能格式: 1 、读可读写数字量寄存器(线圈状态): 计算机发送命令: [ 设备地址][ 命令号 01] [ 起始寄存器地址高 8位][低8位][ 读取的寄存器数高 8位][低8位] [CRC 校验的低 8位] [CRC 校验的高 8位] 例: [11][01][00][13][00][25][CRC 低][CRC 高] 意义如下: <1> 设备地址: 在一个 485 总线上可以挂接多个设备, 此处的设备地址表示想和哪一个设备通讯。例子中为想和 17号( 十进制的 17 是十六进制的 11) 通讯。<2> 命令号 01 :读取数字量的命令号固定为 01。<3> 起始地址高 8位、低8位: 表示想读取的开关量的起始地址( 起始地址为 0)。比如例子中的起始地址为 19。<4> 寄存器数高 8 位、低 8 位:表示从起始地址开始读多少个开关量。例子中为 37 个开关量。<5>CRC 校验:是从开头一直校验到此之前。在此协议的最后再作介绍。此处需要注意, CRC 校验在命令中的高低字节的顺序和其他的相反。设备响应: [ 设备地址][ 命令号 01] [ 返回的字节个数][ 数据 1][ 数据 2]...[ 数据 n][CRC 校验的低 8位] [CRC 校验的高 8位] 例: [11][01][05][CD][6B][B2][0E][1B][CRC 低][CRC 高] 意义如下: <1> 设备地址和命令号和上面的相同。<2> 返回的字节个数:表示数据的字节个数,也就是数据 1, 2...n 中的 n 的值。<3> 数据 1...n :由于每一个数据是一个 8 位的数,所以每一个数据表示 8 个开关量的值, 每一位为 0 表示对应的开关断开,为1 表示闭合。比如例子中, 表示 20号( 索引号为 19) 开关闭合, 21 号断开, 22 闭合, 23 闭合, 24 断开, 25 断开, 26 闭合, 27 闭合... 如果询问的开关量不是 8 的整倍数,那么最后一个字节的高位部分无意义,置为 0。<4>CRC 校验同上。 2 、读只可读数字量寄存器(输入状态): 和读取线圈状态类似,只是第二个字节的命令号不再是 1 而是 2。 3 、写数字量(线圈状态): 计算机发送命令: [ 设备地址][ 命令号 05] [ 需下置的寄存器地址高 8位][低8位][下置的数据高 8位][低8位] [CRC 校验的低 8位] [CRC 校验的高 8位] 例: [11][05][00][AC][FF][00][CRC 低][CRC 高] 意义如下: <1> 设备地址和上面的相同。<2> 命令号: 写数字量的命令号固定为 05。<3> 需下置的寄存器地址高 8 位,低 8 位:表明了需要下置的开关的地址。<4> 下置的数据高 8位,低8位: 表明需要下置的开关量的状态。例子中为把该开关闭合。注意,此处只可以是[FF][00] 表示闭合[00][00] 表示断开,其他数值非法。<5> 注意此命令一条只能下置一个开关量的状态。设备响应:如果成功把计算机发送的命令原样返回,否则不响应。 4 、读可读写模拟量寄存器(保持寄存器): 计算机发送命令: [ 设备地址][ 命令号 03] [ 起始寄存器地址高 8位][低8位][ 读取的寄存器数高