1、MODBUS手册中文版VERDMODBUS 协议用户手册Ver: D2010-10-20目录1 数据传输模式 42 寄存器和数据类型 52.1 COIL 52.2 FLOAT 52.3 INT 52.4 LONG 53 数据帧格式定义 63.1 CMD=0x03(读1个或多个寄存器) 63.2 CMD=0x05(写COIL变量) 73.3 CMD=0x06(写单个寄存器) 83.3 CMD=0x10(写多个寄存器) 93.4 故障返回帧 104 数据帧校验算法 114.1 LRC校验 114.2 CRC16校验 125 仪表变量地址定义 146 附录1:常数表:故障码 177 附录2:常数表:
2、流量单位 188 附录3:报警定义 23版本声明:Ver: D支持寄存器连读功能仪表的modbus通讯协议设置项处有V10版本标志的均支持此功能2010/10/201 数据传输模式MODBUS采用RTU和ASCII两种方式进行数据传输。RTU模式下,采用8bit二进制字符,ASCII模式下采用7bit ASC字符。将RTU模式下的一个字节的高4位和低4位分开,变成2个字节,这样就是ASCII模式下传输的字节。比如RTU模式下的数据0x1A,那么ASCII模式下就是0x31 0x41两个字节,所以ASCII模式下的帧长度为RTU模式下的1倍。RTU传输模式的数据帧采用CRC校验,ASCII模式采
3、用LRC校验。下表总结了两种传输模式的区别:传输模式ASCII (7 bit)RTU (8 bit)编码格式ASCII码 (0-9 A-F)8bit二进制 (0x00 0xff)起始位数据位校验位停止位17、8无、奇、偶1、218无、奇、偶1、2帧校验LRCCRC162 寄存器和数据类型 下表列举了几种寄存器和数据类型寄存器类型数据长度寄存器数量描述COIL1 bit-布尔变量(ON OFF)FLOAT32 bit232位浮点数(IEEE754格式)INT16 bit1无符号整型(0x0 0xFFFF)LONG32 bit2无符号长整型(0x0 0xFFFFFFFF)2.1 COIL 布尔变量
4、 0xFF00 - ON 0x0000 - OFF2.2 FLOAT 使用2个寄存器存储单精度IEEE754格式的浮点数。 每个浮点数包含4个字节,具体定义如下: SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM S:符号位 0-正 1-负 E:阶码 M:尾数的小数部分 例如:0xC1480000 = -12.52.3 INT 使用1个寄存器存储无符号整型数。 例如:0x0025 = 37 0x1234 = 46602.4 LONG 使用2个寄存器存储无符号长整型数。 例如:0x12345678 = 3054198963 数据帧格式定义3.1 CMD=0x03(读1个或多
5、个寄存器) 本例数据为读取瞬时流量的数据帧,仪表地址=1。注:瞬时流量的寄存器起始地址=0x0253,但数据帧中的寄存器起始地址必须是0x0253-0x0001 = 0x0252 请求帧:上位机-仪表 数据场名称RTU示例数据(HEX)ASC示例数据(HEX)包头NONE3A仪表地址0130 31功能码0330 33寄存器起始地址高字节0230 32寄存器起始地址低字节5235 32寄存器数量高字节0030 30寄存器数量低字节0230 32帧校验64 6241 36包尾NONE0D 0A 应答帧:仪表-上位机数据场名称RTU示例数据(HEX)ASC示例数据(HEX)包头NONE3A仪表地址0
6、130 31功能码0330 33数据长度0430 34寄存器0x0253的数据高字节C143 31寄存器0x0253的数据低字节4834 38寄存器0x0254的数据高字节0030 30寄存器0x0254的数据低字节0030 30帧校验47 D945 46包尾NONE0D 0A 本应答帧返回的IEEE754格式的瞬时流量数据C1 48 00 00 = -12.53.2 CMD=0x05(写COIL变量) 本例数据为清除累计流量的数据帧,仪表地址=1。注:清累计流量的寄存器起始地址=0x0003,但数据帧中的寄存器起始地址必须是0x0003-0x0001 = 0x0002 请求帧:上位机-仪表
7、数据场名称RTU示例数据(HEX)ASC示例数据(HEX)包头NONE3A仪表地址0130 31功能码0530 35寄存器起始地址高字节0030 30寄存器起始地址低字节0230 32COIL变量高字节FF46 46COIL变量低字节0030 30帧校验2D FA46 39包尾NONE0D 0A 应答帧:仪表-上位机 数据场名称RTU示例数据(HEX)ASC示例数据(HEX)包头NONE3A仪表地址0130 31功能码0530 35寄存器起始地址高字节0030 30寄存器起始地址低字节0230 32COIL变量高字节FF46 46COIL变量低字节0030 30帧校验2D FA46 39包尾N
8、ONE0D 0A3.3 CMD=0x06(写单个寄存器) 本例数据为写流量单位=m3/h的数据帧,仪表地址=1。注:流量单位的寄存器起始地址=0x0042,但数据帧中的寄存器起始地址必须是0x0042-0x0001 = 0x0041请求帧:上位机-仪表 数据场名称RTU示例数据(HEX)ASC示例数据(HEX)包头NONE3A仪表地址0130 31功能码0630 36寄存器起始地址高字节0030 30寄存器起始地址低字节4134 31变量高字节0030 30变量低字节1331 33帧校验98 1341 35包尾NONE0D 0A 应答帧:仪表-上位机 数据场名称RTU示例数据(HEX)ASC示
9、例数据(HEX)包头NONE3A仪表地址0130 31功能码0630 36寄存器起始地址高字节0030 30寄存器起始地址低字节4134 31变量高字节0030 30变量低字节1331 33帧校验98 1341 35包尾NONE0D 0A3.3 CMD=0x10(写多个寄存器) 本例数据为写阻尼时间=3s的数据帧,仪表地址=1。注:阻尼时间的寄存器起始地址=0x0189,但数据帧中的寄存器起始地址必须是0x0189-0x0001 = 0x0188请求帧:上位机-仪表 数据场名称RTU示例数据(HEX)ASC示例数据(HEX)包头NONE3A仪表地址0130 31功能码1031 30寄存器起始地
10、址高字节0130 31寄存器起始地址低字节8838 38寄存器数量高字节0030 30寄存器数量低字节0230 32数据长度0430 34写入寄存器0x0189的高字节4034 30写入寄存器0x0189的低字节4034 30写入寄存器0x018A的高字节0030 30写入寄存器0x018A的低字节0030 30帧校验E3 ED45 38包尾NONE0D 0A本例中的4个数据字节为IEEE754格式的浮点数40 40 00 00 = 3.0 应答帧:仪表-上位机 数据场名称RTU示例数据(HEX)ASC示例数据(HEX)包头NONE3A仪表地址0130 31功能码1031 30寄存器起始地址高
11、字节0130 31寄存器起始地址低字节8838 38寄存器数量高字节0030 30寄存器数量低字节0230 32帧校验C0 1E36 43包尾NONE0D 0A3.4 故障返回帧对于不能正确完成操作的请求帧,仪表将返回一个报告故障代码的返回帧,以报告不能完成操作的具体原因。比如将流量单位设置成Hz,由于仪表不能支持Hz这个流量单位,所以将返回如下的故障应答帧。 故障应答帧:仪表-上位机 数据场名称RTU示例数据(HEX)ASC示例数据(HEX)包头NONE3A仪表地址0130 31功能码8638 36故障码4334 33帧校验03 9139 31包尾NONE0D 0A 注:1故障返回帧中的功能
12、码=请求帧的功能码+0x802具体的故障代码请参考 附录1:常数表:故障码4 数据帧校验算法4.1 LRC校验/ LRC 校验范围:从“仪表地址”到LRC帧校验码的前一个字节void LRC(unsigned char *buf, unsigned int len) unsigned int i; LRC = 0; for (i=0; ilen; i+) LRC += bufi; LRC = 0xff - LRC; LRC+;4.2 CRC16校验const unsigned char TAB_CRC_H = 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x
13、01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x4
14、1,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,
15、0x41, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0
16、x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0x
17、C0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40;const unsigned char TAB_CRC_L = 0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04, 0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8, 0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xD
18、F,0x1F,0xDD,0x1D,0x1C,0xDC, 0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10, 0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4, 0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38, 0x28,0xE8,0xE9,0x29,0xEB,0x2B
19、,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C, 0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0, 0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4, 0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68, 0x78,
20、0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C, 0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0, 0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54, 0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x
21、99,0x59,0x58,0x98, 0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C, 0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40;/ CRC 校验范围:从“仪表地址”到CRC帧校验码的前一个字节void CRC(unsigned char *buf, unsigned int len) unsigned int i; unsigned char CRC_H , CRC
22、_L , index, ch;CRC_H = 0xff; CRC_L = 0xff; for (i=0; ilen; i+) ch = bufi; index = CRC_H ch;CRC_H = CRC_L TAB_CRC_Hindex; CRC_L = TAB_CRC_Lindex; 5 仪表变量地址定义以下为仪表支持数据变量信息列表,数据均为HEX类型变量名寄存器地址寄存器长度读指令写指令COIL类型清累计0003-05INT 类型流量单位(附录2:常数表流量单位)004200010306累计单位(附录2:常数表流量单位)004600010306功率单位(附录2:常数表流量单位)6003
23、 (热能表)00010306热能单位(附录2:常数表流量单位)6004 (热能表)00010306报警(附录3:报警定义)0419000103-LONG 类型扩展正向累计0309000203-正向累计0311000203-扩展反向累计0313000203-反向累计0315000203-扩展正向累计热量 0317 (热能表)000203-正向累计热量0319 (热能表)000203-扩展反向累计热量0321 (热能表)000203-反向累计热量0323 (热能表)000203-FLOAT 类型主变量(瞬时流量)0253000203-瞬时功率2000 (热能表)000203-入口温度2002 (热
24、能表)000203-出口温度2004 (热能表)000203-阻尼时间s018900020310小信号切除%019700020310刻度流量0209000203104-20mA电流测试(mA)01430002-10输出电流值mA0203000203-输出频率值Hz0229000203-频率上限 Hz022300020310脉冲当量 L/p110300020310脉冲宽度 ms022700020310连读: (通讯协议V10版本)瞬时流量 累计流量主变量(瞬时流量) float0500000203-扩展正向累计 unsigned long0502000203-正向累计 unsigned long
25、0504000203-扩展反向累计 unsigned long0506000203-反向累计 unsigned long0508000203-连读: (通讯协议V10版本)瞬时流量 累计流量:此处的累计量为仪表现场读数*1000的结果,比如仪表现场读数=10 m3, 则通过通讯读过来的数据为10,000 L比如仪表现场读数=10 L, 则通过通讯读过来的数据为10,000 mL主变量(瞬时流量) float0510000203-扩展正向累计 unsigned long0512000203-正向累计 unsigned long0514000203-扩展反向累计 unsigned long0516
26、000203-反向累计 unsigned long0518000203-连读: (通讯协议V10版本 & 热能表)瞬时流量 瞬时功率 入口温度 出口温度 累计流量 累计热量主变量(瞬时流量) float0520000203-瞬时功率 float0522000203-入口温度0C float0524000203-出口温度0C float0526000203-扩展正向累计 unsigned long0528000203-正向累计 unsigned long052A000203-扩展反向累计 unsigned long052C000203-反向累计 unsigned long052E000203-扩
27、展正向热能累计 unsigned long0530000203-正向热能累计 unsigned long0532000203-扩展反向热能累计 unsigned long0534000203-反向热能累计 unsigned long0536000203-注:累计量的计算方法如下 假设读出的“扩展正向累计” = 2,“正向累计” = 1234 则总的正向累计流量 = 2 * 1000,0000 + 1234 = 200012346 附录1:常数表:故障码0x01: 无效指令码0x02: 无效的寄存器地址0x30: 参数超上限0x31: 参数超下限0x32: 参数选择项错误0x40: 无效的寄存器长度0x41: 寄存器不支持当前的指令码0x42: 寄存器未指定功能0x43: 流量单位不存在0x44: 总量单位不存在0x45: 最高频率输出超上限0x46: 最低频率输出超下限0x47: 最高流速超上限0x48: 占空比超上限7 附录2:常数表:流