现场案例集
不是「请这样做」,而是「发生了这样的事,这样解决了」的记录。 只收录了2026年2月至9月在实际现场遇到并解决的内容。
1. 现场安装 · 网络
PLC ping 不通,无法收发数据
- 症状 现场安装后与PLC无法通信。ping无响应。
- 原因 未区分PLC IP与应分配给Edge PC的IP。
- 处理 将Edge PC的IP设置为与PLC同网段·不同主机·相同掩码。出差前在表格中填写两个IP,确认它们互不相同后再出发。
- 确认 若双方通信同时中断,首先怀疑IP冲突。按
ping→ 端口 → read 的顺序逐步缩小范围。
不知道三菱端口,工程师只能干等
- 症状 不知道MC协议端口,工作停滞。
- 原因 三菱没有官方固定端口。 这是在GX Works的「打开设置」中指定的值。
- 处理 只需请工程师明确指定四项 — ① 打开设置画面 ② 协议·打开方式·本机端口 ③ 是否为MC协议专用设置 ④ 允许连接的IP限制。不要用「通信设置怎么做」这种方式打开询问。
- 参考 常见惯例值为内置以太网1025·模块2001,5001·5002为保留端口。5007是库的默认值,不是三菱的默认值。
ping、端口都通,但数值读不出来
- 症状 连接正常,但内存数值无法读入。
- 原因 PLC DB块内存地址值问题。
- 处理 请PLC工程师确认DB块地址值。只要地址正确且连接选项无问题,现场数据已证明Edge侧的扫描没有问题。此后属于PLC侧的处理范畴。
关闭配电柜门后通信变得不稳定
- 症状 关闭配电柜门后网络极不稳定,打开门则正常。
- 原因 在厚重配电柜内部同时放入了Edge PC、LTE路由器,甚至包括天线。
- 处理 将天线安装在配电柜外部。开孔位置由电气室负责人指定。外部安装时接缝处必须做硅胶密封处理——防止固定不良。
现场勘察漏掉确认项,导致现场施工受阻
- 症状 以为已经准备好了,但现场仍不断出现变量。
- 处理 固定6项勘察清单 — 配电柜结构·机箱种类 / PLC型号·状态 / 网络通信方式 / AP区域ping状态 / Edge PC安装位置 / 天线位置。机箱由Edge迷你PC + LTE路由器 + 二孔接线板组成,必须考虑电源适配器的位置。
无法确定Edge PC的安装数量
- 症状 完成勘察后仍无法确定设备数量。
- 原因 未能确保采集标签数量。 需要标签数与采集周期才能计算每台设备的负载并确定数量,但当时没有清单,且安装位置有限,难以追加安装。原本假设1:1映射,但客户要求1:N。
- 处理 勘察前先获取 ① 各业务场所PLC标签清单及数量 ② 安装信息表单(PLC/SCADA · IP/PORT · 协议) ③ 新增区段网络构成方案。
PLC没有以太网口,或被要求经由SCADA PC采集
- 症状 以太网TCP直连的前提不成立。遇到「从连接PLC的PC上取不就行了吗」的要求,或多台PLC仅记录在SCADA PC的DB中的结构。
- 处理 勘察时必须确认PLC是否有以太网口 / 是否经由SCADA / SCADA DB种类及记录方式,提前确定采集方式。
接入测试工具后采集中断
- 症状 验证工具接入后,原有采集被拒绝或受到干扰。
- 原因 在MELSEC这类单连接插槽设备上开启了第二个TCP连接。
- 处理 禁止以下三项。
- 禁止对正在采集的PLC开启第二个连接 — 先停止对应的OPC。
- 禁止write — 工具的一个参数就会触发write。
- 禁止探测超时设为1秒 — 设备accept延迟实测约为2.6秒,应设为3~5秒。
2. 启动 · 开机
启动后所有endpoint无响应 + ping重试日志刷屏
- 症状 请求全部超时(code=000)。
- 原因
dev.mode=EDGE,外部Platform的网页端口已失效,导致启动被阻塞。 - 处理 改为
dev.mode=STANDALONE后重启,待外部恢复后再还原。同时检查server.host。
网页画面每3~4分钟就无响应
- 症状 网页周期性宕机后又恢复。
- 原因 未与Platform连接。 无法连接时,网页上下文会每3~4分钟陷入重载循环。一旦连接成功就会停止。不是网页本身的问题。
- 处理 恢复与Platform的连接是根本解决方法。
更换认证密钥后NPE无限爆发
- 症状 日志中
dm is nullNPE持续堆积,DB相关功能全部失效。 - 原因 密钥错误时,API client初始化会以403硬性失败,导致
DatalakeManager无法初始化,使DB层崩溃。密钥正常时会通过回退机制启动。 - 处理 恢复原密钥后重启。通过启动日志中的**
DataSource initialized — ready**行进行确认。
3. Platform上行(传输)中断
Edge网页和采集均正常,但数据未上传至Platform
这是最常遇到的情形。
-
症状 现场采集和网页均正常,但仅上行中断。网页端口TIME-WAIT堆积超过100个。
-
原因 线路瞬断后,MQTT重连的CONNECT中缺失认证信息,Platform拒绝连接并陷入无限重连。由于认证信息只存在于最初启动路径中,一旦断开,应用无法自行恢复。
-
处理 重启Web应用可恢复会话。防止复发请参见下方watchdog。
-
确认 其特征是「Platform网页端口已打开,但MQTT会话不存在」。
nc -z -w2 <플랫폼IP> <웹포트> && echo ROUTE_OKss -tan | grep -c "ESTAB.*<플랫폼IP>:<MQTT포트>" # 1 정상 / 0 끊김
瞬断仅几秒,却导致数日上行中断
- 症状 瞬断7秒后中断3小时,一次瞬断导致中断11天。
- 原因 与上述相同。由于网页、PLC采集、线路全部正常,无人察觉异常。
- 处理 部署自动恢复(watchdog)。瞬断时长与中断时长无关,应优先处理无监控的设备。
数据未存入Platform,却一直在排查Edge
- 症状 上行正常,但Platform中未留存数据。
- 原因 问题不在Edge,而在Platform存储路径。 在broker之前抓取topic确认Edge发布正常,真正的阻塞点是Platform存储初始化因DB查询超时而永久未初始化。
- 处理 重启Platform服务器。最终恢复是同时解决了多个原因——broker认证文件缺失 + 标签description为null + Platform存储缓冲区停止。
- 确认 存储成功的判定标准不是SSTable的生成,而是目标标签的实际存在。曾有仅看生成就误判为通过的先例。
watchdog自动恢复的配置
- 症状 上行中断必须由人工发现才能恢复。
- 处理 将watchdog三种分别部署为独立服务——线路(仅记录日志)·设备网络(仅记录日志)·Platform会话(重启Web应用)。因为一个失效时其余必须存活,不合并为一个服务。
- 判定 以30秒间隔连续4次(约2分钟)确认特征→重启→15分钟内禁止再次触发。
- 结果 6台部署中误报0次。实际恢复案例为瞬断05:27 → 触发05:39 → 恢复05:40。
安装了watchdog却未自动恢复
- 症状 中断11天,watchdog毫无动作。
- 原因 处于**仅观察(
DRY_RUN=1)**状态。would restart仅记录了1,013次。判定准确,唯一的失败点就在于此。 - 处理 观察部署 → 在1台设备上验证实际重启 → 在正常状态下切换至执行模式。若在中断状态下切换,会立即触发重启。
手动重启命令杀死了自身的shell
- 症状 执行重启命令后shell立即死亡,Web应用宕机3分34秒。
- 原因
pkill -9 -ef tomcat的命令行中含有「tomcat」,匹配到了自身。后面拼接的startup未能执行。 - 处理 将kill与startup分离为独立执行。状态确认时使用类似
pgrep -f 'catalina[.]startup'的方括号写法避免自我匹配。 - 注意
restart.sh末尾带有日志tail,在自动化中调用会导致卡住。
PLC正常,但watchdog报告服务DOWN
- 症状 会话存活,却出现1,422次误报。
- 原因 ① 判定模式遗漏了IPv6-mapped表示法(
[::ffff:<PLC_IP>]:<PLC포트>)。② 作为回退使用的nc在单会话设备上被拒绝。 - 处理 ① 修改模式以同时支持有无方括号两种形式。② 将判定顺序改为优先使用
ss ESTAB被动方式,不存在时才用nc。
重启watchdog后采集中断2分钟
- 症状 修改watchdog设置时Web应用同时被终止。
- 原因 watchdog启动的Web应用被纳入watchdog服务的cgroup,因而一同被终止。
- 处理 90秒后会重新检测并自动重启实现自愈,但仍会产生2分钟中断。变更watchdog设置请在不影响生产作业的时间段进行。
诊断通道401反复记录
- 症状 诊断端口长期处于SYN-SENT状态,日志每2~3秒出现一次诊断认证401。
- 原因 这是Platform侧的问题,由于诊断发送器因版本差异未携带密钥,即使在正常运行组合下也会同样出现401。
- 处理 由于Edge重启无法解决,应将其排除在watchdog触发条件之外。联动是否正常以60秒内是否有实际标签数据进入作为判定标准。
4. PLC采集稳定性
通信稍有波动,采集就反复停止·重启
-
症状 轻微通信波动导致采集反复停止后又重新连接。
-
原因 ping仅失败1次就立即停止采集器。
-
处理 把缓冲机制放在了停止和恢复一侧。NOT_COLLECT 判定本身没有缓冲。
项目 值 ping 周期 · ICMP 超时 5秒 · 800ms ping连续失败多少次才停止采集器(成功则重置) 3次 最近读取成功且新鲜时跳过 ping 的窗口 15秒或采集周期 ×3,取较长者 降为NOT_COLLECT的条件 无缓冲——一个周期内只要有1件错误,或一个值都没收到,就在该周期立即降级 NOT_COLLECT 持续多久才请求恢复(重新连接) 超过60秒 这些无法通过配置更改包括 ping 3次 · 恢复60秒在内,上述各值都是固化在代码中的常量。
app.properties中不存在 对应的键——如需更改,需要进行产品层面的变更。以往有些资料误写为可配置项,实际并非如此。同时取消了按标签的重试机制。 一旦连接断开,所有标签会同时失败,重试只会拖延扫描。 为此改为设置按标签的读取超时,避免单个标签的延迟拖累整个扫描。
连接失败时会启用按连接的重连退避(2026-10-01)。从1秒开始每次加倍,最长等待60秒后再重连。 一旦连接成功或更改了IP·端口,就不再等待而立即重试。
-
结果 短暂的波动可能会在画面上短暂显示为NOT_COLLECT。但不会因此停止采集器或引发重连—— ping 连续失败3次之前不会停止,只有 NOT_COLLECT 持续超过60秒时才会请求恢复。
监控层ICMP误报导致正常采集被停止
- 症状 采集正常进行中,监控却停止了采集器。
- 原因 监控层仅依据ping结果进行判断。
- 处理 将监控标准改为**「有流量即存活证据」**。若最近的read成功且数据新鲜,则跳过探测。
套接字泄漏导致PLC全面拒绝连接50分钟
- 症状 采集、探测、恢复所有连接均被拒绝。
- 原因 废弃驱动时未调用close就丢弃,导致套接字泄漏,且由于是单插槽设备,该套接字永久占用了该插槽。
connected=false只是一个逻辑标志,与TCP套接字是独立的。 - 处理 在移除·替换驱动的代码中必须伴随调用close。
因探测超时,恢复永远无法开启
- 症状 插槽已空闲,但仍无法恢复。
- 原因 设备accept延迟约为2.6秒,而探测超时为1秒,被判定为永久失败。
- 处理 将超时提升至4秒。接入新设备时应通过日志实测连接耗时并验证余量。
上面三个案例症状相同但原因有三层。每修复一个就判断为「已解决」, 但实际上仍有后续原因未被发现。
事故大多出现在启动后1分钟内。应集中观察前3分钟, 只有同时满足启动判定区间 + 15分钟无中断 + 日志0条才可判定通过。
无法确认通信不稳定的原因是否出在线路上
- 症状 无法定位间歇性采集失败的原因区间。
- 观测 实际案例中**连接延迟飙升至平均值的6倍(6,125ms)**后,链路在接下来数天内断开, 在未做任何处理的情况下自动恢复,采集重新开始。延迟骤增是前兆信号。
- 处理 设置常态化质量监控。将1秒间隔的ping以10分钟为单位汇总(丢包率·RTT最小·平均·最大值), 若丢包率达到5%以上,则同时快照记录接口错误计数器和路由信息。判定标准为正常 / 注意5% / 危险10%,日志保留15天。
无法复现丢包状况
-
症状 现场症状无法在内部重现,验证受阻。
-
处理 使用
tc/netem对特定PLC IP的通信人为注入丢包。不影响SSH或其他通信。tc qdisc del dev <NIC> root 2>/dev/null # 항상 먼저 제거tc qdisc add dev <NIC> root handle 1: htb default 30tc class add dev <NIC> parent 1: classid 1:1 htb rate 100mbittc class add dev <NIC> parent 1:1 classid 1:10 htb rate 100mbittc qdisc add dev <NIC> parent 1:10 handle 10: netem loss 5%tc filter add dev <NIC> protocol ip parent 1:0 prio 1 u32 match ip dst <PLC_IP> flowid 1:10tc qdisc del dev <NIC> root # 종료
watchdog日志解读
只有状态发生变化时才会留下事件区块。使用grep "EVENT"只查看事件。
| 类别 | 信号 | 含义 |
|---|---|---|
| LTE | CABLE_DISCONNECTED | 物理链路 |
| LTE | ROUTER_DOWN | 路由器ping失败 |
| LTE | LTE_NO_RETURN_TRAFFIC | 有发送但接收为0——上行断开 |
| LTE | LTE_SIGNAL_LOST | 外部ping失败 |
| PLC | LINK_DOWN · ARP_L2_ISSUE | 链路·L2 |
| PLC | PHYSICAL_LAYER_ISSUE | CRC增加——线缆·端口物理问题 |
| PLC | PLC_NO_RESPONSE · PLC_SERVICE_DOWN | 无响应 · 端口关闭 |
⚠ 部分NIC不支持rx_crc_errors。CRC:+0为回退值,请勿用于物理层判定。
5. 数值缺失或异常
HMI画面数值与Edge采集数值不一致
- 原因 HMI数值可能是已应用逻辑运算后的值。
- 处理 分三段缩小范围——PLC内存原始值 → HMI面板(已应用逻辑) → Edge(数据类型·采集周期·计算公式)。 先与PLC原始值比较,再确认Edge的类型·周期·计算公式,最后进行最终比对。
计数器间歇性混入异常中间值
- 原因 在PLC扫描周期中,计数器更新时机与读取时间点重叠时,高低位字的一致性会被破坏,从而读到中间值。这不是故障,而是时序特性。
填入标签地址后持续返回空值
-
原因 在JSON类地址中遗漏了PATH模式写法(
$.),导致退化为KEY模式。KEY模式不会沿路径查找, 而是按最顶层键名原样查找。受此影响的有Kafka · MQTT · WebSocket,HTTP不受影响。 -
处理 确认以下三点。
- 数组索引使用点号加数字(
.0.),不支持方括号写法。 - 字段名需精确到大小写(
agvid失败 /agvId成功)。 - 不支持通配符及数组整体展开。
TOPIC:$.body.list.0.battery ✅TOPIC:body.list[0].battery ❌ - 数组索引使用点号加数字(
仅特定标签持续返回空值
- 原因 发送端载荷中的字段名存在拼写错误(
status→stutaus)。即使按正确拼写注册,也只会得到空值而无报错。 - 处理 注册前应亲眼确认实际载荷中字段名的原文。
- 附带注意事项 空字符串根本不会被存储(无报警时段会出现数据空白)。JSON
null会以字符串"null"形式存储, 若以数字类型注册则会解析失败。
采集数量远少于发布数量
- 原因 这是设计上的正常现象。 驱动会以最后一个值覆盖消息,读取并非消费队列, 而是对最后一个值的轮询采样。只要broker的LAG为0,就说明已全部接收到。
- 处理 如需全量采集,需要进行基于队列的重新设计,属于合同变更事项。
刚注册后旧数据大量涌入,或反而未能导入
- 原因 涉及Kafka的
auto-offset方向(默认latest)。latest需要在创建消费者组之后发布才能捕获, 而**earliest**会一次性消费注册瞬间已堆积的现有消息。除这两个值以外都会悄无声息地降为latest。 - 注意 这仅限于Kafka。MQTT没有offset概念——与之类似的位置是
clean-session。 - 处理 验证应以实时发布进行。
数据提取为0件但无任何错误日志
- 原因 jar冲突——重新打包的JSON库与标准库冲突,导致缺少必需的构造函数。
- 处理 替换为标准jar,将冲突jar备份转移后清理缓存并重启。
- 确认 正常状态是安静的成功。只要轮询线程存活、LAG为0且
VALUE_NULL日志停止输出即为正常, 不会输出成功日志。
出现类型异常
- 症状
NumberFormatException或Invalid tag data type。 - 原因 注册时将类型统一设为Integer。
- 处理 按值的性质重新区分——Double用于电流·温度·电压·重量·速度·坐标,String用于报警·状态·区域·方向·颜色, Integer用于电池·错误代码。Edge标签类型与Platform类型必须一致。 即使数值以字符串形式传入, 只要声明类型正确就能被准确解析。
更改了元数据但未生效
- 原因 未执行缓存reload。
- 处理 需同时重新读取三处——Platform服务器、OPC-UA插件、Edge。只要漏掉一处,一致性就会被破坏。 若重新注册OPC导致标签ID被重新发放,需清除Platform中残留的标签并停止再启动OPC以重新同步。
通过REST注册后驱动连broker都连不上
- 症状 看起来像「PLC连接timeout」,但TCP正常,连consumer group都没有创建。
- 原因 OPC创建请求体中缺失必填字段,内部抛出异常导致地址映射扫描失败。 若通过界面注册,界面会自动补全,所以仅在REST路径下才会出问题。
- 处理 填齐八个必填字段——
opc_id·opc_name·opc_type·site_id·opc_agent_ip·opc_agent_port·timecycle·async。 同时确认地址表示法和offset方向。 - 变更点 以前
PUT会将未指定的字段清空,所以「删除后重新创建」是安全的。2026-07-20通过部分合并修复 —— 现在只有发送的字段会被更改。但也因此无法用null来清空字段。
ping通但采集为0
- 原因 ping正常、ARP也正常,但TCP端口是关闭的。 读取错误计数达480万,成功次数为0。
- 处理 **属于PLC侧通信端口·模块处理范畴,**watchdog无法解决,应转交设备负责人处理。
查询最新值却返回旧数据
- 原因
SELECT * ... LIMIT 5是分区顺序,因此旧数据会先返回。实时存储本身是正常的。 - 处理 使用
WHERE tag_id=... ORDER BY timestamp DESC进行确认。
6. 资源耗尽 · 日志
每30天就会同时爆发各种错误
-
症状 运行30天后,全方位错误爆发。
-
原因 监控定时器每10秒尝试一次docker ping,若docker不存在,失败路径中有2个文件描述符不会被回收。 由于异常未被记录到日志中,因而悄无声息地累积。数字正好吻合——30.3天除以10秒为261,700次, 乘以2为523,400,而实测为523,690。
-
处理 安装与正常对照设备相同版本的docker并固定下来。若仅重启,30天后仍会复发。
-
确认
P=$(pgrep -f catalina.startup.Bootstrap | head -1)ls /proc/$P/fd | wc -l # 정상 ~600, 누수 시 50만+wc -l < /proc/net/unix # 정상 ~200, 누수 시 50만+ls /var/run/docker.sock # 없으면 누수 진행 확정
/proc/stat失败、Mount point not found、JMX NPE、「打开的文件过多」、队列WAL异常
(采集数据丢失区间)、日志暴增,全部都是文件描述符耗尽所派生出的问题。
耗尽之前的日志中ERROR为0条。
线程·FD持续增加并发生OOM
- 原因 对已失效目标的无限重连。 目标处于ping正常但协议端口已失效的状态, 数十种OPC以1秒周期重连,每次尝试都会创建新客户端。实测每秒净增2.25个, 常驻线程中有76%由此产生。另一台设备上驱动线程增长至40,900个导致OOM, 采集停止了3天却连终止日志都没有,因而未被察觉。
- 处理 未使用的OPC必须停止。 若PLC宕机也会重现相同的泄漏,长期运行的设备尤需注意。
同一日志堆积数万条
- 原因 轮询周期硬编码,没有关闭的设置项。
- 处理 不要修改类代码,而是在日志配置中为对应package添加WARN级别logger进行抑制。
7. 部署 · 初始化
不能在客户公司设备上留下安装痕迹
-
处理 不上传文件,而是通过标准输入投放脚本。
ssh <호스트> 'bash -s' < install.sh服务器上完全不会生成安装文件本身。
-
确认 临时目录中无残留,未生成备份文件,24小时内新生成的文件只有预期产出物。 备份原件保存在本地报告中。
一行安装命令返回404
- 原因 部署路径已改版,域名顶层不同。
- 同时暴露的问题
- 软链接会返回404——指针改用硬链接。
- 以
curl | bash方式执行时,脚本中的read会遇到EOF导致整体中断。通过连接终端解决。 - 一个环节失败会导致后续防火墙、调优、SSL、服务注册全部被跳过,于是将该环节改为非必需。
将服务器重置为仅保留OS
- 处理顺序 先删除容器,再卸载引擎。 将是否存在重新配置源作为第0道安全保障, 若没有则中止。
在远程连接中重置防火墙会导致SSH断开,没有控制台无法恢复。 重新配置脚本只会重新开放所需端口,不会关闭端口。
- 故意不改动的内容 主机名·语言环境·时区·附属软件包。重新配置时会重新设置这些内容。
修改了server.host但数据方向未改变
- 原因 该设备采用的是pull方式。Platform会直接读取Edge的标签值API。即使更改Edge的push目标,方向也不会改变。
- 处理 若要改由其他Platform接收,需在对方侧用Edge地址和密钥配置pull。
Edge与Platform版本不一致导致无法联动
- 症状
API server is not responding无限循环。端口全部开放,网络本身没有问题。 - 原因 新版Platform只开放新API,而旧版Edge硬编码调用旧路径。必须先完成握手才能开始发布。
- 处理 将Edge升级至与Platform相同的发行版本。 无法通过配置解决——握手逻辑已编译在代码中。
- 令牌陷阱 保存与部署是两回事(需在界面上点击「部署」)。需要指定允许的IP, 公开ping返回200并不代表认证已通过。