4. 多源异构实验数据采集

自驱动实验室的“数据闭环”之所以难,往往不在于算法,而在于数据入口。一个典型实验站里,同一时刻可能并行产生四类数据:传感器以毫秒级连续输出温度、压力、流量;分析仪器在单次测量结束后吐出一份带谱图的结果文件;机器人执行日志记录“何时抓取了哪个孔位的样品”;LIMS/ELN 则保存样品编号、实验条件与人工录入的结论。这四类数据在格式、频率、时间基准和语义粒度上完全不同,若不在采集层做统一处理,后续的建模与决策就会建立在错位的时间轴上。

四类数据源的接入方式

接入方式的选择取决于数据源的“主动程度”。传感器通常是被动读取型:PLC 或数据采集卡通过 Modbus TCP、OPC UA 或串口周期性读取寄存器,采集程序按固定周期轮询。以 OPC UA 为例,客户端订阅一个节点后,服务端按设定的 publishing interval 推送数值,采集端只需维护订阅关系,不必自己写轮询循环。

分析仪器多为“文件产出型”。色谱、质谱、XRD 等设备在测量完成后生成 CSV、JCAMP-DX 或厂商私有格式文件。接入方式通常是目录监听:采集服务监控仪器输出目录,检测到新文件即读取、解析并登记。部分仪器支持 SiLA 2 或厂商 API,可主动查询状态与结果,但文件监听仍是兼容性最好的兜底方案。

机器人执行日志来自控制器的运行记录,常见形式是逐行追加的文本日志或通过 ROS 话题发布的 JSON 消息。接入时既要拿到“动作完成”事件,也要拿到动作对应的孔位、样品 ID 和时间戳。若机器人控制器支持,应优先订阅其状态话题;否则解析日志文件,但需注意日志写入存在缓冲延迟。

LIMS/ELN 是“事务型”数据源,数据通过 REST API 或数据库查询获取。接入时应以样品 ID 或实验批次为主键,拉取样品元数据、实验条件与人工结论。LIMS 的数据更新频率低,但语义价值高,是其他三类数据的“身份锚点”。

多源异构数据采集与时间同步架构 传感器 温度/压力/流量 OPC UA / Modbus 频率:10–1000 Hz 分析仪器 色谱/质谱/XRD 文件监听 / SiLA 2 频率:单次事件 机器人日志 动作/孔位/样品ID ROS话题 / 日志解析 频率:事件驱动 LIMS / ELN 样品元数据/实验条件 REST API / DB查询 频率:低频事务 统一采集层(采集服务 / 边缘网关) 协议适配 · 格式解析 · 时间戳标注 · 缓冲队列 每条记录附加:source_id | sample_id | device_ts | gateway_ts | seq_no 时间同步与对齐策略 NTP/PTP 时钟同步 → 统一 UTC 时间戳 事件对齐:以机器人动作事件为锚点,关联前后传感器窗口与仪器结果 重采样:高频降采样 / 低频插值 / 事件窗口切片 统一时序数据集 对齐后的多源记录 → 供建模、决策与闭环控制使用 时间轴示意 传感器 t1 机器人动作 仪器结果 LIMS记录 对齐窗口

采样频率的差异与处理

四类数据源的采样频率跨度极大。传感器可能以 100 Hz 输出,机器人动作事件每秒只有几次,分析仪器一次测量耗时数分钟到数小时,LIMS 记录则可能一天只更新几次。采集层不应试图把所有数据“拉平”到同一频率,而应保留原始频率,在同步层按需处理。

对高频传感器数据,常见做法是保留原始序列,同时生成降采样版本。例如温度以 100 Hz 采集,可按 1 秒窗口计算均值与标准差,写入时序数据库;原始数据保留在文件或对象存储中,供需要时回溯。降采样不是丢弃信息,而是为不同用途提供不同粒度的视图。

对低频事件型数据,关键是记录精确的事件时间戳。机器人完成一次移液动作时,控制器应输出带时间戳的事件消息;若只能解析日志,则需在采集端记录“读到该行日志”的时间,并尽量通过日志内的序号或控制器时钟校正。分析仪器结果文件通常自带采集开始时间,解析时应提取该字段而非使用文件创建时间。

时间同步策略

时间同步的目标是让所有数据源共享同一时间基准。第一步是时钟同步:采集服务器、仪器工作站、机器人控制器应统一通过 NTP 与同一时间源同步,要求高的场景可使用 PTP 达到亚毫秒级。第二步是时间戳标注:每条记录至少携带两个时间戳——设备本地时间(device_ts)和采集网关接收时间(gateway_ts)。两者都保留,便于排查时钟偏差。

第三步是事件对齐。自驱动实验室的核心逻辑通常围绕“一次实验操作”展开:机器人抓取样品、放入仪器、仪器测量、结果返回。对齐时以机器人动作事件为锚点,向前后各取一个时间窗口,将窗口内的传感器数据、仪器结果和 LIMS 记录关联到同一个 experiment_event 上。窗口大小根据实验节奏设定,例如移液后 30 秒内的温度数据、仪器测量开始后全程的压力曲线。

实践建议:在采集层为每条记录生成全局递增的 seq_no,即使时间戳因时钟回拨出现乱序,也能依靠序号恢复真实顺序。时间戳统一使用 UTC,展示时再转换为本地时间,避免夏令时和时区混淆。

一个可参考的采集配置示例

以下是一个采集服务的配置片段,用于说明四类数据源如何在同一服务中注册。参数为教学示例,实际值需根据设备手册和实验节奏调整。

sources:
  - id: reactor_temp
    type: opcua
    endpoint: "opc.tcp://192.168.1.10:4840"
    node: "ns=2;s=Reactor.Temp"
    sampling_hz: 100
    buffer: 5000
  - id: hplc_result
    type: file_watch
    watch_dir: "/data/hplc/export"
    pattern: "*.csv"
    parser: "hplc_csv_v2"
  - id: robot_arm
    type: ros_topic
    topic: "/robot/action_event"
    msg_type: "lab_msgs/ActionEvent"
  - id: lims_sample
    type: rest_poll
    url: "https://lims.example.org/api/samples"
    poll_interval_s: 300
    key_field: "sample_id"

sync:
  ntp_server: "ntp.lab.local"
  default_window_s: 30
  resample:
    reactor_temp: "1s_mean_std"

配置中 sampling_hz 控制传感器轮询频率,poll_interval_s 控制 LIMS 拉取周期,default_window_s 定义事件对齐窗口。采集服务启动后,可通过检查各 source 的 last_seen_ts 与 seq_no 连续性判断是否正常。若某传感器 seq_no 出现跳变,说明存在丢包或采集阻塞;若 gateway_ts 与 device_ts 偏差持续增大,说明时钟同步异常,需要检查 NTP 服务。

结果判断与常见问题

采集是否健康,可以从三个信号判断:一是各源数据的时间戳偏差是否在允许范围内(例如传感器与网关偏差小于 50 ms);二是事件对齐后,每个 experiment_event 是否都能关联到完整的四类记录;三是降采样后的数据是否保留了关键趋势,例如温度曲线的峰值是否仍然可见。

常见问题包括:仪器结果文件延迟写入导致对齐窗口错过、机器人日志缓冲导致事件时间戳偏晚、LIMS 样品 ID 与机器人使用的孔位编号不一致。前两者通过增大窗口或改用事件触发采集缓解,后者需要在采集层建立孔位与样品 ID 的映射表,并在入库前做一致性校验。只有把采集层的时间与身份两条线都对齐,后续的数据闭环才有可靠的基础。