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:用于匹配请求与响应。在重连或会话恢复时,系统字节管理策略至关重要。
- 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,导致消息被主机拒绝。
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写入,无需断开通信。