3. SECS-II消息结构精讲

SECS-II 是 SEMI E5 标准定义的消息内容层,它规定了设备与主机之间“说什么”以及“怎么说”。一条 SECS-II 消息并不是裸数据,而是由消息头(Message Header)和消息体(Message Body)两部分组成。消息头承载路由与语义控制信息,消息体则由若干数据项按树形结构组织。理解这两部分,是读懂 GEM300 通信日志、排查通信异常的基础。

消息头:10 字节的固定结构

SECS-II 消息头固定为 10 字节,字段顺序与含义如下:

字节字段说明
0–1Device ID设备标识,15 位有效,最高位为 R-bit(W-bit 的应答位)
2W-bit + Stream最高位 W-bit,低 7 位为 Stream 号(0–127)
3FunctionFunction 号(0–255)
4PTypePresentation Type,SECS-II 固定为 0
5STypeSession Type,SECS-II 固定为 0
6–9System Bytes4 字节事务标识,用于请求与应答配对

其中 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 的请求却不应答,主机会超时重发,最终触发通信告警。

判断一条消息是否需要回复,先看 W-bit,再看 Function 奇偶:W-bit=1 且 Function 为奇数,通常需要一条偶数 Function 的应答。

综合示例:一条 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,可在应答中返回空列表或错误码,具体取决于双方约定。

SECS-II 消息结构与事务配对示意 消息头(10 字节) Device ID 2 字节 W-bit + Stream 1 字节 W=1 Function 1 字节 PType =0 SType =0 System Bytes 4 字节 · 事务标识 消息体(数据项树) L, 3 U4, 1001 U4, 1002 U4, 1003 事务配对:System Bytes 回填 主机请求 S2F13 SysBytes = 0x2A W-bit=1 设备应答 S2F14 SysBytes = 0x2A 回填一致

掌握上述结构后,再看通信日志就能快速定位问题:若 System Bytes 不匹配,是事务配对失败;若 W-bit 与 Function 奇偶矛盾,是消息构造错误;若数据项长度字节与实际内容不符,是编码层错误。这些判断都直接依赖对消息头、流功能、数据项格式、系统字节和 W-bit 的准确理解。