1、 R 智 能型流量计 RS485 通讯协议 ( MODBUS 版本 1.6) 适用于: LUY/FLUS 旋进旋涡流量计 FLT/FLWQ 气体涡轮流量计 FLR/FLLQ 气体罗茨流量计 FLWY液体涡轮 流量计 LUB 旋涡流量计 2014 年 1 月 流量计 MODBUS 通讯协议 1、 MODBUS 串行通信协议 3 1.1 MODBUS协议基本规则与传送模式 . 3 1.2 RTU模式下 MODBUS数据包结构描述 . 3 1.2.1 地址域 . 3 1.2.2 功能码域 . 3 1.2.3 数据域 . 3 1.2.4 校验 域 . 3 1.2.5 网络时间考虑 . 4 1.3 AS
2、CII模式下 MODBUS数据包结构描述 . 4 2、 MODBUS 通信数据包 5 2.1 RTU模式下的寄存器读写 . 5 2.1.1 读设备寄存器( 03H) 5 2.1.2 写设备寄存器( 10H) 5 2.2 ASCII模式下的寄存器读写 . 5 2.2.1 读设备寄存器( 03H) 5 2.2.2 写设备寄存器( 10H) 5 3、设备寄存器说明 6 4、 CRC-16 计算方法 9 4.1 CRC-16原始算法 . 9 4.2 CRC-16查表算法 . 9 流量计使用说明 MODBUS( RTU) 通讯协议 浙江富马仪表有限公司, 2007.01 - 3 - 1、 MODBUS
3、串行通信协议 1.1 MODBUS协议基本规则 与传送模式 控制器通讯使用主从技术,即主机 (PLC,电脑等 )启动 数据传输,而 从机(流量计) 返回对查询做出的响应或处理查询所要求的动作。 主机 发送 数据包 称为请求, 从机 发送 数据包称为响应 。 在这种方式下,信息和资料在单个 主机 和最多 32 个 从机 之间传递 。 所有在 RS485通信回路上传递的信息 只 能由主机 初始化和控制 , 从机 只能响应 主机 一个请求。 MODBUS协议可以采用 ASCII或者 RTU 模式。 本流量计 支持 RTU和 ASCII两种 模式, 波特率可设置为 300、 600、 1200、 24
4、00、 4800、 9600 或 19200, 校验位 可选 奇校验、偶校验或者无校验 , 数据 位 可选 7或 8位 ,停止位 可 选 1或 2位 。 1.2 RTU模式下 MODBUS数据包 结构描述 所有 RS485环路上的通信都以“打包”方式发生。一个 数据包 就是一个简单的字符串,一个 数据包 中最多可含 255 个字节。 每个 MODBUS数据包 都由以下几个部分组成: 表 1 上位机和仪表信息交互命令包通用格式 名称 T-T2-T3-T4 地址域 功能码域 数据域 校验域 长度 空闲 1 1 变长 2 1.2.1 地址域 MODBUS的 从机 地址域长度为一个字节,包含 数据包
5、传送的 从机 地址。有效的 从机 地址范围从 1 247。 从机 如果接收到一帧 从机 地址域信息与自身地址相符合的 数据包 时,应当执行 数据包 中所包含的命令。 从机 所响应的 数据包 中该域为自身地址。 1.2.2 功能码域 MODBUS数据包 中功能域长度为一个字节,用以通知 从机 应当执行何操作。 从机 响应 数据包 中应当包含 主机 所请求操作 的相同功能域字节。有关设备的功能码参照下表。 表 2 MODBUS 功能域编码 功能码 含义 功能 0x03 读取寄存器 获得当前设备内部一个或多个当前寄存器值 0x10 设置寄存器 将指定数值写入设备内部一个或多个寄存器内 1.2.3 数
6、据域 MODBUS数据域长度不定,依据其具体功能而定。 MODBUS数据域采用 “ BIG INDIAN” 模式,即高位字节在前,低位字节在后。 例如 1个 16位寄存器包含数值为 0x1234, 那么 寄存器数值发送顺序为:高位字节 =0x12, 低位字节 =0x034。 1.2.4 校验域 MODBUS-RTU 模式采用 16 位 CRC 校验 ,多项式为 X16+X15+X2+1。发送设备应当对 数据包流量计使用说明 MODBUS( RTU) 通讯协议 浙江富马仪表有限公司, 2007.01 - 4 - 中的每一个资料都进行 CRC16计算,最后结果存放入检验域中。接收设备也应当对 数据
7、包 中的每一个资料(除校验域以外)进行 CRC16 计算,将结果域校验域进行比较。只有相同的 数据包 才可以被接受。 循环冗余校验 CRC区为 2字节,含一个 16位二进制数据。由发送设备计算 CRC值,并把计算值附在信息中,接收设备在接收信息时,重新计算 CRC值,并把计算值与接收的在 CRC 区中实际值进行比较,若两者不相同,则产生一个错误。 CRC开始时先把寄存器的 16 位全部置成“ 1” ,然后把相邻 2 个 8位字节的数据放入当前寄存器中,每个 8 位数据与该寄存器的内容进行异或运算,然后向最低有效位 (LSB)方向移位,用零填入最高有效位 (MSB)后,再对 LSB 检查,若 L
8、SB=1,则寄存器与预置的固定值异或,若 LSB=0,不作异或运算。 重复上述处理过程,直至移位 8 次,最后一次 (第 8 次 )移位后,下一个 8 位字节数据与寄存器的当前值异或,再重复上述过程。全部处理完信息中的数据字节后,最终得到的寄存器值为 CRC 值。 具体的 CRC校验算法参照 本文第 4部分 。 1.2.5 网络时间考虑 使用 RTU 模式,消息发送至少要以 3.5 个字符时间的停顿间隔开始。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少 3.5个字符时间的停顿标定了消息的结束。 1.3 ASCII模式下 MODBUS数据包
9、 结构描述 所有 RS485环路上的通信都以“打包”方式发生。一个 数据包 就是一个简单的字符串 。 表 3 MODBUS 的 ASCII 方式的数据格式 名称 起始码 地址码 功能码 数据区 校验码 停止码 内容 : LRC CR, LF 长度 1 2 2 2 2 起始码:数据格式的帧头,以“ :”号表示, ASCII码为 (3AH)。 地址码:从站的地址, 01H FFH。 功能码:主站发送,告诉从站执行功能, 01H-FFH 数据区:具体数据内容 校验码: LRC 校验码,校验码的范围为由地址码开始到数据区结束,不包含起始码。 停止码:数据格式的帧尾,用“ CR”( 0DH),“ LF”
10、( 0AH) 控制器在 MODBUS 网络上以 ASCII 码模式通信 ,在数据格式中每个字节都转换成 ASCII码发送 ,也就是每个 16 进制字符 (0 9),(A F)都转换成 ASCII码发 送。这种方式的主要优点是字符发送的时间间隔可达 1秒 ,而不产生错误。 数据格式中的每个字符发送的时间间隔不能超过 1 秒,否则,接受设备将认为是传送错误。 流量计使用说明 MODBUS( RTU) 通讯协议 浙江富马仪表有限公司, 2007.01 - 5 - 2、 MODBUS 通信数据包 2.1 RTU模式下的寄存器读写 2.1.1 读设备寄存器( 03H) 请求数据包(主机流量计) 响应数据
11、包(流量计主机) 流量计地址 1字节 流量计地址 1字节 功能码 03H 1字节 功能码 03H 1字节 开始地址 (高 /低 ) 2字节 寄存器内容长度 1字节 寄存器 内容长度 (高 /低 ) 2字节 寄存器 具体内容 CRC校 验码 2字节 CRC校验码 2字节 2.1.2 写设备寄存器( 10H) 请求数据包(主机流量计) 响应数据包(流量计主机) 流量计地址 1字节 流量计地址 1字节 功能码 10H 1字节 功能码 10H 1字节 开始地址 (高 /低 ) 2字节 开始地址 (高 /低 ) 2字节 寄存器个数 (高 /低 ) 2字节 寄存器个数 (高 /低 ) 2字节 寄存器内容长
12、度 1字节 CRC校验码 2字节 寄存器具体内容 CRC校验码 2字节 2.2 ASCII模式下的寄存器读写 2.2.1 读设备寄存器( 03H) 请求数据包(主机流量计) 响应数据包(流量计主机) 起始码 ( :) 1字节 起始码 ( :) 1字节 流量计地址 ( 01 ) 2字节 流量计地址 ( 01 ) 2字节 功能码 ( 0 3 ) 2字节 功能码 ( 0 3 ) 2字节 开始地址 (高 /低 ) 4字节 寄存器内容长度 2字节 寄存器 个数 (高 /低 ) 4字节 寄存器具体内容 LRC校验码 2字节 LRC校验码 2字节 结束码 ( CR, LF) 2字节 结束码 ( CR, LF
13、) 2字节 2.2.2 写设备寄存器( 10H) 请求数据包(主机 流量计) 响应数据包(流量计主机) 起始码 ( : ) 1字节 起始码 ( : ) 1字节 流量计地址 ( 01 ) 2字节 流量计地址 ( 01 ) 2字节 流量计使用说明 MODBUS( RTU) 通讯协议 浙江富马仪表有限公司, 2007.01 - 6 - 功能码 ( 1 0 ) 2字节 功能码 ( 1 0 ) 2字节 开始地址 (高 /低 ) 4字节 开始地址 (高 /低 ) 4字节 寄存器个数 (高 /低 ) 4字节 寄存器个数 (高 /低 ) 4字节 寄存器内容长度 2字节 LRC校验码 2字节 寄存器具体内容 结
14、束码 ( CR, LF) 2字节 LRC校验码 2字节 结束码 ( CR, LF) 2字节 3、 设备寄存器说明 表 4 流量计设备寄存器 地址 地址老版本 长度 属性 类型 参数名 描述 1 4 R double 标况累积流量 单位( m3) 5 2 R float 标况 流量 单位( m3/h) 7 2 R float 工况 流量 单位( m3/h) 9 2 R float 温度 单位() 11 2 R float 压力 单位( kPa) 13 4 R double 工况体积总量 单位( m3) 17 2 R unsigned int 标志位 3000 1000 2 RW unsigned
15、 long 流量报警下限值 单位( m3/h) 3002 1004 1 RW unsigned int 流量报警下限值小数位数 现固定为 3 3003 1006 2 RW unsigned long 流量报警上限值 单位( m3/h) 3005 1010 1 RW unsigned int 流量报警上限值小数位数 现固定为 3 3006 1012 2 RW unsigned long 压力报警下限 单位( Pa) 3008 1016 2 RW unsigned long 压力报警上限 3010 1020 1 RW unsigned int 温度报警下限 使用绝对温度,单位( K) 定点一位小数
16、 3011 1022 1 RW unsigned int 温度报警上限 3012 1024 2 RW unsigned long 仪表系数 3014 1028 1 RW unsigned int 仪表系数小数位数 3015 1030 2 RW unsigned long 当地大气压 单位( Pa) 3017 1034 1 RW unsigned int 天然气相对密度 3018 1036 1 RW unsigned int CO2摩尔分数 3019 1038 1 RW unsigned int N2摩尔分数 3020 1040 2 RW unsigned long 下限截止流量 单位( m3/
17、h) 3022 1044 1 RW unsigned int 下限截止流量小数位数 固定为 3 3023 1046 2 RW unsigned long 上限截止流量 单位( m3/h) 3025 1050 1 RW unsigned int 上限截止流量小数位数 固定为 3 3026 1052 1 RW unsigned int 溢出前 /后小数 位数 范围 0 7 流量计使用说明 MODBUS( RTU) 通讯协议 浙江富马仪表有限公司, 2007.01 - 7 - 地址 地址老版本 长度 属性 类型 参数名 描述 4000 2000 3 RW 年 月 日 时 分 秒 日期和时间 4003
18、 2006 2 RW unsigned long 标方累积流量 单位( m3) 4005 2010 1 RW unsigned int 标方累积流量小数位数 4006 2012 2 R0 unsigned long 标方瞬时流量 单位( m3/h) 4008 2016 1 R0 unsigned int 标方瞬时流量 小数位数 现固定为 3 4009 2018 2 RW unsigned long 工况 累积流量 单位( m3/h) 4011 2022 1 RW unsigned int 工况 累积流量小数位数 4012 2024 2 R0 unsigned long 工况 瞬时流量 单位(
19、m3/h) 4014 2028 1 R0 unsigned int 工况 瞬时流量小数位数 现固定为 3 4015 2030 2 R0 unsigned long 绝对压力 单位( Pa) 4017 2034 1 R0 unsigned int 绝对温度 定点一位小数 单位( K) 4018 2036 1 R0 unsigned int 仪表状态 见表 4 4019 2038 1 R0 unsigned int 仪表告警标志 见表 4 4020 2040 1 R0 unsigned int 流量信号频率 整数,单位 Hz 4021 2042 2 R0 Swapped float 标方累积流量
20、浮点数,单位( m3) 4023 2046 2 R0 Swapped float 标方瞬时流量 浮点数,单位( m3/h) 4025 2050 2 R0 Swapped float 绝对压力 浮点数,单位( kPa) 4027 2054 2 R0 Swapped float 绝对温度 浮点数,单位() 4029 2058 2 R0 float 标方累积流量 浮点数,单位( m3) 4031 2062 2 R0 float 标方瞬时流量 浮点数,单位( m3/h) 4033 2066 2 R0 float 绝对压力 浮点数,单位( kPa) 4035 2070 2 R0 float 绝对温度 浮
21、点数,单位() 表 5 仪表状态 、报警寄存器 位置 仪表状态寄存器 位置 仪表告警标志寄存器 Bit 7 保留 Bit 7 电池二级欠压 Bit 6 保留 Bit 6 电池一级欠压 Bit 5 保留 Bit 5 温度超上限 Bit 4 外部存储器存在 Bit 4 温度超下限 Bit 3 温度传感器存在 Bit 3 压力超上限 Bit 2 压力传感器存在 Bit 2 压力超下限 Bit 1 三线制外电源 Bit 1 流量超上限 Bit 0 两线制外电源 Bit 0 流量超下限 举例:读取地址为 1 的流量计的标况累积流量,开 始地址为 2006( 0x07D6), 4 个字节为累积流量, 2
22、个字节为小数点位置,共 6 个字节 发送: 01 03 07 D6 00 03 E5 47 接收: 01 03 06 00 BC 61 4E 00 03 4F 44 说明: 其中 0x00BC614E = 12345678,小数点为 0003,所以累积流量为 12345.678 流量计使用说明 MODBUS( RTU) 通讯协议 浙江富马仪表有限公司, 2007.01 - 8 - ModScan32 软件读取数据 ModPoll 软件读取数据 流量计使用说明 MODBUS( RTU) 通讯协议 浙江富马仪表有限公司, 2007.01 - 9 - 4、 CRC-16 计算方法 #define W
23、ORD unsigned short / 16 Bit 无符号数 #define BYTE unsigned char / 8 Bit 无符号数 4.1 CRC-16原始算法 WORD CalcCRC16 ( BYTE * pPtr,WORD nCount) WORD i; WORD wCRC = 0xFFFF; while (nCount 0) nCount-; wCRC = wCRC (WORD)(0xFF for (i=0; i 1 0xA001; else wCRC = wCRC 1; wCRC = (wCRC 8) return wCRC; 4.2 CRC-16查表算法 / CRC1
24、6 余式表 const WORD crc16_table16= 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400, ; WORD CalcCRC16 (BYTE * pPtr,WORD nCount) BYTE ucTmp; WORD wCRC=0xFFFF; while(nCount- 0) ucTmp = (BYTE)(wCRC wCRC = 4; wCRC = crc16_table ucTmp(*pPtr ucTmp = (BYTE)(wCRC wCRC = 4; wCRC = crc16_table ucTmp(*pPtr4); pPtr+; ucTmp = wCRC 8; wCRC = 8; wCRC |= ucTmp; return wCRC;