3. SECS 消息结构:Message Header 与 Data Item 详解、Stream 与 Function 的概念
SECS 通信的核心是消息的标准化。无论是设备上报状态,还是主机下发指令,都必须遵循固定的消息结构。本章将深入拆解 SECS 消息的骨架——Message Header(消息头)与Data Item(数据项),并详细阐述Stream(流)与Function(功能)的概念及其在通信中的实际作用。
3.1 SECS 消息的总体结构
一条完整的 SECS 消息由两部分组成:Message Header 和 Data。Header 负责路由和控制,Data 则携带具体的业务数据。在 SECS-I 或 HSMS 传输层中,消息还会被包裹上相应的传输层头部,但应用层始终遵循此结构。
3.2 Message Header 详解
Message Header 是 SECS 消息的指挥中心。它包含了消息路由和识别所需的所有关键字段。在 SECS-I 中,Header 固定为 10 字节;在 HSMS 中,Header 长度固定为 16 字节,但核心字段含义一致。
3.2.1 核心字段解析
| 字段 | 字节偏移 (SECS-I) | 说明 | 示例值 |
|---|---|---|---|
| Device ID | 0-1 | 设备标识符。用于区分多设备环境中的目标设备。通常由设备制造商设定。 | 0x0001 |
| Stream | 2-3 (高字节) | 消息的类别编号。范围 0-127。例如 Stream 1 为设备状态相关。 | 0x01 |
| Function | 2-3 (低字节) | 消息的具体功能编号。范围 0-255。例如 Function 1 为 Are You There Request。 | 0x01 |
| E-Bit | 3 (bit 7) | 结束位。0 表示还有后续消息块,1 表示这是最后一个消息块。 | 1 |
| W-Bit | 3 (bit 6) | 等待位。1 表示发送方期望收到回复。 | 1 |
| System Bytes | 4-7 | 系统字节。用于消息配对(请求与回复)。发送方生成唯一值,接收方在回复中回显。 | 0x00000001 |
3.3 Stream 与 Function 的概念
Stream 和 Function 共同构成了 SECS 消息的“指令码”。它们像一本书的章节和段落,Stream 是章节编号,Function 是段落编号。通过 SxFx 的组合,可以唯一定义一条消息的用途。
3.3.1 Stream(流)
Stream 定义了消息的类别。SECS 标准预定义了多个 Stream,每个 Stream 代表一类功能域。
- Stream 0 (S0): 用于测试和诊断。
- Stream 1 (S1): 设备状态与识别。例如 S1F1 (Are You There), S1F13 (Establish Communications Request)。
- Stream 2 (S2): 设备控制与诊断。例如 S2F41 (Remote Command)。
- Stream 5 (S5): 异常与报警。例如 S5F1 (Alarm Report)。
- Stream 6 (S6): 数据收集与事件。例如 S6F11 (Event Report)。
- Stream 7 (S7): 工艺程序管理。例如 S7F1 (Process Program Load)。
- Stream 10 (S10): 终端服务。例如 S10F3 (Terminal Display)。
3.3.2 Function(功能)
Function 定义了在特定 Stream 下的具体操作。Function 编号通常成对出现,形成请求/回复对。
- 奇数 Function: 通常表示请求(Primary Message)。例如 S1F1 是请求设备响应。
- 偶数 Function: 通常表示回复(Secondary Message)。例如 S1F2 是对 S1F1 的回复。
3.4 Data Item 详解
Data Item 是 SECS 消息中实际携带数据的单元。每个 Data Item 由三部分组成:Item Header、Length 和 Value。SECS 标准定义了多种数据类型,用于表示不同格式的数据。
3.4.1 数据类型
| 格式码 | 数据类型 | 描述 | 示例 |
|---|---|---|---|
| L | List | 列表,可以包含多个子 Item。是构建复杂数据结构的容器。 | <L [3]> ... </L> |
| A | ASCII | ASCII 字符串。用于文本信息,如设备 ID、状态文本。 | <A “ONLINE”> |
| B | Binary | 二进制数据。用于原始字节流。 | <B 0x01 0x02> |
| BOOLEAN | Boolean | 布尔值。True/False。 | <BOOLEAN True> |
| U1/U2/U4/U8 | Unsigned Integer | 无符号整数,长度分别为 1/2/4/8 字节。 | <U4 100> |
| I1/I2/I4/I8 | Signed Integer | 有符号整数,长度分别为 1/2/4/8 字节。 | <I4 -50> |
| F4/F8 | Floating Point | 浮点数,长度分别为 4/8 字节。 | <F4 3.14> |
3.4.2 Data Item 编码示例
以下是一个 S1F1 (Are You There Request) 消息的 SML 表示及其对应的二进制编码结构。
<!-- S1F1 的 SML 表示 -->
S1F1 W
<L [0]> <!-- 空列表,表示没有数据 -->
.
对应的二进制编码(简化):
Header: Device ID=0x0001, S=0x01, F=0x01, W=1, System Bytes=0x12345678
Data: <L [0]> (格式码 0x01, 长度 0x00)
3.5 消息结构综合示例
让我们通过一个完整的 S1F13 (Establish Communications Request) 消息,来串联本章的所有概念。