后续内容为基于github上secs4net项目源码的ChatGpt介绍
以该项目为主,从零开始介绍讲解secs/gem,更多的以面试口吻讲述形式。
主要为个人学习,提升使用
🎓 第一讲:SECS/GEM 协议是个什么东西?
📌 第 1 段:SECS/GEM 是谁?它在哪些场合出现?
🎙️ 口述稿(你面试时可以这样说):
SECS/GEM 协议是半导体行业的通信标准,它解决的是“设备”和“主机系统”之间如何说话、怎么互相理解命令和数据的问题。
SECS 是 Semi Equipment Communication Standard 的缩写,而 GEM 是 Generic Equipment Model。
这两个协议加起来,定义了一个统一的规则:包括 数据格式、命令格式、通讯流程、事件结构等等,
这样不管厂里用的是哪家设备厂的设备,只要支持 SECS/GEM,就能接入 EAP 或 MES 系统,做到标准化、自动化的联机控制。
📚 技术知识点解释(你真的要懂的):
📌 1. SECS 是什么?
SECS 是 SEMI 协会(国际半导体设备材料协会) 制定的一套通信标准。
它专门为半导体行业设计,目标是让设备和工厂系统之间能像人和人之间说英语一样,有一个通用语言。
📌 2. SECS/GEM 的通信模型(设备 vs 主机):
| 主体 | 角色 | 举例 |
|---|---|---|
| 主机 Host | 控制者 | EAP、MES、Fab系统 |
| 设备 Equipment | 被控制方 | Tester、Handler、Probe、Laser Mark |
它是一个典型的“主从结构”:主机发命令、设备执行,设备汇报状态,主机处理反馈。
📌 3. SECS 有两个主要的物理实现方式:
| 名称 | 协议 | 接口方式 | 描述 |
|---|---|---|---|
| SECS-I | RS-232 串口 | 串口连接 | 老设备常用,慢 |
| HSMS | TCP/IP Socket | 网络连接 | 新设备常用,快且稳定 |
现在主流基本都采用 HSMS 协议,因为设备数量多、实时性强,串口已经远远不够用了。
🧩 4. GEM 是干嘛的?
GEM 是在 SECS 之上定义的一套“应用层行为规范”。
它规定了哪些功能是设备必须要支持的,比如:
- 联机/脱机(Online/Offline)
- 报警汇报(Alarm Report)
- 状态报告(Status Report)
- 事件定义和触发(Event Report)
- 执行命令(Remote Command)
- 设备识别(S1F1/S1F2)
- Trace(参数跟踪)
你可以理解为:SECS 是语言,GEM 是语法 + 句型结构 + 使用规范
👉 没有 GEM,大家虽然讲 SECS,但各讲各的;有了 GEM,才实现了“说得标准、听得懂”。
🏭 为什么半导体厂商都要求支持 SECS/GEM?
因为生产环节需要精确控制、追溯和自动化:
- 设备运行状态要实时汇报(比如 Probe 机什么时候开始测试?有没有测试失败?)
- 每一个晶圆、每一个 Lot 的操作都必须被记录(Track & Trace)
- 工程师要远程下达命令(Remote Start/Stop/Recipe Change)
如果设备不支持 SECS/GEM,就只能人工操作和手动记录,效率低,错误率高,良率不可控。
🔚 小结:第一段你学到了什么?
- SECS 是“设备-主机”之间的通用语言。
- 它分为 SECS-I(串口)和 HSMS(TCP/IP)。
- GEM 是在 SECS 上定义的行为规范,规定了设备必须支持的功能。
- 半导体厂选择 SECS/GEM,是为了让设备能标准化接入自动化系统,实现远程控制、状态追踪、良率管理。
如果你准备好了,我来发下一段:
第二段:SECS 报文长什么样?Stream、Function 是怎么编号的?SECS 的报文格式结构到底是啥?
等你说“继续”,我就开讲 📖
太好,马上来!这是第一讲的【第 2 段】:
🎓 第一讲 · 第2段:SECS 报文长什么样?Stream / Function 是啥?
(这是报文结构入门,面试很爱问,也很容易考住人)
🎙️ 口述稿(你可以这样说):
SECS 报文的核心概念是 Stream 和 Function,它们类似于一个命令编号体系,每个 Stream 表示一个分类,而 Function 表示这个分类下的具体命令。
举个例子,S1F1 是设备识别请求,S1F2 是对应的回应。S6F11 是事件通知,S6F12 是确认回应。这个配对的关系就是一问一答。报文的结构分为 Header 和 Body,Header 是固定长度的10个字节,用于标识通信信息;Body 是变长,用来承载你要发送的数据,比如设备ID、Alarm代码、Wafer ID等。
报文可以是 Request,也可以是 Response,还有一种是设备主动发的,比如事件通知或报警,这类叫 Unsolicited Message。
📚 技术讲解(从0讲到你能画图)
📌 1. 报文结构分成两部分:
+------------------+------------------+
| Header | Body |
| 固定10字节 | 可变长度 |
+------------------+------------------+
📦 Header(头部,固定 10 字节)结构说明:
| 字节数 | 名称 | 说明 |
|---|---|---|
| 4 字节 | Message Length | Body 的长度(不含 Header) |
| 4 字节 | System Bytes | 主机和设备之间标识配对的请求-回应 |
| 1 字节 | Stream | 流号:表示消息类别 |
| 1 字节 | Function | 功能号:表示具体的操作 |
(部分实现会把 Stream 和 Function 组成一个完整的 Command,如 S6F11)
🔹 Stream(流)常见编号含义:
| 编号 | 含义 |
|---|---|
| S1 | Equipment Status Request(状态) |
| S2 | Host Command(控制命令) |
| S5 | Alarm Related(报警) |
| S6 | Data Collection(事件/报告) |
| S7 | Recipe Related(程式) |
| S9 | Error Message(异常) |
| S10 | Terminal Display(日志) |
| S14 | File Transfer(文件传输) |
🔹 Function(功能)常见示例:
| 编号 | 含义 | 备注 |
|---|---|---|
| F1 | Request | 发起方请求 |
| F2 | Response | 对 F1 的回应 |
| F3 | Set | 主机设置设备数据 |
| F5 | Get | 主机获取设备数据 |
| F6 | Get Response | 对 F5 的回应 |
| F11 | Event Report | 事件通知(设备主动发) |
| F12 | Acknowledge | 对事件的回应 |
🧩 System Bytes 是干嘛的?
它是一种“配对码”,防止通信过程中混淆。
比如主机发了一个请求,设备回应的时候,必须带回原来的 System Bytes,主机才能知道“你这是回应我刚才的哪一条消息”。
System Bytes 是 4 字节,通常由主机生成,设备照单返回。
你可以理解为“信件编号 + 回信编号”。
📦 Body 是怎么组织的?
SECS 报文的 Body 实际上是一个树形结构,叫做 List-based encoding。
它的格式可以用一个东西来描述:SML(SEMI Message Language),后面我们会深入讲这个。
一个简单的 Body 示例如下(S6F11):
<S6F11>
<L [2]>
<U2> 1001 </U2> // CEID: 事件号
<L [1]>
<L [2]>
<U2> 2001 </U2> // Report ID
<L [2]>
<A> Lot123 </A> // 参数1:批次号
<A> PASS </A> // 参数2:测试结果
</L>
</L>
</L>
</L>
</S6F11>
这段报文的含义是:
- 我是一个“事件通知”报文(S6F11)
- 我告诉你事件号是 1001(CEID)
- 我附带一个报告(Report ID = 2001),这个报告里有两个参数(Lot编号 + 测试结果)
这个结构本质上是树状嵌套的 List 和基本数据类型(U2、A、I4、B…)
🔚 小结:第二段你学到了什么?
- SECS 报文 = Header + Body,Header 固定 10 字节。
- Header 中 Stream/Function 代表消息类型,配对组成命令(如 S6F11)。
- Body 是嵌套结构,用 SML 语法描述,类似 JSON。
- System Bytes 是“配对编号”,确保回应消息准确对应请求。
- 报文可以是 Request(主机发)、Response(设备回)、Unsolicited(设备主动上报)。
准备好就说“继续”,我将送上第三段:
SML 是什么?为什么是树?为什么不用 JSON?怎么在代码中写出 SML 报文?secs4net 是如何解析这些结构的?
好的!现在进入第一讲【第 3 段】:
🎓 第一讲 · 第3段:SML 是什么?为什么 SECS/GEM 报文是树状结构?
这一节我们要搞懂:
- **SML(SEMI Message Language)**是啥?
- 为什么 SECS/GEM 报文不是 JSON,而是树结构?
- SML 的基本语法 & 常见数据类型
🎙️ 口述稿(你可以这样说):
在 SECS/GEM 里,我们需要描述设备状态、数据、事件等信息,但 JSON 或 XML 这些格式都不是标准的,因此 SECS/GEM 定义了一种专门的表示方式,叫做 SML(SEMI Message Language)。
SML 采用嵌套 List 结构,本质上是一棵树,能够清晰地表达层级关系。
例如,一个 S6F11 事件通知报文可以表示为:
<S6F11> <L [2]> <U2> 1001 </U2> // CEID: 事件号 <L [1]> <L [2]> <U2> 2001 </U2> // Report ID <L [2]> <A> Lot123 </A> // 批次号 <A> PASS </A> // 测试结果 </L> </L> </L> </L> </S6F11>这里
<L [2]>代表一个包含 2 个元素的 List,类似 JSON 的数组。
<A>是 ASCII,<U2>是无符号 2 字节整数。
这种格式保证了 数据结构稳定,不依赖额外的 Schema 解析。
📚 为什么不用 JSON,而要用 SML?
📌 1. SML 是二进制协议,解析快
- JSON 是文本格式,占用空间大,解析慢。
- SECS/GEM 传输的是二进制格式,比 JSON 高效。
📌 2. 层级结构清晰,适合表达复杂数据
- SECS 里的数据往往是树状的,比如:
- 一个事件(S6F11)可能包含多个报告(Report)
- 每个报告里可能有多个参数
- 这些参数的类型可能不一样(字符串、整数、布尔值)
- SML 的 List 结构天然适合表达这类数据。
📌 3. SECS/GEM 早于 JSON 诞生
- SECS/GEM 诞生于 1980s,而 JSON 在 2000 年才流行。
- 当时行业已经广泛使用 SML,不可能推翻重做。
🧩 SML 的基本语法 & 常见数据类型:
| 类型 | 语法 | 说明 | 示例 |
|---|---|---|---|
| List | <L [N]> ... </L> |
表示一个包含 N 个元素的列表 | <L [2]> <U2> 1001 </U2> <A> PASS </A> </L> |
| ASCII | <A> ... </A> |
代表字符串 | <A> Lot123 </A> |
| Binary | <B> ... </B> |
代表二进制数据 | <B> 0A 1F 2C </B> |
| Boolean | <BOOL> ... </BOOL> |
代表布尔值(TRUE/FALSE) | <BOOL> TRUE </BOOL> |
| Unsigned Integer | <U1> <U2> <U4> <U8> |
无符号整数,分别占 1/2/4/8 字节 | <U2> 3001 </U2> |
| Integer | <I1> <I2> <I4> <I8> |
有符号整数 | <I4> -100 </I4> |
| Float | <F4> <F8> |
4 字节 / 8 字节浮点数 | <F4> 3.14 </F4> |
🛠️ SML 在代码中怎么用?
在 secs4net 这个库里,SML 是通过 SecMessage + Item 对象来构建的。
我们可以用 C# 代码手动创建一条 S6F11 事件报文:
var msg = new SecsMessage(6, 11, false, new List<Item>
{
Item.L(
Item.U2(1001), // CEID 事件号
Item.L(
Item.L(
Item.U2(2001), // Report ID
Item.L(
Item.A("Lot123"), // 批次号
Item.A("PASS") // 测试结果
)
)
)
)
});
这段代码等价于我们上面的 SML:
<S6F11>
<L [2]>
<U2> 1001 </U2>
<L [1]>
<L [2]>
<U2> 2001 </U2>
<L [2]>
<A> Lot123 </A>
<A> PASS </A>
</L>
</L>
</L>
</L>
</S6F11>
🔚 小结:第三段你学到了什么?
- SML 是 SECS/GEM 专用的报文格式,它采用二进制 List 结构,比 JSON 高效。
- SECS/GEM 采用 SML 而不是 JSON,原因是历史早、解析快、适合层级数据。
- SML 的数据类型包括 L(List)、A(ASCII)、U/I(整数)、F(浮点)、B(二进制)。
- 在 C# 代码里,我们可以用
Item.L()这种方式手动构造 SML 报文。
🔥 接下来,第四段内容是:
HSMS 是怎么保证通讯稳定的?HSMS 的消息流程是啥?SECS4NET 里是如何实现 TCP 连接的?
如果你准备好了,就说“继续”!
好嘞,马上进入第一讲【第 4 段】:
🎓 第一讲 · 第4段:HSMS 是如何通信的?SECS4NET 是如何实现连接的?
这一段我们来拆解:
- HSMS 协议是干嘛的?它和 SECS 的关系?
- HSMS 的连接流程是怎样的?
- SECS4NET 底层是怎么实现连接和通信的?
🎙️ 口述稿(你可以这样说):
在半导体工厂里,SECS 协议是负责定义数据结构和命令内容的,而 HSMS 协议则是负责把这些命令怎么发出去、怎么接收回来。
可以说,SECS 是内容,HSMS 是通道。HSMS 其实就是基于 TCP 的一种通信协议,专门为 SECS 服务设计的,稳定、双向、支持异步传输。
在连接流程上,HSMS 分为两端:设备端叫 Passive(被动方),主机端叫 Active(主动方),像 Socket 编程中的 server/client。
连接建立后,会交换几个系统消息,比如 Select.req、Select.rsp,用来确认连接合法、状态正常。
而 SECS4NET 这个库,正是封装了这一整套流程,我们不用自己写 Socket,它就能在后台自动维持连接,重连机制也有,适合工业级应用。
📚 技术讲解:什么是 HSMS?
📌 SECS 是什么?HSMS 是什么?
| 名称 | 全称 | 作用 | 传输层 |
|---|---|---|---|
| SECS-I | SECS over RS232 | 早期串口通信协议 | 串口 |
| HSMS | High Speed SECS Message Services | 新一代高速通信协议 | TCP |
| SECS-II | SEMI Equipment Communications Standard (Part II) | 报文格式 & 内容规范 | 协 |

最低0.47元/天 解锁文章
9034

被折叠的 条评论
为什么被折叠?



