4. 设备端CEID数据结构:SML语法与事件配置文件结构

CEID(Collection Event ID)是SECS/GEM协议中定义采集事件的核心标识。设备端必须按照标准语法定义CEID的数据结构,并通过事件配置文件(Event Configuration File)将CEID与具体的数据变量(VID)绑定。本章深入解析SML(SECS Message Language)语法定义CEID的方式,以及XML/JSON格式的事件配置文件结构。

核心概念: CEID是一个无符号整数(通常为1~65535),每个CEID对应一组预定义的采集数据项(Data Variables)。设备端通过SML定义CEID的报文结构,通过XML/JSON配置文件实现CEID与VID的映射关系。

4.1 SML语法定义CEID数据结构

SML是SECS/GEM协议的标准消息描述语言,用于定义设备端与主机之间的通信报文结构。CEID在SML中通常作为L(List)结构的一部分出现,包含CEID本身以及关联的VID列表。

4.1.1 CEID的SML基本结构

一个标准的CEID上报消息(CEID Event Report)在SML中定义如下:

-- 定义CEID事件上报消息
S2F41 W
  <L
    <U2 1001>   -- CEID: 采集事件ID
    <L
      <U2 101>  -- VID 1: 设备状态
      <U2 102>  -- VID 2: 当前温度
      <U2 103>  -- VID 3: 压力值
    >
  >
.

上述SML片段定义了一个CEID为1001的事件,上报时携带3个数据变量(VID 101、102、103)。

4.1.2 CEID与Report ID的关联

在GEM标准中,CEID通过Report ID间接关联VID。设备端需要定义多个Report,每个Report包含一组VID,然后将CEID与一个或多个Report绑定。SML定义如下:

-- 定义Report
S2F33 W
  <L
    <L
      <U2 1>     -- Report ID 1
      <L
        <U2 101> -- VID 101
        <U2 102> -- VID 102
      >
    >
    <L
      <U2 2>     -- Report ID 2
      <L
        <U2 103> -- VID 103
        <U2 104> -- VID 104
      >
    >
  >
.

-- 定义CEID与Report的关联
S2F35 W
  <L
    <L
      <U2 1001>  -- CEID 1001
      <L
        <U2 1>   -- 关联 Report ID 1
        <U2 2>   -- 关联 Report ID 2
      >
    >
  >
.
工程要点: CEID与Report的关联是多对多关系。一个CEID可以关联多个Report,一个Report也可以被多个CEID引用。这种设计提高了事件配置的灵活性。

4.1.3 SML数据类型与CEID字段

CEID在SML中常用的数据类型包括:

SML类型 SECS类型 字节长度 CEID典型用法
U2 UINT2 2字节 CEID值(0~65535)
U4 UINT4 4字节 扩展CEID(大型系统)
L LIST 可变 CEID + VID列表容器
I2 INT2 2字节 带符号的CEID(极少用)

4.2 事件配置文件的XML结构

XML是设备端最常用的事件配置文件格式。它定义了CEID、Report、VID之间的完整映射关系,便于设备厂商和系统集成商进行配置管理。

4.2.1 XML配置文件顶层结构

一个标准的CEID事件配置文件XML结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<EventConfiguration>
  <Header>
    <Version>1.0</Version>
    <DeviceID>100</DeviceID>
    <Timestamp>2025-01-15T10:30:00Z</Timestamp>
  </Header>

  <DataVariables>
    <DataVariable id="101" name="DeviceStatus" type="U2" />
    <DataVariable id="102" name="Temperature" type="F4" unit="Celsius" />
    <DataVariable id="103" name="Pressure" type="F4" unit="kPa" />
    <DataVariable id="104" name="FlowRate" type="F4" unit="L/min" />
  </DataVariables>

  <Reports>
    <Report id="1" name="ProcessReport">
      <VIDRef>101</VIDRef>
      <VIDRef>102</VIDRef>
    </Report>
    <Report id="2" name="EnvironmentReport">
      <VIDRef>103</VIDRef>
      <VIDRef>104</VIDRef>
    </Report>
  </Reports>

  <CollectionEvents>
    <CollectionEvent id="1001" name="ProcessStart">
      <ReportRef>1</ReportRef>
      <ReportRef>2</ReportRef>
    </CollectionEvent>
    <CollectionEvent id="1002" name="ProcessEnd">
      <ReportRef>1</ReportRef>
    </CollectionEvent>
  </CollectionEvents>
</EventConfiguration>

4.2.2 XML节点说明

XML节点 说明 属性
EventConfiguration 根节点,包含所有配置 —
Header 配置文件的元数据 Version, DeviceID, Timestamp
DataVariables 定义所有可用的数据变量 id, name, type, unit
Reports 定义Report及其包含的VID id, name
CollectionEvents 定义CEID及其关联的Report id, name
VIDRef 引用DataVariable的ID —
ReportRef 引用Report的ID —
常见错误: XML配置中CEID的id属性必须唯一,且与SML中定义的CEID值一致。如果CEID重复,设备端在解析配置时会报错,导致事件上报失败。

4.3 事件配置文件的JSON结构

JSON格式因其轻量、易解析的特点,在现代半导体设备中越来越普及。JSON结构通常用于设备端的运行时配置或REST API接口。

4.3.1 JSON配置文件结构

{
  "eventConfiguration": {
    "header": {
      "version": "1.0",
      "deviceId": 100,
      "timestamp": "2025-01-15T10:30:00Z"
    },
    "dataVariables": [
      { "id": 101, "name": "DeviceStatus", "type": "U2" },
      { "id": 102, "name": "Temperature", "type": "F4", "unit": "Celsius" },
      { "id": 103, "name": "Pressure", "type": "F4", "unit": "kPa" },
      { "id": 104, "name": "FlowRate", "type": "F4", "unit": "L/min" }
    ],
    "reports": [
      {
        "id": 1,
        "name": "ProcessReport",
        "vidRefs": [101, 102]
      },
      {
        "id": 2,
        "name": "EnvironmentReport",
        "vidRefs": [103, 104]
      }
    ],
    "collectionEvents": [
      {
        "id": 1001,
        "name": "ProcessStart",
        "reportRefs": [1, 2]
      },
      {
        "id": 1002,
        "name": "ProcessEnd",
        "reportRefs": [1]
      }
    ]
  }
}

4.3.2 JSON与XML结构对比

对比维度 XML JSON
可读性 标签冗余,适合复杂嵌套 简洁,适合快速阅读
解析性能 需要DOM/SAX解析,较慢 原生JSON解析,速度快
类型支持 所有值均为字符串 原生支持数字、布尔、数组
设备端存储 常用于配置文件 常用于运行时内存/API
SECS/GEM标准 SEMI标准推荐格式 行业实践,非标准强制

4.4 CEID数据结构关系图

下图展示了CEID、Report、VID三者之间的层级关系与数据流向:

CEID数据结构关系图 CEID数据结构关系图 CEID 1001 Report ID 1 Report ID 2 VID 101 VID 102 VID 103 VID 104 说明: • CEID 1001 关联了两个Report(ID 1 和 ID 2) • Report ID 1 包含 VID 101 和 VID 102 • Report ID 2 包含 VID 103 和 VID 104 • 事件上报时,CEID 1001 将携带所有4个VID的数据

4.5 CEID配置的工程实践要点

  • CEID命名规范: 建议使用语义化名称(如ProcessStart、AlarmRaised),便于维护和调试。
  • VID复用: 同一个VID可以被多个Report引用,减少数据冗余。
  • 配置文件版本管理: 每次修改CEID配置后,更新Header中的Version字段,便于追溯。
  • 设备端校验: 设备在加载XML/JSON配置时,应校验CEID、Report、VID的ID唯一性和引用完整性。
  • 运行时动态更新: 部分设备支持通过S2F37/S2F39动态修改CEID配置,无需重启设备。
最佳实践: 在设备端开发时,建议将CEID配置文件的解析逻辑与业务逻辑分离。使用独立的配置管理模块负责加载、校验和缓存CEID数据结构,提高系统的可维护性和可测试性。

4.6 XML与JSON配置的互转工具

在实际工程中,经常需要在XML和JSON格式之间转换。以下是一个简单的Python示例,演示如何将XML配置转换为JSON:

import xml.etree.ElementTree as ET
import json

def xml_to_json(xml_file):
    tree = ET.parse(xml_file)
    root = tree.getroot()

    config = {
        "eventConfiguration": {
            "header": {},
            "dataVariables": [],
            "reports": [],
            "collectionEvents": []
        }
    }

    # 解析Header
    header = root.find("Header")
    config["eventConfiguration"]["header"]["version"] = header.find("Version").text
    config["eventConfiguration"]["header"]["deviceId"] = int(header.find("DeviceID").text)

    # 解析DataVariables
    for dv in root.find("DataVariables").findall("DataVariable"):
        config["eventConfiguration"]["dataVariables"].append({
            "id": int(dv.get("id")),
            "name": dv.get("name"),
            "type": dv.get("type")
        })

    # 解析Reports
    for report in root.find("Reports").findall("Report"):
        r = {"id": int(report.get("id")), "name": report.get("name"), "vidRefs": []}
        for ref in report.findall("VIDRef"):
            r["vidRefs"].append(int(ref.text))
        config["eventConfiguration"]["reports"].append(r)

    # 解析CollectionEvents
    for ce in root.find("CollectionEvents").findall("CollectionEvent"):
        c = {"id": int(ce.get("id")), "name": ce.get("name"), "reportRefs": []}
        for ref in ce.findall("ReportRef"):
            c["reportRefs"].append(int(ref.text))
        config["eventConfiguration"]["collectionEvents"].append(c)

    return json.dumps(config, indent=2)

# 使用示例
json_output = xml_to_json("event_config.xml")
print(json_output)
提示: 上述代码仅作为示例,生产环境中建议增加异常处理、类型校验和Schema验证,确保配置文件的正确性。

4.7 本章小结

CEID数据结构是SECS/GEM事件上报的核心骨架。通过SML语法定义报文结构,通过XML/JSON配置文件实现CEID、Report、VID的灵活映射。掌握这些数据结构,是后续实现事件采集、上报和主机通信的基础。