4. 设备端CEID数据结构:SML语法与事件配置文件结构
CEID(Collection Event ID)是SECS/GEM协议中定义采集事件的核心标识。设备端必须按照标准语法定义CEID的数据结构,并通过事件配置文件(Event Configuration File)将CEID与具体的数据变量(VID)绑定。本章深入解析SML(SECS Message Language)语法定义CEID的方式,以及XML/JSON格式的事件配置文件结构。
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
>
>
>
.
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 | — |
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三者之间的层级关系与数据流向:
4.5 CEID配置的工程实践要点
- CEID命名规范: 建议使用语义化名称(如ProcessStart、AlarmRaised),便于维护和调试。
- VID复用: 同一个VID可以被多个Report引用,减少数据冗余。
- 配置文件版本管理: 每次修改CEID配置后,更新Header中的Version字段,便于追溯。
- 设备端校验: 设备在加载XML/JSON配置时,应校验CEID、Report、VID的ID唯一性和引用完整性。
- 运行时动态更新: 部分设备支持通过S2F37/S2F39动态修改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)
4.7 本章小结
CEID数据结构是SECS/GEM事件上报的核心骨架。通过SML语法定义报文结构,通过XML/JSON配置文件实现CEID、Report、VID的灵活映射。掌握这些数据结构,是后续实现事件采集、上报和主机通信的基础。