SECS/GEM协议基础:SECS-I与SECS-II的区别、GEM标准的核心概念、消息结构
好,咱们今天聊聊SECS/GEM协议的基础。说实话,我刚入行那会儿,看到SECS-I、SECS-II、GEM这几个词,头都大了。它们到底什么关系?别急,我慢慢给你捋清楚。
一、SECS-I vs SECS-II:一个管运输,一个管内容
打个比方你就明白了。SECS-I就像快递公司的货车,负责把包裹从A点运到B点。SECS-II呢,就是包裹里面装的东西——是衣服还是书,得有个标准。
SECS-I 定义的是物理层和数据链路层。说白了,它规定了:
- 用什么样的线缆(RS-232C,后来也有RS-422)
- 数据怎么打包成帧(Block)
- 怎么握手、怎么重传
SECS-II 定义的是应用层。它规定了:
- 消息的格式(Message Header + Body)
- 消息的类型(Primary Message / Secondary Message)
- 数据项的编码方式(比如整型、ASCII字符串、列表等)
核心区别一句话:SECS-I 管「怎么传」,SECS-II 管「传什么」。
我记得有一次,设备端老是报通讯超时。我排查了半天,发现是SECS-I层的Block Size设置得太大,导致传输延迟。嗯,这种问题在SECS-II层是看不出来的。
二、GEM标准的核心概念
GEM(Generic Equipment Model)是在SECS-I和SECS-II之上的一层。它定义了设备的行为模型。说白了,GEM告诉设备:
- 什么时候该发什么消息
- 收到什么消息该怎么响应
- 状态怎么管理、报警怎么处理
GEM的核心概念包括:
| 概念 | 说明 |
|---|---|
| Equipment Model | 设备的状态模型(如:INIT、IDLE、PROCESSING) |
| Collection Events (CE) | 设备上报事件的机制(比如:晶圆到位、加工完成) |
| Alarm Management | 报警的设定、清除、上报 |
| Remote Command (RCMD) | 主机远程控制设备(如:启动、停止、复位) |
| Variable Management | 设备状态变量(SV)、数据变量(DV)的读写 |
个人经验:我建议你在开发GEM时,先把Equipment Model画清楚。状态机一旦乱了,后面所有逻辑都会跟着乱。我曾经在一个项目里,因为状态转换条件没写全,导致设备在PROCESSING状态下还能接受RCMD的「复位」指令,结果晶圆直接报废了。
三、消息结构:Message Header & Body
SECS-II的消息结构,说白了就两部分:Header 和 Body。
3.1 Message Header
Header 固定10个字节。结构如下:
| 字节偏移 | 字段 | 说明 |
|---|---|---|
| 0-1 | Device ID | 设备ID(通常0表示主机,1-32767表示设备) |
| 2 | R bit + Stream | R bit(0=Primary, 1=Secondary),Stream编号 |
| 3 | Function | Function编号 |
| 4-5 | Block Number | 块号(用于多块消息重组) |
| 6 | E bit + System Bytes | E bit(0=中间块, 1=最后块),System Bytes高2位 |
| 7-9 | System Bytes | 系统字节(用于消息配对) |
这里有个坑,我当年踩过。System Bytes 是4个字节,但分布在两个地方。如果你自己拼包,一定要小心字节顺序。我曾经因为搞错了System Bytes的拼接方式,导致主机一直收不到Secondary Response,排查了整整两天。
3.2 Message Body
Body 是可变长的,采用SECS-II的数据项编码(SML格式)。常见的类型有:
- L:列表(List),可以嵌套
- A:ASCII字符串
- B:二进制数据
- I1/I2/I4/I8:有符号整数(1/2/4/8字节)
- U1/U2/U4/U8:无符号整数
- F4/F8:浮点数
- BOOLEAN:布尔值
举个例子,一个典型的S1F1消息(Are You There Request)的Body是空的。而S1F2(Are You There Response)的Body可能长这样:
<L>
<A>MDM-1000</A> <!-- 设备型号 -->
<A>Rev 3.2</A> <!-- 软件版本 -->
</L>
注意:Body的编码是严格按长度前缀的。比如 <A> 后面先跟一个字节表示字符串长度,再跟实际内容。如果你自己写解析器,千万别忘了这个长度字段。我曾经见过一个团队,直接按固定偏移读字符串,结果设备换了固件版本后,通讯全乱了。
四、知识体系总览
下面这张图,是我自己画的SECS/GEM协议栈结构。你一看就明白各层的关系了。
你看,从上到下,GEM依赖SECS-II,SECS-II依赖SECS-I。每一层各司其职,缺一不可。
避坑指南:我曾经在一个项目里,只实现了SECS-II和GEM,觉得SECS-I用现成的库就行。结果设备连上后,老是丢包。后来发现是SECS-I层的超时重传参数没调好。所以,别小看底层,每一层都得认真对待。
好了,SECS/GEM协议的基础就聊到这儿。你只要记住:SECS-I管运输,SECS-II管内容,GEM管行为。消息结构就是Header+Body,Header固定10字节,Body用SML编码。把这些搞清楚了,后面开发起来就顺了。