结论先说:不是网络不通,是报文没被平台认下来
一台替代进口的环保数采仪装好以后,屏幕上 4G 在线、TCP 已连接、心跳灯正常闪,平台侧却一直是离线或数据为空。这种情况十有八九不是链路断了,而是应用层报文没有被平台接受。出现频率最高的三个原因是:MN(设备唯一标识)和平台登记的不一致;QN 时间戳跟平台时钟差太多,被判成超时数据丢弃;报文尾部该带的 CRC 校验没带,或者计算范围跟平台要求的不一样。TCP 连接成功只说明三次握手完成了,跟平台收到并归档你的数据是两件事,这一条是后面所有排查的前提。
现场的原话:连接成功,平台就是没数据
华东一家化工园区的排污企业做站房改造,把原来那台进口设备换掉,做环保数采仪替代进口的切换。新设备通电、插卡、按平台给的地址配好 IP 和端口,调试软件上显示已连接,心跳报文也按间隔在发。运维工程师打电话过来的原话是:“数采仪显示连接成功,平台就是没数据。”平台界面是灰的,历史曲线空的,可设备本地历史库里明明存着数据。
这种设备端有数据、平台端看不到的状态,本质是链路层通了、应用层没谈拢。下面按协议层、网络层、设备层、平台层拆开看。
一、协议层:报文本身不合平台的口径
HJ 212 这套报文看着简单,字段却一个都不能错,替代进口时最容易在这一层翻车。
- MN(设备唯一标识):长度、大小写、有没有补零,必须跟平台注册的一模一样。少一位或者多一个大写字母,平台就当陌生设备直接丢弃,日志里啥也看不到。
- ST(系统编码):废水和废气站房取值不同,有的平台要求跟排口编号对应,抄错一位就对不上账。
- PW(访问密码):多数平台是明文比对,平台改过密码而设备侧没同步,报文发上去一律不应答。
- CN(命令码):2011 是小时数据,2051 是分钟数据,2000–2999 这一段是数据上传类,3020 这一类是运行状态,9021 是心跳(也有平台用 1000 做心跳,以平台下发的文档为准)。只发心跳不发数据,平台照样判你没数据。
- QN(时间戳):17 位,精确到毫秒。设备掉电重启后时钟归零,QN 变成几年前的时间,平台直接按超时处理。
- Flag(标志位):4 位。第一位是拆包,第二位是加密方式,第三位是有没有版本号,第四位是有没有 CRC。Flag 写 5 和写 4,平台走的是完全不同的解析路径。
- CP 数据段:DataTime 后面跟污染物编码加后缀,-Rtd 是实测值、-Avg 是均值、-Flag 是数据标记;平级字段用分号分隔,复合字段内部用逗号分隔,错一个符号整段解析失败。
- 报文结构:以 ## 开头、&& 结尾,部分省份还要求在尾部追加 4 位十六进制 CRC。CRC 的计算范围,各家平台对是否包含结尾的 && 处理不一致,这是替代进口时最容易产生分歧的地方。
二、网络层:通与不通之间还有一大片灰色地带
- 长连接被中间设备的老化机制清理。4G 网络和部分防火墙对空闲会话有老化时间,设备以为还连着,会话其实早被清掉了,表现就是平台侧看设备时有时无。
- 定向卡白名单。运营商定向卡只放通平台的主 IP,平台做双机切换或者改了域名,报文就出不去。
- 端口和专网。有的平台不用标准端口,或者要求走专网、走 VPN,能 ping 通不代表端口能通。
- 路由选错。站房里同时有办公网和数采网时,默认路由指到办公出口,报文从错误的网卡发出去。
三、设备层:报文发出去了,但里面是空值
- 串口参数不匹配。波特率、数据位、停止位、校验位,进口仪表常见 8N1,一些老表是 8E1,配错以后能建链,读回来却是乱码。
- 485 地址冲突或仪表未响应。报文照发,但 CP 里的 -Rtd 是空值或固定值(-9999、0),平台判为无效数据不入库。
- 量程与单位。mg/L 和 mg/m³ 弄反,平台按超量程剔掉。
- 设备时钟。没接 NTP,靠平台下发校时,取时间/设时间的命令(1013 一类,不同平台版本略有差异)没跑通,时钟会越走越偏。
四、平台层:设备没错,是口径没对上
- 按 QN 判超时。超过设定时长直接判离线,跟设备发没发没有关系。
- 重复数据丢弃。同一 QN、同一 DataTime 的报文重复上报,平台一般只留第一条。
- 补传窗口有限。部分平台只接收一定时长内的补传数据,设备本地存了很久的历史,恢复通信后一次性推上去,超出窗口的全被丢掉。
- 通道没开。平台侧只给你开了小时数据通道,分钟数据发上去也是白搭。
这四层里,协议层和平台层出问题的概率最高,网络层被冤枉的次数最多。
五、排查顺序:先看平台日志,最后才碰仪表
顺序本身比某一步的具体操作更值钱。正确的顺序是:平台收文日志 → 设备出口报文 → 网络链路 → 采集层。
先看平台日志,是因为它一次就能把问题分成两类:日志里完全查不到这个 MN 的入站报文,说明报文根本没到,往下查发送和网络;日志里能看到报文但应答是错误,说明到了但不合格,问题在协议字段;日志里报文正常、应答也成功,前端还是不显示,那就是平台归档或展示的问题,跟设备无关。这三条岔路,只有平台日志能一次分清。
反过来,一上来就拔串口、量电压、换仪表,是最费时间的做法。很多现场换了两块表、换了三张卡,最后发现是 MN 里多了一个空格。换设备做环保数采仪替代进口的时候尤其如此,因为进口设备原来的配置里,很多字段是厂家私有默认值,不逐字核对根本看不出差别。
六、每一步的判断标准和处置动作
第一步:查平台收文日志
- 现象:通信日志里查不到这个 MN 的任何入站报文,连心跳都没有。
- 判断:报文没到平台,问题在发送端或链路。
- 动作:转第二步,抓设备出口报文。
第二步:抓设备出口报文
- 现象:调试口能看到完整报文,## 开头、&& 结尾。
- 判断:逐字段核对 MN、ST、PW、CN、QN、Flag、CP,再看尾部 CRC。
- 动作:与平台下发的接入文档逐字比对;MN 复制粘贴不要手打,QN 用平台时间做基准校一次。
第三步:验网络
- 现象:ping 通但端口连不上,或者拨号成功但域名解析失败。
- 判断:链路层通、传输层不通。
- 动作:用设备自带的连接测试或命令行 telnet 平台 IP 端口;换一张普通卡对比一下定向卡白名单;把心跳间隔调到平台要求的范围以内。
第四步:查采集层
- 现象:报文完整,但 -Rtd 为空、为 0 或长期不变。
- 判断:设备在发,但没读到仪表的值。
- 动作:核对串口四参数和 485 地址,单独挂一台表测试;确认量程和单位与平台配置一致。
七、替代进口时最容易误判的三个坑
坑一:把“TCP 连接成功”当成“数据已送达”
连接成功只代表握手完成,报文可能发出去就被平台丢掉,也可能压根没发。判断依据是平台有没有回成功应答,而不是设备屏幕上的绿灯。
坑二:设备时钟没校,补传的历史数据全被丢弃
换设备后经常只配了 IP 和 MN,没跑校时。设备本地时间还停在出厂状态,一旦断网恢复,历史数据按旧 QN 推上去,平台一律按超时丢弃。现场看到的就是“数据发了但一条没进库”。
坑三:MN 沿用旧的,多个站房撞号
为了省事直接照抄原来进口设备的 MN,结果两个站房用同一个标识,平台按 MN 归档,后到的覆盖先到的,两边数据都不全。替代进口时,MN 必须在平台侧重新确认,不能靠“以前就是这么配的”。
八、FAQ
问:我这台数采仪显示已连接,平台就是没数据,是不是平台那边的问题?
先别下结论。让平台调一下收文日志,看你的 MN 有没有进来过。一条都没有,问题在你这边;有报文但应答是错误码,多半是字段对不上;有报文有正确应答而前端不显示,才是平台侧的事。
问:换成国产数采仪以后,平台说我们老是断线,是不是设备不稳定?
先看平台判离线的依据。多数平台是按 QN 判超时的,设备本地时钟偏了,报文正常发也会被判离线。另外看一下心跳间隔和平台的会话老化时间,间隔设得过长,链路会被中间设备提前清掉。
问:原来进口设备那些参数,是不是照着抄一遍就行?
不能全抄。IP、端口、MN 这些要按平台最新登记的信息重新确认;串口参数要按现场实际挂的仪表来定;报文格式各家实现有差异,尤其是 Flag 位和尾部 CRC,按平台下发的接入文档重配一遍更稳妥。
问:平台说报文校验不过,可我们设备这边显示发送成功了,到底谁的问题?
发送成功只代表报文从串口或网口出去了,不代表对方认。校验不过通常是 CRC 的计算范围跟平台不一致,或者 Flag 里声明了带 CRC 实际没带。用抓包工具把原始报文导出,拿平台文档逐位对一遍,一般十分钟内能定位。