3. SECS-II消息结构精讲
SECS-II 是 SEMI E5 标准定义的消息内容层,它规定了设备与主机之间“说什么”以及“怎么说”。一条 SECS-II 消息并不是裸数据,而是由消息头(Message Header)和消息体(Message Body)两部分组成。消息头承载路由与语义控制信息,消息体则由若干数据项按树形结构组织。理解这两部分,是读懂 GEM300 通信日志、排查通信异常的基础。
消息头:10 字节的固定结构
SECS-II 消息头固定为 10 字节,字段顺序与含义如下:
| 字节 | 字段 | 说明 |
|---|---|---|
| 0–1 | Device ID | 设备标识,15 位有效,最高位为 R-bit(W-bit 的应答位) |
| 2 | W-bit + Stream | 最高位 W-bit,低 7 位为 Stream 号(0–127) |
| 3 | Function | Function 号(0–255) |
| 4 | PType | Presentation Type,SECS-II 固定为 0 |
| 5 | SType | Session Type,SECS-II 固定为 0 |
| 6–9 | System Bytes | 4 字节事务标识,用于请求与应答配对 |
其中 Device ID 在 GEM 应用中通常为 0 或设备地址;PType 与 SType 在标准 SECS-II 中恒为 0,若收到非 0 值,说明对端可能使用了 HSMS 之外的承载或协议实现有误。
流(Stream)与功能(Function)
Stream 与 Function 共同构成消息的“动词”。Stream 表示消息大类,Function 表示该类下的具体动作。约定俗成:奇数 Function 为请求(Primary),偶数 Function 为应答(Reply),且应答的 Function 号通常为请求号加 1。例如 S1F1(Are You There)的应答是 S1F2(On Line Data),S2F13(Equipment Constant Request)的应答是 S2F14。
常见流包括:S1 系统类、S2 设备控制与状态、S5 异常报警、S6 事件报告、S7 配方管理。GEM300 场景下还会大量使用 S14(对象服务)、S16(过程作业)等。判断一条消息是否合法,第一步就是看 Stream/Function 组合是否在双方约定的能力集内。
数据项格式:树形结构的原子单元
消息体由数据项(Data Item)组成,每个数据项以“格式字节 + 长度字节”开头。格式字节高 6 位表示格式码,低 2 位表示长度字节数(1、2 或 3 字节)。常见格式码:
- L(0o00):列表,可嵌套,是组织复杂消息的核心;
- B(0o10):二进制;
- Boolean(0o11):布尔;
- A(0o20):ASCII 字符串;
- J(0o21):8 字节有符号整数;
- I2/I4/I8:2/4/8 字节有符号整数;
- U2/U4/U8:无符号整数;
- F4/F8:单/双精度浮点。
例如一条 S1F1 的消息体通常为空;而 S2F13 请求设备常量时,消息体是一个 L 列表,内部包含若干 U4 常量 ID。解析时必须严格按格式码和长度逐层展开,任何长度错位都会导致后续数据项全部错乱。
系统字节(System Bytes)与事务配对
System Bytes 是 4 字节无符号整数,由发起方生成,应答方必须原样回填。它的作用是把一次请求和它的应答绑定为同一事务。在并发通信中,主机可能同时发出多条请求,设备通过 System Bytes 区分哪条应答属于哪条请求。若设备回填的 System Bytes 与请求不一致,主机会判定为“孤立应答”并丢弃。实际工程中,System Bytes 常由主机侧递增计数器生成,设备侧只做回显,不重新生成。
W-bit 与消息方向
W-bit(Wait-bit)位于消息头第 2 字节最高位,是 SECS-II 中控制“是否需要应答”的关键位。规则如下:
- W-bit = 1:发送方要求接收方必须回复一条应答消息;
- W-bit = 0:发送方不要求应答,接收方无需回复。
方向判断上,设备发往主机的消息称为“设备消息”,主机发往设备的称为“主机消息”。同一条 Stream/Function 在不同方向下语义可能不同。例如 S6F11(Event Report Send)通常由设备发往主机,W-bit 常为 0;而 S2F13 由主机发往设备,W-bit 为 1,设备必须以 S2F14 应答。若设备收到 W-bit=1 的请求却不应答,主机会超时重发,最终触发通信告警。
综合示例:一条 S2F13 的完整结构
假设主机向设备请求 3 个设备常量,常量 ID 分别为 1001、1002、1003。消息头可表示为:Device ID=0,W-bit=1,Stream=2,Function=13,PType=0,SType=0,System Bytes=0x0000002A。消息体为:
L, 3
U4, 1001
U4, 1002
U4, 1003
设备收到后,以 S2F14 应答,System Bytes 回填 0x0000002A,消息体为对应的常量值列表。若设备不支持其中某个 ID,可在应答中返回空列表或错误码,具体取决于双方约定。
掌握上述结构后,再看通信日志就能快速定位问题:若 System Bytes 不匹配,是事务配对失败;若 W-bit 与 Function 奇偶矛盾,是消息构造错误;若数据项长度字节与实际内容不符,是编码层错误。这些判断都直接依赖对消息头、流功能、数据项格式、系统字节和 W-bit 的准确理解。