协议概述
1.1 MODBUS协议内容符合GB/Z 19582.1/2/3-2004(IEC60870-5)标准 。
1.2该协议适用于本厂的LWQZ气体智能涡轮流量计、 LLQZ智能罗茨流量计、 LUXZ智能旋进漩涡流量
计、 EVC体积修正仪等产品。
1.3主要特点
设备属性:流量计为MODBUS通信总线上的从站
通信模式: RTU
通信媒介: RS485
通信地址: 1-247
波特率: 1200 、2400 、4800 、9600 、19200 bps
数据位: 8位
校验位: 无校验(2个停止位)、偶校验(1个停止位)、奇校验(1个停止位)
1.4 特殊性
本协议针对流量计而开发,支持多字节二进制数、 ASCII字符串、 BCD码等类型变量的数据通信; 通信选用MODBUS的03H 、07H功能码,并增设用户自定义的66H功能码。
支持的MODBUS功能码
功能码,数据帧格式如下:
2.1 功能码03:读取起始地址在start_addr起N个字的数据。见表1。
主站发送: addr, 03, start_addr_hi ,start_addr_low, N_hi,N_low, CRC
从站响应: addr, 03, num, data(0),… .,data(num- 1), CRC
异常响应: addr, 83H, error_code, CRC
表1
寄存器地址 | 变量名称 | 寄存器数目N | 类型 | 单位 |
0000H | 工况累积量 | 4 | BIN | 3 |
0004H | 标况累积量 | 4 | BIN | Nm3 |
0008H | 工况流量 | 2 | BIN | m3/h |
000AH | 标况流量 | 2 | BIN | Nm3/h |
000CH | 温度 | 2 | BIN | ℃ |
000EH | 压力 | 2 | BIN | kPa |
其中:
起始地址:由start_addr_hi 、start_addr_low
2个字节组成,依次为起始地址的高字节、低字节;起始地址必须为表1第1列中的数值,否则流 量计回复地址出错(error_code =2);由N_hi 、N_low 2个字节组成,表示读取N个字(1个字由2个字节组成)的数据;
num :表示数据的个数, data(i) ,i=0,…,num, num=2N。
error_code代码参见表4。
示例1 (出厂默认: Cod为01 ,Cdr为23 ,bps为9600)
主站发送: 17 03 00 04 00 04 073E
地址 功能码 起始地址 寄存器数目 CRC校验码
从站响应: 17 03 08 00000039412524E1 9D25
地址 功能码 字节数 标况累积量 校验码
变量数据为8字节二进制数表示的标准累积流量,高位在先,其中前6个字节为整数部分,后两
个为小数部分,解包得数据3752229. 144Nm3/h。
附数据解包说明:
1) 整数部分十六进制数00 00 00 39 41 25等于十进制的3752229。
2) 小数部分十六进制数(24 E1) 16 = (9441)10 / 65536= 0. 14405(十进制小数)。
3) 结果为3752229.14,单位: Nm3/h
示例2读寄存器数据(此例中将当前积算仪显示的数据读出)
主站发送: 17 03 00 00 00 10 46F0
地址 功能码 起始地址 寄存器数目 CRC校验码
从站响应: 17 03 20 00 00 00 37 12 05 A0 43 00 00 00 37 12 05 A0 43
地址 功能码 接收字节数 工况累积量 标况累积量
00 01 CB 6B 00 01 CB 89 00 00 14 00 00 00 65 53 BA 18
工况流量 标况流量 温度 压力 校验码
备注:当主机发送的数据帧出错,从机不应答响应error_code代码,此时拒绝主机继续发送命令。
2.2 功能码07,读取流量计的1个字节的状态数据。见表2。
主站发送: addr, 07, CRC
从站响应: addr, 07,status, CRC
表2
BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 | |
1 | 有硬件故障 | 工况流量低报警 | 工况流量高报警 | 电池欠压1报警 | 电池欠压2报警 | 瞬时流量 偏低 | 正在按键 操作 | 有外电源 |
0 | 无硬件故障 | 工况流量大于报警低限 | 工况流量小于报警高限 | 电池电压大于报警限1 | 电池电压大于报警限2 | 瞬时流量 正常 | 无按键 | 无外电源 |
2.3功能码66H,用户自定义的功能码,用于读取流量计内部历史数据。见表3。
表3
寄存器地址 | 变量名称 | 寄存器数目N | 类型 | 说明 |
0063H | 记录起始时间 | 1 | BCD | 注1 |
0064H | 当前时间 | 3 | BCD | 注2 |
0067H | 仪表生产信息 | 18 | ASCII | 注3 |
0079H | 实时记录 | 17 | BCD/BIN | 注4 |
008AH | 月记录 | 5 | BCD/BIN | 注5 |
008FH | 启停记录 | 8 | BCD/BIN | 注6 |
0097H | 防剪断记录 | 4 | BCD/BIN | 注7 |
2.3.1读最近第M个实时记录(1条记录)
主站发送: addr, 66H, 00, 64H, 02H,M_hi, M_low, CRC
从站响应: addr,66H ,22H,psum(BIN),sum(BIN),q0(BIN),t(BIN),p(BIN),year(BCD),month(BCD), day(BCD),hour(BCD),minite(BCD),sec(BCD), CRC
2.3.2读最近第M个月记录(1条记录)
主站发送: addr, 66H, 00, 65H, 02H, M_hi,M_low, CRC
从站响应: addr,66H, 0AH, sum(BIN), year(BCD), month(BCD), CRC
2.3.3读最近第M个启/停记录(EVC无启停记录,1条记录)
主站发送: addr, 66H, 00, 66H, 02H,M_hi, M_low, CRC
从站响应: addr,66H,10H,sum(BIN),year(BCD),month(BCD),day(BCD),hour(BCD),
minite(BCD),sec(BCD), ssflag(byte),0, CRC
2.3.4读最近第M个传感器被剪断或接上时的记录(1条记录,仅配接机械计数器的智能积算仪适用) 主站发送: addr, 66H, 00, 67H, 02H,M_hi, M_low, CRC
从站响应: addr,66H,08H ,year(BCD),month(BCD),day(BCD),hour(BCD),
minite(BCD),sec(BCD), bkflag(byte),0, CRC
备注:
M为字,用2个字节表示, M_hi为高字节, M_low为低字节,读最近的一条记录时, M=1,
当M=0或大于流量计内部保存的记录数时,流量计返回数值为0的一个序列。
psum(BIN),sum(BIN):用8字节8位二进制数表示的累积量,高位在先,其中前6个字节为整数,后2个
字节为小数,单位: m3。
q0(BIN):用4字节8位二进制数表示的标况瞬时流量,高位在先,其中前3个字节为整数,后1个字节
为小数;单位: Nm3/h。
t(BIN):用4字节8位二进制数表示的温度,高位在先,其中前3个字节为整数,后1个字节为小数;单
位: ℃。
p(BIN):用4字节8位二进制数表示的压力,高位在先,其中前3个字节为整数,后1个字节为小数;单
位: KPa。
year,month,day,hour,minite,sec
为单字节BCD码,分别表示年(以2000年为起点, 20不显示)、月、日、时、分、秒。
ssflag为启/停标记,当ssflag=55H时,表示该记录为启动记录;当ssflag=0EEH时,表示该记录为停 止记录。
bkflag为正常/剪断标记,当bkflag=55H时,表示该记录为传感器连线恢复正常时的记录;当bkflag=
0EEH时,表示该记录为传感器连线被剪断时的记录。
注1:记录起始时间:用于指定实时记录的起始时间,2个字节,小时-分钟;秒时间默认为0;
注2:当前时间:年月日时分秒,6个字节,BCD码,其中年为1个字节(以2000年为起点,20不显示): 注3:仪表生产信息:36个字节,ASCII码;其中厂家代码10字,产品型号12个字节,产品序号8个字节,
软件版本3个字节,生产日期3个字节(年月日);
注4:实时记录
:一条实时数据记录共34个字节,包括工况累积量8个字节(8位二进制数,单位:m3 )、标况累积 量8个字节(8位二进制数,单位:m3 )、瞬时流量4个字节(8位二进制数,单位:m3/h)、温度4 个字节(8位二进制数,单位:℃)、压力4个字节(8位二进制数,单位:kPa)、时间6个字节( BCD码,年月日时分秒)
注5:月记录;
一条月记录共10个字节,标况累积量8字节(8位二进制数,单位:m3 )、时间2个字节(BCD码,年
月)
注6:启停记录:一条启停记录共15个字节,标况累积量8个字节(8位二进制数,单位:m3 )、时间6个字 节(BCD码,年月日时分秒)、启停标记1个字节(55H表示流量从无到有,EEH表示流量从有到无) 、0(保留字节);
注7:防剪断记录:一条防剪断记录共8个字节,时间6个字节(BCD码,年月日时分秒)、防剪断标记1 个字节(55H表示传感器线束被接通,为正常情况;EEH表示传感器线束被剪断,为异常情况;记录 时间为接通或被剪断的时间)、 0(保留字节)。
2.4 流量计在收到一个通讯帧后没有响应的几种情况:
2.4.1收到数据帧的通讯地址字节与本机地址不同时;
2.4.2收到数据帧的通讯地址字节(等于0)是广播地址时;
2.4.3收受到数据帧的CRC校验出错时;
2.5.4收受到数据帧的命令码出错时。
2.5 异常响应
当从机接受到一个发给本机的数据帧、 CRC校验正确,并检测到异常时,
从站响应为: addr, function_code+128,error_code,CRC
备注: function_code:为主机命令帧中的功能码(第二个字节), function_code+128即功能码
字节的最高位置1,表示异常;
表4
数值 | 故障含义 |
02 | 变量地址无效 |
03 | 数值无效 |
数据类型
在表格中的数据有3种类型: BIN 、BCD码和ASCII码:
3.1 、BIN :二进制数,高字节在前,低字节在后;分别有4种情形:
1字节(无小数,无符号);
2字节(无小数,无符号);
4字节(最后1个字节表示小数,第一个字节最高位代表符号位, 1表示负数, 0表示正数)。 8字节(最后2个字节表示小数,无符号位;实时记录显示的工况累积量和标况累积量小数位后一个字
节默认为00,小数位按一个字节计算)。
3.2 、BCD码: 1个字节表示2位数值,数值范围为0-9。
3.3 、ASCII码 :字符, 8位,一个字节ASCII码,表示1个英文字母或数字。
特殊说明
为了兼容原自定义的流量计通讯协议,增加一条特殊的指令格式:
4.1、数据位为8位,无奇偶校验。即将通信模式Cod设定为10。
4.2、流量计的地址(ADDR)出厂默认值为023,即十六进制的17。
4.3 、02命令读测量参数
4.3.1 、上位机向流量计发送:
55H, 55H, ADDR, 02 ,00, ChkSum
4.3.2、流量计向上位机应答的数据帧:
55H, 55H, ADDR, 02, 18, DevStatus, DevErr, Qm, Qo, t, p, sum, ChkSum
备注:
55H ,55H为数据帧的引导字符,表示数据帧的开始;
ADDR 为流量计的通信地址, 1个字节,取值范围1—247。
02 为通信命令号, 1个字节,读测量参数。
18为数据长度, 1个字节,表示它后面有18H个字节的数据。
Qm(工况流量) ,Qo(标况流量) ,t(温度) ,p(压力) ,sum(累积量)。
ChkSum 为校验和, 1个字节,其数值是从Address起到ChkSum前的全部数据之和的低8位数据; DevStatus :为状态码, 1个字节,其各位的含义见表5:
表5
BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 | |
1 | 命令不 响应 | Qo报警 | 睡眠 | 有外电源 | 压缩因 子补偿 | 有按键 | 电池欠压 | 流量偏小 |
0 | 命令响应 | Qo 不报警 | 不睡眠 | 无外电源 | 不补偿 | 无按键 | 电池正常 | 流量正常 |
DevErr:为故障代码 ,1个字节,其各位的含义见表6:
表6
BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 | |
1 | 频率电路故障 | 温度传感器异常 | 压力传感器异常 | A/D转换电路异常 | RAM故障 | EEPROM故障 | 串行口 通信 故障 | 时钟电路故障 |
0 | 频率电路正常 | 温度传感器正常 | 压力传感器正常 | A/D转换电路正常 | RAM正常 | EEPROM正常 | 串行口 通信 正常 | 时钟电路正常 |
工况流量、标况流量、温度、压力采用4个字节(单精度)的浮点数表示,依次为P ,SMH ,MM ,M
L,用F (Float)表示: FloatData = ±0.MH-MM-ML*2P
累积量采用6个字节的浮点数表示,依次为P ,SMH ,MM ,ML ,ML1 ,ML2,用F (Float)表示:
FloatData = ±0.MH-MM-ML-ML1-ML2*2P
其中: P : 阶码, 1个字节,以十六进制补码的形式表示。
SMH :尾数的高字节, 1个字节,最高位(第7位)为符号位S ,S=1 表示数据为负, S=0 则数据为正;其余7位为浮点数尾数的高7位,第0到6位。
MM :尾数的中间字节, 1个字节,第7到14位。
ML : 尾数的低字节, 1个字节,第15到23位。
ML1 : 尾数的低字节, 1个字节,第24到31位。
ML2 : 尾数的低字节, 1个字节,第32到39位。
示例3:
上位机向流量计发送的数据帧:
55 55 17 02 00 19
55H 55H ADDR CMD Len1 ChkSum
流量计向上位机应答的数据帧:
55 55 17 02 18 15 00 00 00 00 00 00 00 00 00 05 50 00 00 07 65 4C CC
55H 55H ADDR 02 18 DevStatus DevErr Qm Qo t p
16 72 82 4A 49 25 E1
sum ChkSum
以阶码的十进制数值为界线把尾数分成整数和小数部分,再进行二进制至十进制转换计算。
附数据包说明:
55 55 17 02 18 ---
15
00
00 00 00 00 00 00 00 00 05 50 00 00
07 65 4C CC
---状态码
---故障码
---工况瞬时流量=0
---标况瞬时流量=0
---温度=0.10100 000000000000000000×2∧0101=20
---压力=0.1100101 0100110011001100×2∧0111=101.29998779
16 72 82 4A 49 25 ---累计量=0.1110010100000100100101 00100100100100101×2∧10110 =3752229. 1428604125
E1 ---校验和
4.3.3 自定义的流量计通讯协议浮点数解析
下面详细讲解如何解析4个字节浮点数和6个字节的浮点数。
温度: 05 50 00 00 根据数据类型的定义, P=(05)H=(0101) 2 = 5
SMH=(50)H=(01010000) 2 MM=00 ML=00
。因为SMH最高位为0,故尾数是正的。而阶码P转为十进制数为5,故在尾数转为二进制后,前5位为整数 部分,其余为小数部分。
FloatData = 0 10100 0000000000 00000000 转为十进制数
正 整数部分 小数部分
FloatData = 1×24 + 1×22 = 20
压力: 07 65 4C CC 其中 P=(07)H =(0111) 2 =7 SMH=(65)H=(01100101) 2 MM=(4C)H=(01001100) 2 ML=(CC)H=(11001100) 2
因为SMH中最高位为0,故尾数是正的,而阶码P转为十进制数为7,故在尾数转为二进制后,有7位是整数 部分,其余为小数部分。
FloatData = 0 1100101 01001100 11001100 转为十进制数
正 整数部分 小数部分
FloatData= 1×26 + 1×25 + 1×22 + 1×20 + 1×2-2 + 1×2-5 + 1×2-6
+ 1×2-9 + 1×2- 10 + 1×2- 13 + 1×2- 14 = 101.29998779
累积量:16 72 82 4A 49 25其中 P=(16)H=(00010110) 2 = 22 SMH=(72)H=(01110010) 2 MM=(82)H=(10000010) 2 ML=(4A)H=(01001010) 2 ML1=(49)H=(01001001) 2 ML2=(25)H=(00100101) 2 ,SMH中最高位为0,故尾数为正,而阶码P转为十进制数为22,故在尾数为二进制时,有22位是整数部分 ,其余为小数部分。
FloatData = 0 1110010 10000010 0100101 0 01001001 00100101 转为十进制数
正 整数部分 小数部分
FloatData =1×221 + 1×220 + 1×219 + 1×216 + 1×214 + 1×28 + 1×25 + 1×22 + 1×20+ 1×2-3 + 1×2-6 + 1×2-9 + 1×2- 12 +1×2- 15 + 1×2- 17 = 3752229.1428604125