工程排查

设备明明有数据就是取不出来,怎么排查

现场最常见的一句话是「设备屏幕上都有,你软件怎么读不出来」。这类问题九成不是软件写错了,而是链路上某一层没通。按自下而上的顺序走一遍,二十分钟内基本能定位。

为什么要按顺序排查

「取不出来」是症状不是原因。从设备里的一个变量到软件里的一个数值,要穿过物理连接、 IP 可达、端口开放、协议握手、权限校验、地址寻址、数据解析, 任何一环断了表现都一样:界面上没数。下面六步不能颠倒。

六步排查顺序

第 1 步:物理层——线到了没有

以太网看网口 Link / Act 灯与交换机对应口。串口更麻烦: RS485 的 A/B 接反是高频问题,现象是完全没有应答而不是报错, 不确定就直接对调试一次;还要看总线是否手拉手、两端有无 120Ω 终端电阻、屏蔽层是否单端接地。 485 线与动力线同槽会造成时好时坏的误码,最容易被误判成软件问题。 判断动作:以太网 ping 目标 IP,串口用通用工具发一帧看有无回应。

第 2 步:地址——IP、网段、站号、槽号

ping 不通先查地址:是否同一网段、掩码是否一致、设备 IP 有没有被现场改过; 还要防IP 冲突,表现是通信断断续续、ping 响应时间跳变很大。 协议层地址也在这一步:Modbus 站号、S7 机架号与槽号、三菱 MC 的网络号与站号、 DL/T 645 的 6 字节通信地址。这些错了大多没有任何应答, 和线没接上一样。铭牌上的资产编号往往不是通信地址。

第 3 步:权限——设备愿不愿意让你读

这一层最容易被忽略,现象很像地址错误:能建链、但请求被拒或返回空。

设备类型权限相关的检查项
数控系统数据访问的选装功能位是否购买;未开通时基础数据能读、刀具与宏变量类函数报错
PLC(S7 系列)DB 块「优化的块访问」是否勾选、CPU 保护等级、是否允许 PUT/GET
机器人控制器通信选件是否装、外部访问模式是否开、示教器模式是否允许通信
仪表 / 电表是否本地锁定或处于菜单编辑状态,部分表菜单操作期间不响应
OPC UA 服务端匿名访问是否允许、证书是否被信任、账号与安全策略是否匹配
并发连接数连接数是否被占满;新连接会被拒绝或挤掉旧连接

判断动作:换通用第三方工具读同一个点,读不到就在设备侧。

第 4 步:协议参数——版本、端口、超时、串口配置

以太网侧看端口号(S7 是 102、Modbus TCP 是 502、MC 端口在 PLC 参数里自设)、 协议变体(Modbus TCP 与 Modbus RTU over TCP 混用直接解析失败)、 规约版本(同族协议常有新旧两版互不兼容,读不通就试另一版)。 串口侧看波特率、数据位、校验位、停止位,校验位最常出错—— 按 8N1 配一个要求 8E1 的设备,大部分帧校验失败、偶尔碰巧读到正确值。 超时太短会频繁断链重连,跨网段需放宽,应做成界面可配。

第 5 步:防火墙与网络策略

典型症状:ping 通、端口连不上。查三处:Windows 防火墙(出站规则也要看)、 网络设备上的 ACL 或 VLAN 隔离策略、杀毒与终端管控软件的网络防护模块—— 后者不在防火墙列表里,但会静默拦截长连接。判断动作: Test-NetConnection 目标IP -Port 502 直连端口,拒绝或超时说明中间被拦。 可临时关掉防火墙定位一次,通了再回去加精确放行规则, 不要长期关着防火墙交付。

第 6 步:数据本身在不在那里

前五步都通、其他点也有数,就差这一个——这时要质疑需求本身: 这个值在可通信的存储区里真的存在吗? 屏幕上的数字可能来自 HMI 本地脚本、运动控制卡或伺服驱动器内部,通信区里没有对应变量。

另一种是地址对错了:不报错、返回一个数,但离谱或永远不变。 验证方法只有现场手动改值——点动一个轴、改一次转速设定、触发一次报警, 看对应点位跟不跟着变。同时核对数据类型与字节序:16 位当 32 位读、大小端搞反、倍率没除。

症状与对应层级速查

症状最可能的层级
ping 不通第 1 步物理层 / 第 2 步地址与网段
ping 通但端口连不上第 5 步防火墙 / 第 4 步端口号
连接后立刻断开第 3 步并发数已满 / 第 4 步超时参数
完全无应答,不报错第 2 步站号错 / 第 1 步 A、B 接反
基础数据能读,某几项固定报错第 3 步权限:选装功能位或块访问
时通时不通、偶尔校验失败第 1 步接线干扰 / 第 4 步校验位
不报错但数值离谱或恒定第 6 步地址、类型、字节序或倍率
其他点都有数,就这一个没有第 6 步该变量在通信区里不存在

反向查用:症状落在哪一行就跳到对应层级,但仍不要跳过前面层级的确认动作。

工程上的两点建议

第一,采集软件必须能输出分层日志:连接建立与断开、协议握手报文、 请求与应答的原始报文(可开关)、解析后的数值与品质。日志只写「读取失败」, 这六步每一步都要靠外部工具重做。

第二,点表要在开发前定稿并双方签字。第 6 步最贵, 因为它往往意味着设备侧要改 PLC 程序,而那时设备可能已进厂调试。写法见 上位机软件外包怎么切分才不留坑。 敏洽承接软件与算法,硬件采购、安装与接线由客户负责,可推荐长期合作供应商。 协议范围见内置 45 个驱动的 SCADA 数采与监控软件, 或致电 400-814-5288。

常见问题

不能。ping 走的是 ICMP,只证明 IP 层可达,不证明目标端口开着、协议服务在跑、也不证明设备愿意接受你这一路连接。ping 通但读不到数据是最典型的情形——下一步应该用端口连通性测试(telnet 或 Test-NetConnection 到具体端口,如 S7 的 102、Modbus TCP 的 502)来确认传输层,再往上查协议参数与权限。
因为地址算对了格式、算错了位置。绝大多数工业协议对地址只做范围校验,不做语义校验:你要 DB1.DBW10 它就给你那两个字节,至于那两个字节是不是你想的那个变量,协议不管。所以「不报错但数值离谱」几乎一定是点表问题——寄存器区选错、起始地址偏移(0 基与 1 基)、字节序(大小端)、数据类型(16 位当 32 位读)或者缩放倍率没除。这类问题必须靠点表核对与现场手动改值验证,不能靠猜。
要看协议与设备的并发连接数上限。很多控制器的连接资源是有限的:部分 CNC 系统同时只允许一到三个连接,一些 PLC 的 CPU 通信资源也有明确上限,串口更是天然独占——一条 RS485 总线上同时挂两个主站会直接互相冲突。稳妥做法是一台设备只保留一路采集,由这路采集把数据分发给多个上层系统,而不是每个系统各连一次。
这也是常见结论之一。设备屏幕上显示的数字不一定存在于可通信的存储区里——有些是 HMI 本地脚本算出来的,有些在运动控制卡或伺服驱动器内部,PLC 侧根本没有对应变量。这种情况只有两条路:让设备厂在 PLC 程序里把这个值算出来并映射到通信区(改程序,要排期),或者用可采到的原始量在上位机侧重算。前者更可靠,后者更快,选哪条取决于项目节奏。

有具体设备清单或工件样品,可以直接给判断

提供设备型号、PLC 品牌与需要采集的数据项,或提供被检工件照片与精度要求,敏洽可先给出可行性判断与硬件前置条件,再谈软件工作量与报价。