内蒙古自治区环保在线监测设备RS232 串行口协议
一、有关串行通信的物理标准
1 、 信号电平标准: RS-232 - C 采用负逻辑规定逻辑电平, RS-232-C 将 -5V ~ -15V 规定为 “1” , +5V ~ +15V 规定为 “0” 。
2 、 信号线的定义:采用三线制 9PIN RS232 接口 .
PIN2 为 RXD,
PIN3 为 TXD,
PIN5 为 GND. GND TXD RXD
5 ●4●3●2●1●
6 ●7●8●9●
二、传输速率
2400 bps
三、数据格式:
1 . 起止式的帧数据格式
起始位 : 1 位(低电平)
数据位 : 8 位
校验位 : 无
停止位 : 1 位(高电平)
字符间隔时间 : ≧ 1ms
2 . 主呼指令/ 数据格式(最大31 字节,字节数与从呼字节数一致,以下描述按31 字节数而定)
① 数据头 02 06 (共2 个字节)
② 数据/ 指令(用来区分数据和指令,共1 个字节):00 为指令,01 为数据
③ 厂家ID ( 用来标识设备生产厂家,相同设备不同生产厂家有唯一的ID 号,共1 个字节)
④ 类别ID( 用来区分所连的设备是废水监测设备还是烟气监测设备) :00 为水设备
01 为烟气设备
⑤ 功能内容(用来设定该指令要求实现哪种功能,23 个字节): 功能内容第一个字节为 功能 代码 ,其余22 字节为无用字节, 用0xff 填充。
0001 ( 十进制 ) : 为立即回传数据
02( 十进制 ): 校零校满,用于上位机对现场的一次仪表进行远程校准
03( 十进制 ): 即时采样命令,用于上位机远程通知现场的一次仪表即时开始取样分析
04( 十进制 ): 设置设备采样时间周期,用于上位机远程设置现场一次仪表的取样分析时间
05( 十进制 ): 设备操作命令
06 - FF : 预留命令范围
⑥ 校验 (对②③④⑤所包含的字节进行16 位CRC 校验,共2 个字节)
⑦ 数据尾 03 (数据尾,共1 个字节)
数据头 | 数据/ 指令 | 厂家ID | 类别ID | 功能内容 | CRC 校验 | 数据尾 |
0X0206 | 1byte | 1byte | 1byte | 23byte | 2byte | 0X03 |
3 . 从呼指令 / 数据格式(最大 31 字节, 以下描述按31 字节数而定 )
① 数据头 02 06 (共2 个字节)
② 数据 / 指令 (用来区分数据和指令,共1 个字节):00 为指令,01 为数据
③ 厂家 ID ( 用来标识设备生产厂家,相同设备不同生产厂家有唯一的ID 号,共1 个字节)
④ 类别ID( 用来区分所连的设备是废水监测设备还是烟气监测设备) :00 为水设备
01 为烟气设备
⑤ 数据内容 (具体要传输的目标数据, 22 个字节)
⑥ 错误代码 (0 表示设备无故障,非零表示发生了某种故障,具体情况由厂家自定并提供说明,共一个字节)
⑦ 校验 (对②③④⑤⑥所包含的字节进行CRC 校验,共2 个字节)
⑧ 数据尾 03 (共 1 个字节)
废水数据:
数据头 | 有效数据长度 | 厂家ID | 类别ID | 累计流量 | 过流时间 | 断流时间 | Cod |
0X0206 | 1byte | 1byte | 1byte | 4byte | 4byte | 2byte | 3byte |
氨氮 | pH | BOD | TOC | 空余 | 错误代码 | 校验 | 数据尾 |
2byte | 2byte | 2byte | 2byte | 1byte | 1byte | 2byte | 0X03 |
烟气数据:
数据头 | 有效数据长度 | 厂家ID | 类别ID | 烟气流速 | 烟尘浓度 | SO2 | NOx |
0X0206 | 1byte | 1byte | 1byte | 3byte | 2byte | 2byte | 2byte |
CO | O2 | 大气压 | 温度 | 湿度 | 空余 | 错误代码 | 校验 | 数据尾 |
2byte | 2byte | 3byte | 2byte | 2byte | 2byte | 1byte | 2byte | 0X03 |
注:过流、断流时间单位为: 小时 所有数据类型为整型
内蒙古自治区重点污染源在线仪表 RS232 通信协议补充说明:
1. 数据采集系统的结构
主从结构
| ||||
2 .在线仪表的 RS232 输入 / 输出接口 DB9/M (针)安装在机壳上,与记录仪连接时不需打开在线仪表的柜门。
3 .记录仪向在线仪表发送取测量数据的指令格式
废水类: (共 31 字节)
0206 00 01 00 01 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C 59 03
废气类: (共 31 字节)
0206 00 01 01 01 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B5A 03
4 .在线仪表应答的数据格式(共 31 字节)
当在线仪表接收到记录仪的取测量数据指令后,按利达科信的 RS232 协议格式向记录仪传送测量数据。
举例如下:
废水类:
★ 累计流量的应答数据 格式 :
如:累计流量: 73751990 m3 [ 04655DB6 ( HEX ) ]
0206 0400 0004655DB6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0010E0 03
有效数据长度 =04
★累计流量+COD 的 应答数据 格式:
如:累计流量: 10837430 m3 [ 00A55DB6 ( HEX ) ]
COD : 58 mg/L [00003A (HEX) ]
0206 0700 0000A 55DB6 FFFFFFFFFFFF00003A FFFFFFFFFFFFFFFFFF0073DD03
有效数据长度 =07
★COD 应答数据 格式:
如: COD : 950 mg/L [0003B6 (HEX) ]
0206 0300 00FFFFFFFFFFFFFFFFFFFF0003B6 FFFFFFFFFFFFFFFFFF00F 4ED 03
有效数据长度 =03
★BOD 应答数据 格式:
如: BOD : 498 mg/L [01F2 (HEX) ]
0206 0200 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01F 2 FFFFFF007B68 03
有效数据长度 =02
废气类:
★ 瞬时烟气流速的应答数据 格式 :
如:瞬时烟气流 速 : 219826 Nm3 /S [ 035AB2 ( HEX ) ]
0206 0300 01035AB2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0010E0 03
有效数据长度 =03
★瞬时烟气流 速 + 烟尘浓度+SO2+NOX+O2+ 烟道气压+ 温度+ 湿度的应答数据格式:
如:瞬时烟气流 速 : 10837430 Nm3 /S [A55DB6 ( HEX ) ]
烟尘浓度: 158 mg/Nm3 [009E (HEX) ]
SO2 : 58 mg/Nm3 [003A (HEX) ]
NOX : 59 mg/Nm3 [003B (HEX) ]
O2 : 14% [000E (HEX)]
烟道气压: -750Pa [8002EE (HEX)]
温度: 94 ℃ [005E (HEX)]
湿度: 78% [004E (HEX)]
0206 1200 01A 55DB6 009E003A 003BFFFF 000E8002 EE 005E004EFFFF001C 8E 03
有效数据长度 =18- à 12 (HEX)
说明 :
1. 协议中的 【 有效数据长度 】
对于能测量多个污染因子的在线仪表应在仪表的显示屏幕上方便地设置有效数据长度。
2 .协议中的 【 厂家 ID 】
是在线仪表生产厂家唯一的 ID 号( 1Byte ),由在线仪表生产厂家自己设定;或由环保局指定;
3 .协议中的烟气流 速 为瞬时烟气流 速 ,单位为 Nm3 ;
4 .协议中的大气压为烟道气压,单位为 Pa ;
烟道气压为正压:数据的最高位为 0 ;
如: +750 Pa=0002EE (HEX)
烟道气压为负压:数据的最高位为 1 ;
如: -750 Pa=8002EE (HEX)
5 .协议中的烟尘浓度、 SO2 、 NOX 、 CO 为标态输出,单位为 mg/Nm3 ;
6 .协议中的 O2 、湿度为相对量,单位为 % ;
7 . pH 测量数据保留小数点后 1 位。协议中的 pH 数据为真实测量数据乘 10 后的十六进制整型数。如:实测 pH 为“ 7.8 ” ,串口输出数据为“ 004E (HEX) ”。
8. 协议中的 CRC 校验码可以填写任意两个 16 进制数据 , 即可不进行校验 .
CRC 算法详解 :
Polynomial: x^16 + x^12 + x^5 + 1 (0x1021)<br>
Initial value: 0x0
This is the CRC used by the Xmodem-CRC protocol.
The following is the equivalent functionality written in C.
/code
uint16_t crc_xmodem_update (uint16_t crc, uint8_t data)
{
int i;
crc = crc ^ ((uint16_t)data << 8);
for (i=0; i<8; i++)
{
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
return crc;
}
/endcode */