一句话结论:先看报文,别先拆探头
“分析仪面板上数字一直在跳,数采仪指示灯也是绿的,平台那边就是没曲线。”这是华东某印染厂一位运维工程师在电话里跟我们描述的原话。我们让他把数采仪上行的日志导出来看,十分钟里只有 1013、1014 这两条对时命令在往返,2011(上传监测数据)一条都没出现。链路是通的,数据从来没发出去过。
类似的上传异常,绝大部分不是高锰酸盐指数分析仪本身测不准,而是出在三个地方:数采仪组态里没把 w01019 这个因子挂上;挂上了但 CP 报文里的 Rtd 字段取不到值,被填成空;报文确实发上去了,平台侧因子编码和现场不一致,被判为无效数据直接丢掉。这三件事的共同点是——看面板看不出来,只有看报文才看得出来。
把故障拆成四层,一层一层排
第一层:协议与编码
HJ 212 协议里每个监测因子有自己的编码。化学需氧量是 w01018,高锰酸盐指数是 w01019,两者不是一回事,在改造项目里填错的情况非常常见。有些现场原来装的是 CODcr 仪,后来换成了高锰酸盐指数分析仪,数采仪组态没跟着改,还是按 w01018 往上发,平台用自己的因子表一查对不上,静默丢包。现场表现就是“发送正常、接收正常、平台无数据”。
另一个容易忽略的是 CP 里因子名的写法。HJ 212 用 因子编码-参数名 的格式,比如 w01019-Rtd、w01019-Flag、w01019-Avg,中间是短横线,不是下划线也不是点。有些组态模板里写成 w01019_Rtd,数采仪照样发出去,平台解析失败,日志上一样显示“已发送”。
第二层:报文与字段
一包正常的 2011 报文大致是这样:
QN=20240115103000123;ST=32;CN=2011;PW=123456;MN=XXXXXXXX;Flag=5;CP=&&DataTime=20240115103000;w01019-Rtd=3.62,w01019-Flag=N&&
- QN:请求编码,17 位,前 14 位是时间戳、后 3 位是毫秒或随机数。QN 重复会被平台判重丢掉。
- CN:命令编码。2000–2999 这一段都是现场机上传监测数据,2011 是其中最常用的;2051 是平台对数据包的应答;3011 用于上传运行状态;1013、1014 是对时。
- PW:访问密码,平台侧配错就整包拒收。
- MN:设备唯一标识。两台设备 MN 重复,后上线的会把先上线的顶掉,日志里看着都“连接成功”。
- Flag:四位数据标志位,分别表示是否拆包、是否加密、是否带包序号、是否带时标。
- CP:指令参数,监测值都在这里。Rtd 是实时值,Avg 是平均值,Flag 是数据标记位(N 正常、F 故障、M 维护、C 校准、D 停运)。
报文末尾还有 CRC 校验,HJ 212 用的是 CRC16,多项式 0xA001,结果以四位十六进制跟在最后的 & 后面。校验不过,平台不会回 2051。
上传异常里最常见的一种是:Rtd 后面是空的,写成 w01019-Rtd=;。这种报文语法上合法,平台也收,但会当无效值存下来。为什么会空?多半是数采仪采集侧没取到分析仪的当前值——分析仪正在测量、正在校准、或者串口回的是“----”这类占位符,数采仪解析不出来就把值丢了。
第三层:网络与链路
TCP 长连接不是连上就一劳永逸。常见断点有三个:现场 4G 路由或防火墙对空闲连接做超时清理,数采仪以为自己还连着;平台侧调整了 IP 白名单或端口,现场没同步;MN 冲突导致设备互相顶替。
判断方法很直接:看数采仪有没有收到平台的 2051 应答。发了 2011 却一直收不到 2051,问题在链路或平台侧;连 2011 都没发出去,问题在设备侧或组态。
第四层:设备与分析仪输出
高锰酸盐指数分析仪的输出一般是 RS232 或 RS485,参数常见 9600、8 位数据位、无校验、1 位停止位。这里出问题通常是三种:波特率对上了但校验位不对;分析仪输出的是自定义 ASCII 字符串,数采仪却按 Modbus RTU 去解析;分析仪处于缺试剂、缺标液、加热异常状态,输出的是固定值或故障码,数采仪原样采上来,看着“有数”,其实是死数。
为什么顺序必须是报文、编码、组态、探头
顺序本身就是效率。报文是唯一不会说谎的东西,它同时反映了组态、采集、链路三件事。先看报文,一次就能把范围砍掉一大半:
- 有 2011、有 2051,平台没数据——问题在平台侧,因子表或入库规则。
- 有 2011、没有 2051——链路、密码或 MN 的问题。
- 有 2011、Rtd 为空——采集侧没取到值,往设备层走。
- 根本没有 2011——组态没启用因子,或者上传周期被设成了很大的值。
反过来,先拆探头、先换试剂、先重新标定,是最费时间的一条路——探头好坏和报文发不发得出去,本来就没有因果关系。
判断标准和处置动作
| 现象 | 判断 | 动作 |
|---|---|---|
| 日志有 2011,平台无数据 | 平台侧因子未匹配 | 核对 w01019,请平台确认因子表已开通 |
| 发了 2011,收不到 2051 | 密码、MN 或链路异常 | 核对 PW、检查 MN 是否重复,抓包看 TCP 握手 |
| w01019-Rtd 为空 | 采集侧取值失败 | 查分析仪串口输出,确认是否在校准或故障状态 |
| 报文尾部 CRC 不匹配 | 组态模板错误 | 更换模板或手工按 CRC16/0xA001 复算 |
| 数据有,但长期是同一个值 | 死数 | 查试剂余量、标液、加热模块和测量周期 |
| 设备停机,上传仍为 N | 数据标记位没配 | 按 F、M、C、D 分别配置标记位 |
三个最容易踩的坑
第一个:把“连接成功”当成“数据正常”。TCP 建连成功、1013 和 1014 对时能往返,只能说明链路和密码是对的,完全不能说明 2011 发得出去。很多现场看到连接状态是绿色就不再往下查了,问题恰恰卡在后面。
第二个:分析仪面板有数,就认为数采仪一定收到了。串口是单向的,分析仪屏幕上有数字不等于字节已经出了串口;就算出了串口,格式不对、校验位不对,数采仪也解不出来。真正要确认的是数采仪收帧日志里有没有那一行。
第三个:故障或维护时上送 0,而不是打 Flag=F 或 M。0 会被平台当作有效数据参与统计和有效性判定,有的地方还会拿它去做异常判断;按 HJ 212 该打 F(故障)或 M(维护),平台会按无效数据处理。这个坑在换试剂、校准期间出现得最多。
常见问题
“分析仪正在校准,我这个情况到底要不要传?”
要传,但要打标记。校准期间应当上送,Flag 填 C;维护填 M,故障填 F。直接不发或者发 0,都会让平台侧的数据完整性和有效性出问题。
“平台说没数据,可数采仪屏幕上明明有数,到底谁的锅?”
先导日志,别争。日志里有 2011 且有 2051,责任在平台侧解析和入库;有 2011 无 2051,责任在链路或参数配置;没 2011,责任在组态或采集侧。三种情况处置方式完全不同。
“w01019 和 w01018 我到底填哪个?”
看你现场装的是什么表。测高锰酸盐指数的填 w01019,测化学需氧量的填 w01018。换表不改组态,是改造项目里最常见的一类上传异常。
“换了台新的高锰酸盐指数分析仪,MN 要不要跟着改?”
MN 跟的是数采仪和排污口,不跟分析仪。换探头不用改 MN,但要确认新分析仪的串口参数、输出协议、量程和原来一致,否则数采仪取不到值,报文里的 Rtd 还是空。