2、SECS/GEM基础回顾:HSMS与SECS-I通信协议、消息结构、状态机模型

在深入设备连接参数的动态配置之前,必须牢固掌握SECS/GEM的通信骨架。本章将系统回顾两大传输协议——HSMS(High-Speed SECS Message Services)与SECS-I(SECS-I 串行通信),剖析标准消息结构(Message Header & Data Item),并解析设备与主机的状态机模型。这些基础概念是后续动态配置与持久化存储的底层支撑。

2.1 HSMS与SECS-I:两种通信协议对比

SECS/GEM标准定义了两层通信:物理/链路层(SECS-I 或 HSMS)与会话层(HSMS 同时承担会话管理)。SECS-I 基于RS-232串口,HSMS基于TCP/IP网络。现代半导体工厂几乎全部采用HSMS,但理解SECS-I有助于应对老旧设备兼容场景。

特性 SECS-I(串行) HSMS(以太网)
物理介质 RS-232 串行电缆(点对点) TCP/IP 以太网(局域网/跨网段)
传输速率 9600 / 19200 bps(典型) 10/100/1000 Mbps(典型)
连接模型 物理线缆直连,无连接管理 TCP 连接 + 会话建立/断开
消息分帧 长度字节 + 块号 + 校验和 长度前缀(4字节)+ 消息头
多块消息 支持(块号递增,E-bit标记) 支持(块号递增,E-bit标记)
会话管理 无(物理连接即会话) Select / Deselect / Linktest
适用场景 老旧设备、低速单机 现代工厂、高速多设备集群
协议选择建议: 新项目默认使用HSMS。若需兼容1990年代前的设备,可考虑SECS-I转HSMS网关。动态配置系统通常只实现HSMS连接参数(IP、端口、连接模式),SECS-I参数(波特率、校验位)仅在特殊适配层出现。

2.2 消息结构:Message Header & Data Item

SECS/GEM消息由两部分组成:消息头(Message Header) 和 数据项(Data Item)。消息头固定10字节(HSMS)或类似结构(SECS-I),数据项采用SML(SECS Message Language)格式编码。

2.2.1 HSMS消息头结构

字节偏移 字段名 长度 说明
0-3 Length 4字节 消息体总长度(包含Header+Data)
4 Device ID 1字节 设备ID(低7位有效,bit0为控制位)
5 Stream 1字节 消息流编号(0-255)
6 Function 1字节 消息功能编号(0-255)
7 PType 1字节 协议类型(0=SECS-II)
8 SType 1字节 会话类型(0=数据消息,1-9=控制消息)
9 System Bytes 4字节 系统字节(事务ID,用于请求-响应匹配)
关键字段解读:
- Device ID:标识设备,范围0-127。动态配置中常需修改此ID以切换设备身份。
- Stream/Function:构成S2F41、S6F11等标准消息ID。动态配置可能涉及消息过滤或路由。
- System Bytes:用于匹配请求与响应。在重连或会话恢复时,系统字节管理策略至关重要。

2.2.2 Data Item 编码示例

数据项采用 长度-类型-值(LTV) 或 格式-长度-值(FLV) 编码。以下为Python解析示例:

def parse_data_item(data: bytes):
    """
    解析SECS-II数据项(简化版)
    格式:Format Byte (1B) + Length (1-3B) + Value
    """
    format_byte = data[0]
    format_code = (format_byte >> 2) & 0x3F  # 高6位为格式码
    length_bytes = format_byte & 0x03  # 低2位为长度字节数

    if length_bytes == 0:
        item_length = 0
        value_start = 1
    elif length_bytes == 1:
        item_length = data[1]
        value_start = 2
    elif length_bytes == 2:
        item_length = int.from_bytes(data[1:3], 'big')
        value_start = 3
    else:
        item_length = int.from_bytes(data[1:4], 'big')
        value_start = 4

    value = data[value_start:value_start + item_length]
    return format_code, item_length, value

# 示例:解析一个ASCII字符串数据项
raw = bytes([0x41, 0x05, 0x48, 0x65, 0x6C, 0x6C, 0x6F])  # A-format, length=5
fmt, length, val = parse_data_item(raw)
print(f"Format: {fmt}, Length: {length}, Value: {val.decode('ascii')}")

2.3 状态机模型:设备与主机的通信生命周期

SECS/GEM定义了严格的状态机模型,确保设备与主机在连接、通信、断开等场景下行为一致。状态机分为设备状态机和通信状态机,两者协同工作。

2.3.1 通信状态机(Communication State Machine)

通信状态机管理TCP连接与会话生命周期,包含以下核心状态:

  • NOT CONNECTED:未建立TCP连接。设备处于监听或待连接状态。
  • CONNECTED:TCP连接已建立,但未选择(Select)会话。
  • SELECTED:会话已选择,可收发SECS-II数据消息。
  • COMMUNICATING:数据消息正在交换,状态机活跃。
常见陷阱: 许多动态配置失败案例源于状态机未正确迁移。例如,修改IP地址后未触发重新连接,导致状态机卡在CONNECTED状态;或重连后未重新Select,导致消息被主机拒绝。
HSMS 通信状态机 NOT CONNECTED CONNECTED SELECTED COMMUNICATING TCP 连接建立 Select.req 数据消息交换 TCP 断开 / 超时 动态配置触发状态重置 需重新执行Select流程

2.3.2 设备状态机(Equipment State Machine)

设备状态机描述设备从初始化到生产运行的整体状态,与通信状态机独立但交互。主要状态包括:

  • INIT:设备上电,自检中。
  • ATTEMPT_ONLINE:尝试与主机建立通信。
  • ONLINE:设备在线,可接收主机指令。
  • OFFLINE:设备离线,本地操作模式。
  • LOCAL:设备本地控制,但通信链路仍可保持。
状态 通信状态机关联 动态配置影响
INIT NOT CONNECTED 可在此阶段加载持久化配置
ATTEMPT_ONLINE CONNECTED → SELECTED 配置IP/端口后自动触发
ONLINE SELECTED / COMMUNICATING 参数热更新需谨慎(建议先OFFLINE)
OFFLINE CONNECTED(可保持) 安全修改连接参数
LOCAL SELECTED(可保持) 本地参数修改,不中断通信
动态配置最佳实践: 修改HSMS连接参数(IP、端口、Device ID)前,先将设备状态切换至OFFLINE,修改后重新执行ATTEMPT_ONLINE流程。对于Data Item格式的配置参数(如工艺配方),可在LOCAL状态下通过S2F41写入,无需断开通信。

2.4 本章小结