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协议栈结构。你一看就明白各层的关系了。

SECS/GEM 协议栈结构 GEM (Generic Equipment Model) 设备行为模型:状态管理、事件上报、报警、远程命令 SECS-II (Message Layer) 消息结构:Header (10字节) + Body (SML编码) SECS-I (Transport Layer) 物理层:RS-232C/RS-422,数据帧、握手、重传 应用层 表示层 传输层 设备行为 消息格式 物理传输

你看,从上到下,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编码。把这些搞清楚了,后面开发起来就顺了。

专注资料整理