版本 日期
0.1 2009.02.13
仪表通讯协议
修改目录: 版本号 0.1  日期 2009-02-13 1. 初始版本 修改内容 附件
附录1 附录2 附录3 附录4
仪表寄存器地址
CRC循环冗余校验算法
IEEE4字节浮点数传输与编码 ASCII码表
第一章 通讯功能概要
1.1 通信功能一览
本仪表将串行接口(RS232或RS485)作为附加规格。
每种接口能够使用的功能及使用这些功能(硬件及软件)的设备如下:
串行接口(RS232或RS485)
功能 Modbus从机 仪表 协议 Modbus RTU 专用协议 连接设备 Modbus主机设备(测量仪器、PC、PLC等) PC(数据管理软件)  1.2 使用串口通讯
本仪表的两种串行接口(RS232和RS485)的规格如下:
RS232接口规格 插座类型 连接方式 通信方式 同步方式 波特率 起始位 数据位 校验位 停止位 接收缓冲器大小
RS485接口规格 插座类型 连接方式 通信方式 同步方式 波特率 起始位 数据位 校验位 停止位 接收缓冲器大小 通信距离 终端阻抗*2 2点端子板 多点,总线式拓扑网络 半双工 起止式同步 1200,2400,4800,9600,19200,38400,57600[bps] 1位(固定) 8位(固定) 可选择奇校验,偶校验或None(无校验) 1位(固定) 128字节 最多1.2km 外部:推荐120Ω,1/2W电阻 D-Sub 9芯插座或者3点端子板*1 点对点 半双工 起止式同步 1200,2400,4800,9600,19200,38400,57600[bps] 1位(固定) 8位(固定) 可选择奇校验,偶校验或None(无校验) 1位(固定) 128字节  注:
*1 具体插座请参考仪表说明书。
*2 使用多点连接(包括点对点连接)时,仅在链路最末端的仪表上连接一个终端电阻。不要对链路中间的仪表连接终端电阻。如果使用了转换器,打开它的终端阻抗。推荐的转换器
上必须附加外部终端阻抗,也有内置终端阻抗的转换器。
第二章 通讯指令
命令代码是16进制的。
03H
描述
读取保持寄存器
读取仪表保持寄存器,包括工程量和累积量。 不支持广播命令。
附录中包含了命令可以访问的寄存器列表。
发送
命令信息中包含了读取寄存器的起始地址和读取长度。
下面是一个从地址为8的设备读取地址00~01的寄存器的例子。
发送格式 名称 从设备地址 功能码 起始地址高 起始地址低 寄存器数量高 寄存器数量低 CRC校验低 CRC校验高 数据(HEX) 08H 03H 00H 00H 00H 02H C4H 92H 返回
在返回的信息中每个寄存器包含两个字节的数据。高字节在前,低字节在后。 下面是上页发送命令的正常返回。
返回格式 名称 从设备地址 功能码 字节数量 高字节(寄存器00) 低字节(寄存器00) 高字节(寄存器01) 低字节(寄存器01) CRC校验低 CRC校验高 数据(HEX) 08H 03H 04H 00H 00H 10H 52H EFH 0EH
附录1 仪表寄存器地址
寄存器地址版本与仪表主机固件版本对应关系 寄存器地址版本 仪表主机固件版本 A3GV1xxx a版本  A3EV1XXX  A5GV1XXX  A6GV1XXX A3GV2000-2005 b版本 A3EV2000-2003 A5GV2000-2006 A6GV2000-2009 A3GV2006及之后版本 c版本 A3EV2004及之后版本 A5GV2007及之后版本 A6GV2010及之后版本 d版本
A5GW2000及之后版本 A6GW2000及之后版本
1. a版本寄存器地址
工程量(浮点数): 通道1 00 18 通道2 02 20 通道3 04 22 通道4 06  通道5 08   通道6 10   通道7 12   通道8 14   通道9 16   通道10 通道11 通道12
工程量(百分比): 通道1 24 33 通道2 25 34 通道3 26 35 通道4 27  通道5 28   通道6 29   通道7 30   通道8 31   通道9 32   通道10 通道11 通道12   累积量(ulong): 通道1 36 54 通道2 38 56 通道3 40 58 通道4 42  通道5 44   通道6 46   通道7 48   通道8 50   通道9 52   通道10 通道11 通道12  注: 实际累积量 = 读取累积量(ulong) / 10
2. b版本寄存器地址
工程量(浮点数): 通道1 00 18 通道2 02 20 通道3 04 22 通道4 06  通道5 08   通道6 10   通道7 12   通道8 14   通道9 16   通道10 通道11 通道12
工程量(百分比): 通道1 24 33 通道2 25 34 通道3 26 35 通道4 27  通道5 28   通道6 29   通道7 30   通道8 31   通道9 32   通道10 通道11 通道12
累积量(long long): 通道1 36 72
通道2 40 76 通道3 44 80 通道4 48  通道5 52   通道6 56   通道7 60   通道8    通道9 68   通道10 通道11 通道12  注: 实际累积量 = 读取累积量(long long) / 100
3. c版本寄存器地址
工程量(浮点数): 通道1 00 18 通道2 02 20 通道3 04 22 通道4 06  通道5 08   通道6 10   通道7 12   通道8 14   通道9 16   通道10 通道11 通道12   工程量(百分比): 通道1 24 33 通道2 25 34 通道3 26 35 通道4 27  通道5 28   通道6 29   通道7 30   通道8 31   通道9 32   通道10 通道11 通道12
累积量(ulong): 通道1 84 102 通道2 86 104 通道3 88 106 通道4 90  通道5 92   通道6 94   通道7 96   通道8 98   通道9 100   通道10 通道11 通道12  注: 实际累积量 = 读取累积量(ulong)
4. d版本寄存器地址
工程量(浮点数): 通道1 00 18 通道2 02 20 通道3 04 22 通道4 06 24 通道5 08 26 通道6 10 28 通道7 12 30 通道8 14  通道9 16   通道10 通道11 通道12 通道13 通道14 通道15 通道16
工程量(百分比): 通道1 32 41 通道2 33 42 通道3 34 43 通道4 35 44 通道5 36 45 通道6 37 46 通道7 38 47 通道8 39  通道9 40   通道10 通道11 通道12 通道13 通道14 通道15 通道16
累积量(ulong): 通道1 112 130 通道2 114 132 通道3 116 134 通道4 118 136 通道5 120 138 通道6 122 140 通道7 124 142 通道8 126  通道9 128   通道10 通道11 通道12 通道13 通道14 通道15 通道16  注: 实际累积量 = 读取累积量(ulong) 附录2 CRC循环冗余校验算法
1. CRC校验概述
CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+ r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
2. CRC校验算法
//CalCrc===================== //功能  计算    CRC校验 //参数  buf    校验缓冲 //   length  检验长度 //返回  CRC校验结果,短整形表示 HL const uchar ucCRCHi[] =  {  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, 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,   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, 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, 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, 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 } ;
const uchar ucCRCLo[] = {  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, 0xDF, 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, 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, 0x, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,   0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,   0x78, 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,   0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x, 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计算
ushort CalCrc(uchar *pucData , ushort usDataLen) {  uchar ucCrcLo = 0xFF ;   uchar ucCrcHi = 0xFF ;   uchar ucIndex ;  while(usDataLen--)   {   ucIndex = ucCrcLo ^ *pucData++ ;   ucCrcLo = ucCrcHi ^ ucCRCHi[ucIndex] ;   ucCrcHi = ucCRCLo[ucIndex] ;  };  return (ucCrcHi * 0x100 + ucCrcLo) ; }
附录3 IEEE4字节浮点数传输与编码
1. IEEE4字节浮点数编码简介
4字节共32位
00-22位     尾数(1.尾数)
23-30位     阶码(2^( 阶码 - 127)) 31位          符号(0正;1负)
值=(符号)[(1.尾数)*(2^(阶码 - 127))]
2. 举例说明
1、读取数据:08 03 00 C0 00 02 C4 AE[偏移192,长度2字] 2、收取数据:08 03 04 00 00 40 88 52 95[数据00004088,长度04] 3、分析数据:00 00 40 88[FF1 FF2 FF3 FF4]
A、前后字交换顺序40 88 00 00[FF3 FF4 FF1 FF2]
二进制:0100 0000 1000 1000 0000 0000 0000 0000
B、尾数 =  000 1000 0000 0000 0000 0000 B = 0.0625;
阶码 =  10000001B - 127 = 129 - 127 = 2 ; 符号 =  (+) ;
C、计算数值:+[1.0625 * 2^2] = 4.25
附录4 ASCII码表
0 1 2 3 4 5 6 低7 48 位 9 A B C D E F
高4位 0           LF 1            ESC 2 3 SP 4 5 Q R S T U V X Y Z      6  a b c d e f h i j k l m n o 7 8 9 A B C D E F p q r s t u v x y z                                                                                                                                      0 @ P 1 A 2 B 4 D F    # 3 C % 5 E & 6  ( ) * +  - . / 7 G W g w 8 H 9 :      I J K L M N O   CR