跳到主要内容

示范:从手册的一句话到一条现象记录

这一页用示范数据,把一条规则从手册走到现象记录。文件是 demo_healthy.csv 和 demo_s1_problem.csv,你可以下载下来照着做。

手册里的一句话​

数据词典的"记录方式"一节写着:

每 0.1 秒记录一行(10 Hz)。

这一句里至少有三条规则:时间戳不能倒退、不能重复、相邻两行相差 0.1 秒。这里只示范"不能重复"。

写进 YAML​

machine.yaml(节选)
time:
columns: [Date, Time]
format: "%Y-%m-%d %H:%M:%S.%f"
step_s: 0.1
rules:
- id: time_repeated
category: time
reference: manual # 手册直接规定
source: 数据词典 · 记录方式 · "每 0.1 秒记录一行"
check: 相邻两行的时间戳不相同
origin: self # 自己写的;AI 提的写 ai

写成检查​

规则里不写具体的数值,数值从 YAML 读。换一台机器时,只改 YAML。

check_log.py(节选)
def time_repeated(df, spec):
"""返回时间戳与上一行相同的行。"""
t = pd.to_datetime(df[spec["time"]["columns"]].agg(" ".join, axis=1),
format=spec["time"]["format"])
return df.index[t.diff() == pd.Timedelta(0)]

先在验收日志上运行​

验收日志 18000 行,这条规则报警 0 次。规则没有误报,保留。

整套参考规则在验收日志上也都是 0 次报警。如果你的某条规则在这里报警了,先修改规则,再去看问题日志。

再在问题日志上运行​

问题日志 18084 行,比 30 分钟应有的 18000 行多出 84 行。规则报警 84 次,分散在 82 处,第一处在 08:00:03.6,文件第 39 行。

那里的两行原样摘出来是这样(只列几列):

TimeT1Sensors_LeftSensors_Right
08:00:03.60003797
08:00:03.60003797

两行完全相同,连时间戳也一样。

写进现象记录​

phenomena.jsonl(一行,为便于阅读已换行)
{
"first_seen": "08:00:03.6",
"last_seen": "…",
"rows": "39, …",
"count": 84,
"rule": "time_repeated",
"reference": "manual",
"phenomenon": "84 行的时间戳与上一行相同,且整行内容也相同,分散在 82 处",
"evidence": "第 38、39 行;回放页 Rows as found 显示 84 repeated"
}

注意两点:

  • 记录里写的是"时间戳相同,内容也相同",这是看到的事实。它是不是传输中的重发,是 S2 要判断的。
  • 把"内容也相同"写进去很重要:时间戳相同但内容不同,是另一种现象,后面的处理方式完全不同。

在回放页上查看​

把问题日志拖进回放页。Log 面板的 Rows as found 一栏显示 84 repeated。跳到 08:00:03.6,画面没有任何异常:回放页读入时已经把重复的时间戳去掉了。

这正是"看不出来不代表不存在"的例子。如果你只看回放画面,这条现象会被漏掉。

轮到你​

这份问题日志里,参考规则还报出了另外两类现象;把验收日志当作基线,还能看到几段两臂停在原位的时间。用示范文件把它们找出来,写成现象记录,练习完整的流程。上课时你拿到的是另一台机器的日志,现象的种类和位置都不一样。