3. 故障日志的数据来源与采集
水下机器人的故障日志并不是由某一个程序统一“写”出来的,而是由分布在艇体各处的多个子系统各自生成、再被采集汇聚的结果。理解日志来源,本质上是在理解一件事:当故障发生时,哪一级硬件或软件最先感知到异常,它把异常变成了什么形式的数据,这份数据又通过什么路径进入日志系统。只有把这条链路理清,读日志时才能判断一条记录的可信度、时间精度和上下文完整度。
按生成机制划分,水下机器人的日志来源主要有四类:控制器(主控计算机与运动控制单元)、传感器、通信总线、电源管理系统。它们生成日志的触发方式、数据粒度和时间基准各不相同,这也是同一故障在不同来源中表现不一致的根本原因。
控制器日志:事件驱动为主,状态快照为辅
主控计算机和运动控制单元是日志量最大、信息最丰富的来源。它的生成机制通常分两条线:一条是事件驱动,即软件在检测到异常条件时主动写一条记录,例如任务状态机从“自主航行”跳转到“安全悬停”、控制线程心跳超时、看门狗触发复位;另一条是周期快照,即每隔固定时间(常见 100 ms 到 1 s)把关键状态量打包写入,包括当前任务号、目标深度、实际深度、控制模式、推进器输出百分比等。
这两条线的价值不同。事件记录告诉你“发生了什么”,快照告诉你“发生前后系统处于什么状态”。排障时如果只有事件没有快照,往往只能看到“深度控制超差”这一条告警,却无法判断当时推进器是否已经饱和、是否处于手动模式。因此工程上通常要求:任何一条严重级别以上的事件,都必须附带一份触发时刻的上下文快照,快照字段在软件设计阶段就要固定下来,而不是事后临时拼凑。
控制器日志的时间基准是系统时钟,精度最高,通常可到毫秒。但要注意,控制器复位后时钟可能被重新初始化,如果日志中没有记录“时钟重置”事件,前后两段日志的时间戳就会出现跳变,容易被误读为长时间无记录。
传感器日志:周期采样加阈值判定
传感器本身大多不“写日志”,它输出的是原始测量值和状态字。日志是在采集节点上生成的:采集程序按固定周期读取数据,同时做三类判定——有效性判定(数据是否在量程内、校验是否通过、是否超时未更新)、变化率判定(相邻采样点跳变是否超过物理合理范围)、一致性判定(如深度计与压力传感器读数是否矛盾)。任一判定不通过,就生成一条带传感器编号、原始值、判定类型的事件记录。
这里有一个容易被忽略的细节:传感器日志的时间戳应记录采样时刻而非写入时刻。如果采集队列有积压,两者可能相差数百毫秒,在多源日志对齐时会直接导致因果顺序错乱。实际做法是在采集中断里打时间戳,写入磁盘时保留该时间戳不变。
通信总线日志:被动监听与错误计数
总线日志的生成机制与前两者不同,它更多是被动观测的结果。以 CAN 总线为例,控制器或总线分析模块会持续统计每个节点的报文周期、丢帧数、错误帧数、总线负载率;当某节点连续若干个周期未发出心跳帧,就判定为“节点离线”并记录。RS-485 和以太网则关注校验错误、超时重传、链路断开与恢复。
总线日志的独特价值在于它能揭示“看不见的故障”。例如某个推进器驱动器本身工作正常,但它所在的 CAN 分支接头进水导致间歇性错误帧,表现为偶发的推力丢失。控制器日志只会记录“推力反馈异常”,而总线日志里的错误计数器增长曲线才是真正的定位线索。因此采集时应保留原始错误计数器的周期采样值,而不只是记录“发生错误”这一事件。
电源管理系统日志:保护动作与周期遥测
电源管理系统(BMS 与配电单元)通常有独立的处理器和本地时钟,它生成的日志包括两类:保护动作记录(过压、欠压、过流、过温、绝缘下降、通道跳闸,含动作值与阈值)和周期遥测(单体电压、总电流、剩余电量、各配电通道状态)。保护动作往往先于控制器感知到问题——例如电池过流保护切断动力电时,控制器可能只是突然失去推进器反馈,真正的原因记录在 BMS 里。
BMS 本地时钟与主控系统时钟通常不同步,这是多源日志对齐中最常见的坑。工程上的处理办法是:采集层在收到 BMS 报文时,用接收时刻的主控时间重新打一个时间戳,同时保留 BMS 原始时间戳,两个都写入日志。事后分析时以主控时间戳排序,以原始时间戳核对 BMS 内部事件顺序。
采集环节的三个关键约束
把四类来源汇聚成可用日志,需要满足几个硬性约束。第一是掉电保护:水下机器人故障常伴随断电,日志必须先写入非易失存储或环形缓冲区,不能只停留在内存里;实践中常用“双缓冲 + 定期刷盘”,刷盘周期与可接受的数据丢失窗口相匹配。第二是原始码保留:每条记录同时保存原始事件码和解析后的中文描述,解析表升级后仍能回溯原始含义。第三是采集自身不能成为故障源:日志写入应采用独立线程或独立通道,避免磁盘写满或写入阻塞影响控制回路。
下面是一段典型的汇聚后日志片段示例(示例数据,用于说明字段结构):
2024-06-11T09:12:31.482Z [PWR] EVT 0x2A01 电池组过流保护动作 动作值=48.6A 阈值=45.0A 通道=主推
2024-06-11T09:12:31.485Z [BUS] STAT can1 错误帧+3 节点=0x1B 离线计数=1
2024-06-11T09:12:31.503Z [CTRL] EVT 0x1107 推进器反馈丢失 上下文: 模式=自主 目标深度=32.5m 实际=32.4m
2024-06-11T09:12:31.504Z [CTRL] SNAP 任务=03 控制模式=AUTO 推进器输出=0% 深度=32.4m
2024-06-11T09:12:31.620Z [SENS] EVT 0x3302 DVL 数据超时 连续丢失=4 帧 最后有效=09:12:31.180
从这段示例可以看出,四类来源在约 140 ms 内依次留下痕迹:电源保护最先动作,总线随即出现错误帧与节点离线,控制器感知到反馈丢失并记录上下文快照,传感器侧则记录了 DVL 超时。单看任何一条都不足以定性,但按时间戳排列后,因果链就清晰了。这正是“日志从哪来”这个问题在排障中的实际意义——来源决定了你能看到什么,采集质量决定了你能否把它们串起来。