“数采仪上显示连接成功,平台的实时数据页面刷新十几次还是空的。”这是华东一家印染厂运维工程师打电话过来的原话,设备是 PS-S01环保数采仪,走 HJ 212 协议往属地监管平台传。这种情况我们一个月要接十几通电话。答案先放在前面:绝大多数不是“网断了”,而是应用层没对上,或者平台把包收下了但不认。真正的物理链路故障占比很低,更常见的是协议版本、设备唯一标识 MN、因子编码、Flag 数据标记、QN 重复这几处出问题。
原因分四层来看,一层一层往里剥
协议层:报文发出去了,平台解析不出来
- 协议版本混用。HJ 212-2017 的数据段用 && 包裹,报文尾部不带校验位;HJ/T 212-2005 则在末尾跟四位十六进制的 CRC。如果设备按 2017 版发,平台还停在 2005 版的解析程序上,平台日志里通常只有一句“收到数据、解析异常”,TCP 层却是完全正常的。这是老平台改造期最常见的一种。
- MN 设备唯一标识不对。平台是按 MN 建档的,MN 写错一位、大小写不一致、复制时前后带了个空格,平台就把这包数据归到“未注册设备”下,包收下了,排口下面一条没有。
- PW 访问密码没同步。ST、MN、PW 是一个三元组,平台侧改过密码而设备没改,表现同样是“连接正常、数据为空”。
- 因子编码对不上。COD 一般用 w01018,氨氮用 w21003,如果平台按别的编码建的表,或者用了带后缀的写法,数据进来也匹配不到因子列上。
- CN 命令码发错。平台只收小时数据,设备却一个劲发分钟数据;或者设备只发 1011 实时数据,而平台要求 1013 小时数据、1014 日数据。命令码对不上,平台一般不会报错,只是不入库。
- Flag 数据标记。N 是正常,M 是维护,C 是校准,F 是故障,D 是断电。设备如果长期挂在某个非 N 的状态上,平台在统计时会把这一批数据整体剔掉。
一条完整的 2017 版小时数据报文大概是这个形状:QN=20240612090000123;ST=32;CN=1013;PW=123456;MN=PS01TEST001;Flag=5;CP=&&DataTime=20240612090000;w01018-Avg=32.6,w01018-Flag=N;w21003-Avg=5.41,w21003-Flag=N&&。现场核对时,就拿着平台侧收到的原始报文和这条逐字段比,比看十遍说明书都快。
网络层:包根本没离开现场
- 专网卡欠费或者流量包用尽,4G 信号满格但出不去,设备侧照样显示链路建立。
- 平台换了 IP 或端口,现场只改了一半;或者域名解析失败,DNS 没配。
- 防火墙、安全网关只放行登记过的源地址,换了卡换了 IP 就拦掉了。
- 心跳间隔设得比中间 NAT 会话保持时间还长,连接被静默回收,设备还以为自己在线。这种故障的典型特征是:重启后好一阵,过几个小时又断。
设备层:有连接,但手里没数据
- 数采仪和上位仪表之间的 485 通讯断了,仪表地址、波特率、校验位改过其中之一,数采仪照样按点上传,只是数据段里是空值或者补零。
- 系统时钟跑偏。没有做 NTP 对时的设备,时间跳到未来或者退回几年前,平台按时间窗口过滤,直接丢掉。
- 上传通道没勾选,或者只勾了部分因子,配置文件里少一行,平台上就少一路。
- 本地存储写满,新的采样值写不进去,读出来全是上一次的缓存。
平台层:包到了,规则把它挡住了
- 排口没启用,或者新装的因子在平台上还没开通。
- 平台的接收规则只认整点,设备按分钟发,多余的全丢。
- 部分省份的平台对数据有效性有自己的审核规则,超量程、恒值、突变都会被打标记,页面上就不显示。
- 平台侧的维护窗口,或者对方接口临时限流。
排查顺序:为什么先看平台、最后才动设备
现场很多人习惯一到就先登设备、翻参数,改一圈再回来看,结果越改越乱。合理的顺序是按“改动成本”从低到高排:
- 第一步看平台。不用到现场,一个电话或者一个后台账号就能确认平台到底有没有收到包、最后接收时间是什么时候。这一步能把问题一刀切成两半——是“没送到”,还是“送到了不认”。
- 第二步抓报文。能拿到原始报文,就能判断协议版本、MN、PW、CN、因子编码这些字段对不对,比猜快得多。
- 第三步才测链路。网络层的原因好验证,但排查动作要动现场网络配置,放在协议之后做,避免白折腾。
- 第四步最后动设备参数。改设备参数最费事,需要现场或者远程登录,而且容易把原本正常的配置改坏。前面三步都排除了,再动它。
每一步的判断标准和处置动作
| 现象 | 判断 | 动作 |
|---|---|---|
| 平台“最后接收时间”停更,设备侧“最后发送时间”还在往前走 | 报文发出去了但没到,或者到了被中间设备丢弃 | 在设备侧开报文日志,同时让平台查接收日志,两边时间对齐比对 |
| 平台有接收记录、报文条数正常,排口下却查不到数据 | 解析失败,或 MN、因子编码对不上 | 拷一条原始报文,逐字段核对 ST、MN、PW、CN、因子编码、Flag |
| 平台显示设备离线,设备侧显示在线 | 心跳没发出去,或心跳被平台判为无效 | 确认 1000 心跳命令是否启用,间隔是否超过平台要求 |
| 报文能收到,但数据段为空或全是 0 | 数采仪和仪表之间的通讯断了 | 查 485 接线、仪表地址、波特率、校验位,用 3020 命令反向提取现场端状态验证 |
| 平台能通过 9012、9013 提取到历史数据,实时页面却是空的 | 主动上传通道有问题,被动提取正常 | 说明设备和数据都没问题,重点查上传使能、CN 命令码和平台接收规则 |
三个最容易误判的坑
坑一:把 TCP 连接成功当成数据已经送达
链路指示灯亮、界面显示已连接,只能证明 socket 建起来了,跟应用层收没收到是两回事。中间经过 NAT 或者安全网关时,会话超时被回收,设备侧仍然认为连接在,后面发出去的报文会被静默丢掉,没有任何报错。判断办法很简单:看平台的最后接收时间和设备侧的最后发送时间是不是同时在推进,只要有一个停住,就不是同一件事。
坑二:数据上去了,被 Flag 标记判成无效
现场调试时把设备挂在维护或校准状态,调完忘了切回 N,平台上数据一直显示“无有效数据”,但报文条数是正常在涨的。另一个同类型的坑是单位:仪表出的是 μg/L,平台按 mg/L 建的表,数值一下子超量程,被平台按异常剔除。这两件事在报文里都看得见,只是没人愿意逐字段看。
坑三:补传数据被平台按 QN 去重丢掉
断网几天之后补传历史数据,很多人图省事,把所有补传包的 QN 直接取当前时间,结果几十条报文的 QN 撞在一起,平台按 QN 去重,只留一条。补传时 QN 必须唯一,并且要跟数据时间对应上,DataTime 字段写数据实际产生的时间,不能写发送时间。
关于这台设备本身
PS-S01环保数采仪在现场排查时比较好用的两点:一是报文日志能直接导出原始报文,不用外接抓包工具;二是支持 3020 现场端状态提取,平台下发一条就能把设备当前的通道状态、仪表通讯状态拉回来,省掉一趟现场。但工具好用不等于可以跳过顺序,前面那套“先平台、再报文、后链路、最后设备”的路子,跟设备型号无关,换谁都得这么走。
客户常问的几个问题
问:数采仪上显示连接成功,是不是就说明网络没问题?
不能这么看。连接成功只说明 TCP 建链成功,数据有没有被平台收下、有没有入库,是另外两件事。要看平台的最后接收时间,那才是最直接的证据。
问:平台说收到数据了,可我就是看不到曲线,这算谁的问题?
先别急着分责任,拿一条原始报文对字段。多数情况是 MN 没备案、因子编码不匹配,或者 Flag 一直挂在非 N 的状态上。这三样在报文里都能直接看出来,对一遍就有结论。
问:我把历史数据补传上去,平台怎么一条都没收?
大概率是 QN 重复。补传时每条报文的 QN 要唯一,DataTime 写数据实际产生的时间。还有些平台对补传数据有时间窗口限制,超过多少天的直接拒收,这个要提前问清楚。
问:平台换地址了,我只改 IP 行不行?
不行,端口、协议版本、MN 备案信息通常要一起确认。有些平台迁移后解析程序也换了版本,只改 IP 会出现“连得上、传不进”的情况,跟这次说的是同一类故障。
说到底,环保联网这件事,屏幕上的“连接成功”只是一个很浅的状态。真正决定数据能不能上平台的,是那串用分号隔开的报文里每一个字段有没有对上。下次再遇到平台空白,别急着重启设备,先要一条原始报文。