3. SECS/GEM 消息结构:Message Header、Data Item 与 Stream/Function
SECS/GEM 协议的核心是结构化的消息交换。每一笔通信都遵循严格的消息格式,由 Message Header(消息头)、Data Item(数据项) 以及 Stream/Function(流/功能码) 三部分构成。理解这三者的关系是诊断通信异常、配置防火墙规则的基础。
核心要点: Message Header 负责路由与标识,Stream/Function 定义消息的“动词”与“名词”,Data Item 承载具体的工艺参数。三者缺一不可。
3.1 Message Header(消息头)结构
每个 SECS 消息都以一个固定长度的 Header 开头,长度为 10 个字节(SECS-I)或 4 个字节(HSMS)。在 TCP/IP 环境中(HSMS),Header 为 4 字节,但在逻辑上仍包含以下关键字段:
| 字段名称 | 长度(字节) | 说明 | 调试关注点 |
|---|---|---|---|
| Session ID(设备ID) | 2 | 标识通信的设备或会话。通常设备 ID 为 0 或 1。 | 防火墙规则中常需放行特定 Session ID 的流量;ID 不匹配会导致消息被丢弃。 |
| Message ID(消息ID) | 2 | 由 Stream 和 Function 编码组成,高字节为 Stream,低字节为 Function。 | 用于识别消息类型;防火墙可基于此 ID 过滤特定 Stream/Function。 |
| System Bytes(系统字节) | 4 | 发送方生成的唯一事务标识,用于请求-应答配对。 | 超时重传时,System Bytes 必须保持一致;防火墙日志中可追踪事务流。 |
实战提示: 在抓包分析中,重点关注 System Bytes 是否成对出现。如果发现大量孤立的请求(无对应应答),通常意味着防火墙拦截了回程报文或设备端超时。
3.2 Stream / Function(流/功能码)
Stream 和 Function 共同构成了 SECS 消息的“语义骨架”:
- Stream(流):定义消息的类别或主题。例如 Stream 1 用于设备状态与控制,Stream 2 用于设备数据收集。
- Function(功能码):定义具体的操作。例如 Function 1 通常为“请求”,Function 2 为“应答”。
常见的 Stream/Function 组合示例:
| Stream | Function | 消息名称 | 方向 | 说明 |
|---|---|---|---|---|
| 1 | 1 | S1F1 | Host → Equipment | Are You There?(通信建立请求) |
| 1 | 2 | S1F2 | Equipment → Host | On Line Data(通信建立应答) |
| 2 | 13 | S2F13 | Host → Equipment | Equipment Constant Request(设备常量请求) |
| 2 | 14 | S2F14 | Equipment → Host | Equipment Constant Data(设备常量数据) |
防火墙规则关键点: 许多半导体工厂的防火墙会基于 Message ID(即 Stream/Function 编码)进行白名单过滤。例如,只允许 S1F1/S1F2 通过,而阻止 S2F41(远程命令)等高风险消息。调试时需确认防火墙规则是否意外拦截了必要的 Stream/Function。
3.3 Data Item(数据项)
Data Item 是 SECS 消息中实际携带的数据负载。它采用 SML(SECS Message Language) 格式进行编码,支持多种数据类型:
| 数据类型 | 格式码 | 说明 | 示例 |
|---|---|---|---|
| Boolean | 0x00 | 布尔值(TRUE/FALSE) | <B 1> |
| Integer | 0x10 / 0x20 / 0x30 / 0x40 | 1/2/4/8 字节有符号整数 | <I4 100> |
| Float | 0x50 / 0x60 | 4/8 字节浮点数 | <F8 3.14159> |
| ASCII | 0x70 | 可变长度 ASCII 字符串 | <A “OK”> |
| List | 0x80 | 数据项容器,可嵌套 | <L [2]> |
调试技巧: 当防火墙或中间件解析 SECS 消息时,Data Item 的格式错误(如长度字段异常)会导致消息被丢弃。检查防火墙日志中是否有“Malformed Data”或“Invalid Length”等关键字。
3.4 消息结构完整示例
以下是一个完整的 S1F1 消息(HSMS 格式)的十六进制表示及解析:
HSMS Header:
00 01 // Session ID = 1
01 01 // Message ID = S1F1 (Stream=1, Function=1)
00 00 00 01 // System Bytes = 1
Data Item (SML):
<L>
<A “MD”> // 设备模型
</L>
防火墙规则调试关联: 在配置防火墙时,通常需要设置规则来允许特定的 Session ID 和 Message ID 范围。例如,允许 Session ID=1 且 Message ID 在 0x0101 到 0x0102 之间的消息通过。错误的规则可能导致 S1F1 握手失败,表现为“通信超时”或“连接被重置”。