首页 / 新闻资讯 / 上位机报文日志记录
技术分享

设备通讯出了问题却查无对证?上位机报文日志应该这样记

串口服务器与通讯报文日志调试
← 返回新闻列表

干工控的都懂这种无力感:产线半夜偶发停机,早上跑过去一看一切正常,问操作工只说“闪了一下”。其实吧,通讯故障从来不怕复杂,就怕没留痕。一条合格的报文日志,应该能让你在五分钟内把故障当时的收发过程完整回放出来——时间戳、方向、原始报文、解析结果,一个都不能少。

为什么你记的日志,关键时刻总用不上?

见过太多上位机的日志,通病基本一样:

- 只记“读取成功”这种结论,不记原始报文,错值怎么来的无从查起;
- 时间戳只到秒,两条报文先后顺序全靠猜;
- 多线程同时写文件,日志行互相穿插,内容串行;
- 异常只写一句“通讯失败”,没有异常类型、目标设备和堆栈。

这种日志平时看起来挺热闹,真到断案时等于没有。工控软件开发里,日志不是附属品,它是你不在现场时的“眼睛”。

一条能断案的报文日志,必须包含什么?

我自己的通讯日志,每条至少带八个字段:

1. 毫秒级时间戳,精确到fff,必要时连 ticks 一起存;
2. 收发方向,TX下发还是RX返回,一眼分清;
3. 设备名和通道号,多设备多串口时才不会混;
4. 功能码或服务类型,比如03读保持寄存器、16写多个寄存器;
5. 原始报文hex,这是最硬的证据;
6. 解析后的值,地址、点名、转换结果一并记录;
7. 本次往返耗时,判断超时和网络劣化全靠它;
8. 异常信息,超时、连接拒绝、校验错误分别记录。

多台设备的时间怎么对齐?

单机上位机用本机时间就行,但一定要把Windows时间同步打开,对接NTP服务器。如果是多套上位机联合排查,统一时区,或者干脆存UTC、显示时再转本地。差一个时区,日志就能把人看疯。

日志量那么大,磁盘扛得住吗?

扛不住,所以不能傻写。高频采集项目一天几个G的文本很正常,我的做法有四条:

- 异步队列写盘。通讯线程只负责把日志丢进内存队列,由专门的日志线程批量落盘,绝不阻塞采集;
- 按天或按大小滚动。单个文件控制在几十兆,文件名带日期,方便拷贝和检索;
- 自动压缩归档。超过保留周期(比如30天)的旧日志压缩后转移,再老就清理;
- 异常现场全量留。平时可以只记摘要,但一旦发生异常,把异常前后各几十条报文完整留存。

用环形缓冲区实现“异常前留痕”特别好用:最近500条报文常驻内存,出问题瞬间落盘,平时不占磁盘空间。

拿到日志,怎么快速锁定故障?

给请求和响应配一个递增序号,一问一答按序号配对,谁没回、谁回晚了立刻现形。常见故障的报文特征其实很固定:

- 发出去没响应:超时,查线缆、地址冲突、从站是否死机;
- 回异常码02:非法地址,点表和设备寄存器范围对不上;
- 回异常码03:非法数据值,写入超量程;
- CRC或LRC校验错误:总线干扰、波特率不匹配;
- 偶尔回错站号:RS485总线上有从站地址拨码重复。

我之前处理过一个类似案例,一条485总线偶发丢包,查了两周。最后靠报文日志发现有台仪表偶尔回的是另一个站号——出厂拨码和另一家撞了。这种问题不看报文,靠换线能换到怀疑人生。

今晚就可以做个测试:把最近一次通讯异常时的日志翻出来,计时五分钟,看自己能不能还原出“谁发了什么、谁没回、耗时多久”。还原不出来,说明日志体系该补了。需要一套带报文留存的通讯框架,欢迎找我们:免费咨询,或致电 13761638786。

← 上一篇 配方参数下发到PLC总出错?校验、回读比对和失败回滚这套机制必须有

有软件开发需求?

专业顾问1对1咨询,30分钟出方案,让您的想法快速落地