1. 先搞懂SECS/GEM到底在解决什么问题
1.1 半导体工厂“设备联网”的第一道门槛
做半导体设备软件这行,绕不开SECS/GEM。不管是做前道光刻机、刻蚀机,还是后道测试机、分选机,只要这台设备要进晶圆厂,要跟工厂的MES(制造执行系统)对话,就必须支持SECS/GEM。没有这个协议,设备在工厂里就是个信息孤岛,工艺参数靠人输、生产数据靠人抄,产线自动化根本无从谈起。
很多刚入行的人第一次接触SECS/GEM,第一反应都是“这不就是个通信协议吗,跟MODBUS、CAN差不多”。这个理解不能算错,但会让后面的学习走很多弯路。SECS/GEM不是一条简单的总线协议,而是一整套面向半导体制造场景的“设备通信与行为规范”。它定义了设备以什么格式上报数据、在什么时间点报、主机能不能干预、设备状态怎么迁移,甚至连超时时间、重传机制、数据精度都做了统一约定。
一句话概括:SECS/GEM解决的问题是“晶圆厂里几百台不同厂家的设备,如何用一种统一语言和主机对话”。有了它,换一台设备不用重写MES接口;加一台新设备,只要它符合GEM规范,主线系统就能直接接管。
1.2 协议族不是一个协议,而是一套组合
SECS/GEM通常被当作一个词来用,实际上它至少包含四层东西:
- SECS-I(SEMI E4):最早基于RS-232串口的物理传输协议,定义了数据块怎么在串口上分包、校验、重发。现在已经逐步退居二线,但老设备还在用。
- SECS-II(SEMI E5):消息层,定义数据怎么编码、消息由“Stream/Function”分组、数据项用什么类型嵌套,这是所有通信内容的“语法”。
- HSMS(SEMI E37):基于TCP/IP的以太网传输协议,现在主流设备基本都用HSMS替代SECS-I,端口一般约定为5000。
- GEM(SEMI E30):这层最关键,它规定设备必须具备哪些“行为能力”——怎么报告事件、怎么响应远程命令、怎么管理状态、怎么处理报警。
打个比方:SECS-I/HSMS是“邮局和邮车”,负责把信送到;SECS-II是“通用信纸格式”,规定了字怎么写、句子怎么排;而GEM是一本“办事员手册”,规定收到某封信之后该做什么动作、什么时候回信、哪些情况要主动发信。很多初学者只盯着SECS-II的消息格式研究,忽略了GEM的行为规范,结果报文能收发,联调时依然一塌糊涂。
2. 核心细节解析:消息格式和GEM行为模型
2.1 SECS-II 消息的四个核心字段
解析任何一条SECS-II消息,先看四个东西:Stream、Function、W-Bit、System Bytes。
Stream和Function缩写为“SxFy”,比如S1F13,就是指Stream 1、Function 13。Stream是消息的大类,Function是具体功能。为了方面记忆,业内一般按“S1Fxx是通信相关、S2Fxx是设备控制和数据采集相关、S5Fxx是报警相关、S6Fxx是事件报告相关、S7Fxx是配方相关”这个规律来查。当然这只是大类,具体还得翻SEMI E5标准。
W-Bit(Wait-Bit)表示这条消息是否需要对方回复。置1就是“请求-应答”模式,主方发一条带W的消息,从方必须回一条对应的消息才能结束这一个会话。典型的就是S1F13(Establish Communication Request),W位一定为1,对方回S1F14。如果W-Bit为0,表示这是单方面通知,不需要回复。
System Bytes呢,相当于这次会话的交易流水号。发请求时需要把用户自定义的四个字节系统字节带上,回复时原样带回,这样收发双方才能把“一问一答”配对起来。实际联调排障时,第一件事就是看系统字节能不能对上。对不上,要么是设备端代码写错了,要么是中间有网关做了消息改写。
2.2 SECS-II 数据项与SML嵌套结构
SECS-II的数据项类型不多,但嵌套规则很严格。最常见的类型有:
| 类型 | 含义 | 说明 |
|---|---|---|
| L | List,列表 | 类似JSON里的数组,可以继续嵌套任何类型 |
| A | ASCII字符串 | 不定长,按字节数限制 |
| U1/U2/U4/U8 | 无符号整数 | 按字节宽度区分,注意对齐 |
| I1/I2/I4/I8 | 有符号整数 | 常用于带符号的参数 |
| F4/F8 | 浮点数 | 单精度/双精度 |
| B | 二进制 | 原始字节流 |
| Boolean | 布尔值 | 单字节0或1 |
SML(SECS Message Language)是描述SECS-II消息的文本格式,类似XML一样可读可解析。比如S1F14返回设备信息和软件版本,SML长这样:
S1F14 W <L <A "MDLN-2024"> <A "SW-V1.0.3"> >但实际数据往往嵌套很深,一个事件报告里经常是“List套List,里面再套若干个Data Variable”,层级七八层都很常见。看这种报文,我建议手头准备一个带缩进的SML解析工具,或者直接用Wireshark的SECS/GEM插件,把十六进制报文转成人类可读的树状结构。要是纯靠肉眼盯十六进制,十个有九个会看花眼。
顺带说一句,SECS-II这种嵌套列表结构和JSON类似,考验的就是“嵌套深度”这个基本功。报文解析报错时,优先检查左右两边的List数量是否对称、每个元素的类型是否和双方约定的格式一致。
2.3 GEM比SECS重要的地方:状态模型
很多人在SECS-II消息上花了很多时间,但真正的难点在GEM。GEM规范的核心不是“怎么发消息”,而是“设备在什么状态下允许干什么事”。
GEM最常见的是三个状态维度:
- Communication State(通信状态):描述设备与主机之间的连接状态,是否已建立通信、是否正常会话。
- Control State(控制状态):描述设备由谁控制,通常有OFFLINE、ONLINE/LOCAL、ONLINE/REMOTE三态。OFFLINE就是设备独立运行,不接收主机远程指令;ONLINE/LOCAL是操作员在设备端本地控制;ONLINE/REMOTE是设备完全由主机远程控制。
- Processing State(处理状态):描述设备当前是否在加工、是否空闲、是否处于待料等。
这三个状态维度相互约束。比如主机想下发远程命令“开始加工”,设备只有在ONLINE/REMOTE且当前处于非加工状态下才能接受。如果设备还在OFFLINE,主机发命令过去,设备就该回错误码,而不是“无视”或者“照单全收”。
我见过不少设备端开发,把SECS消息收发写得挺顺,但状态机一塌糊涂。设备还在本地模式,主机一连接就认为可以远程操控;或者还在处理中,收到下一个Start命令也不拒绝。这种设备去FAB做资格认证时,会被GEM审计查得很难看。学SECS/GEM,一定要把状态模型当成一等公民,报文格式反而是学起来最快的部分。
3. 实操过程:从零搭建一套可运行的通信环境
3.1 学习路径:标准、工具、模拟器
很多新人一上来就问我“先学哪个标准”。我的建议路径很直接:先看SEMI E5找消息格式的感觉,再看E37了解TCP/IP传输层怎么建立连接,然后直接上手E30看GEM场景,E4串口协议可以放最后,除非你要维护老设备。
SEMI标准文档要收费,但E5、E30、E37这些核心资料在很多大学的镜像站、行业技术社区里都能找到搬运版本。注意,标准版本会更新,学习阶段用老版本问题不大,但上项目时一定要跟客户确认对方用的是哪个标准版本。
工具方面,我自己常用的搭配是:
- 模拟器:开源社区有很多SECS/GEM模拟器,设备端和Host端都有。设备端可以用Python开源库自建,Host端可以找现成的模拟Host,快速发指令验证。
- 抓包工具:Wireshark自带SECS/GEM支持,但要确认插件版本和TCP端口识别正常。抓包时过滤条件就写
tcp.port == 5000,一目了然。 - SML编辑器:很多商业协议模拟工具自带SML编辑和报文树查看,调试效率比看十六进制高太多。
3.2 设备端和Host端的角色分工
先明确角色:Host(主机)是主动发起方,一般部署在工厂MES或EAP(设备自动化平台)里;Equipment(设备端)是被动响应方,像光刻机、刻蚀机这类装备自己带一个软件模块,负责跟主机通信。
实际开发中,设备端工程师和主机端工程师都要懂协议,但侧重点不同。设备端更关心“怎么正确响应请求、怎么组织事件报文”;Host端更关心“怎么调度采集任务、怎么下远程命令”。学习阶段,我建议两边都模拟一遍:先用设备端模拟器跟一个现成Host工具联调,再反过来用Host脚本去连一个现成的设备端模拟器,这样双向视角都有体感,排障时不至于一头雾水。
3.3 用Python快速搭一个HSMS设备端示例
以最常见的HSMS通信为例,端口5000,设备向Host主动建立连接(Active Connection)。下面这段Python伪代码演示了设备端如何响应S1F13握手请求:
# 假设使用一个支持SECS/GEM的Python库 # 更贴近业务的写法如下,实际需参考具体库API from secsgem.gem import GemEquipmentHandler from secsgem.hsms import HsmsSettings settings = HsmsSettings( active=True, # 设备端主动连Host address="192.168.1.100", # Host 地址 port=5000 ) device = GemEquipmentHandler(settings) # 注册S1F13的处理函数:设备收到建立通信请求后,回S1F14 @device.stream(1).function(13) def handle_s1f13(handler, message): # 返回设备型号和软件版本 return [ "MDLN-2024", "SW-V1.0.3" ] device.start()代码的核心并不是语法细节,而是你注册了S1F13的回复逻辑后,协议库会自动帮你完成SECS-II消息的编码、HSMS的组包、TCP的收发。这让你可以把精力聚焦到设备业务逻辑上。
从报文角度来说,Host发S1F13时实际TCP负载大致是:HSMS头部带Message Length,随后是SECS-II的10字节Header(Device ID+Stream+Function+W位+System Bytes),正文为空。设备回S1F14时,Header一样,但正文是带两个A字符串的List。这段交互是所有SECS/GEM联调的“第一次握手”,能在抓包工具里完整看到并读懂它,基本就入门了。
3.4 常见GEM流程怎么走:事件上报、远程命令、报警
设备上线之后,最常见的三个业务流程是:
- 事件上报:比如一片晶圆加工完成,设备主动向主机发S6F11(Event Report),主机回S6F12确认。事件里要带上对应的数据变量(Data Variable),比如腔体温度、加工时间、良率参数。
- 远程命令:主机给设备发S2F41(Host Command),命令名和参数都由Register过的远程命令表决定,设备执行完回S2F42,带上执行结果。
- 报警上报:设备发现工艺异常,发S5F1(Alarm Report)给主机,主机回S5F2。报警码和报警级别需要事先在对齐阶段定义好。
建议你按这三个流程做三个小实验,自己写设备端模拟器,再用现成Host工具走通,比看十遍标准都有用。做完这三个流程,GEM的核心场景就掌握七八成了。
3.5 关于工具选型的一些真心话
商业化的SECS/GEM中间件像Cimetrix、SECSMI等,功能非常全,但授权费用不便宜,一般中小企业未必愿意掏。开源方案更适合学习和原型验证。Python生态里确实有几个可用项目,但功能完备度参差不齐,有些人可能还要看C++/Java的老库。选型不用太纠结,学习阶段重点是一头扎进去把协议逻辑吃透,工具只要能跑通就行。项目选型时再根据现场的设备平台、Host框架、性能要求来定。
4. 常见问题与排查技巧实录
4.1 连接不稳定,总是断线
HSMS连接建立后,双方靠心跳机制维持会话。E37里定义了完整的握手控制消息和超时参数,比如T3是“等待回复超时”,T5是“连接未建立时的重试间隔”,T6是“控制消息等待回复超时”,T7是“连接建立超时”,T8是“网络传输超时”。联调时最常见的就是T8太小,网络稍微抖动一下,设备端判断超时主动断开,主机还一脸懵。遇到连接不稳定,先看两端的超时配置是不是合理,再抓包看是不是有对端根本没回消息的异常。
4.2 消息能发出去,但对方解析失败
这类问题90%出在SECS-II消息的数据类型和嵌套层数不一致。比如约定好的返回格式是<L [<A 设备编号>, <U2 温度>]>,结果设备端填成了<L [<A 设备编号>, <U4 温度>]>,Host端按约定解析当然就报错。另一种常见错误是字符串长度没控制,A类型是按字节截断的,中文用UTF-8编码后长度很容易算错。建议两端的消息数据结构做成配置文件,联调时逐字段核对,别靠脑子记。
4.3 设备收不到远程命令
远程命令的前提是设备处于ONLINE/REMOTE状态。先查设备当前的控制状态:S1F1(请求设备状态)可以返回设备的控制状态;如果状态不对,主机需要先发S1F15(请求离线)或S2F17? 其实是S1F16等切换状态的指令。很多调试问题最后定位都是“设备还在LOCAL模式”,压根不是协议格式问题。
4.4 事件报告丢失或延迟
事件报告是设备主动发S6F11给主机,主机必须在超时时间内回S6F12,否则设备会觉得消息没被确认,按GEM规范可能触发事件队列溢出。如果设备上配置了很大的事件队列,延迟会越来越大。联调时建议把事件上报频率压得低一点,先把链路稳定性验证好,再逐步加量。
4.5 开发联调阶段最重要的几个习惯
第一,日志要详细,尤其是系统字节(System Bytes)和收发原始报文都必须记录。没有日志寸步难行。
第二,抓包工具要随时能上。很多时候设备端和Host端各说各话,只有抓包能还原现场。
第三,建立一套从“S1F13->S1F14握手”到“状态切换->事件上报->报警上报”的冒烟测试用例集,每次改完代码先跑一遍,能省掉大量返工时间。
| 现象 | 优先排查项 | 补充建议 |
|---|---|---|
| 连接建立不成功 | 端口不通、IP配置错误、T5/T7超时太短 | 用telnet或nc先测TCP层通不通 |
| 握手后马上断 | 设备版本与Host版本不兼容 | 抓包看Response消息的状态码 |
| 消息解析失败 | 数据类型/长度不匹配 | 用SML树逐节点对比 |
| 远程命令不执行 | 设备控制状态不是ONLINE/REMOTE | 先查状态模型再查报文 |
| 事件丢失 | 事件队列溢出、S6F12未及时回 | 检查事件队列配置和T3超时 |
5. 一点学习心法和后续扩展方向
学习SECS/GEM,最忌讳的是只研究报文不会看状态,或者只会用工具不懂原理。我的体会是,先把SECS-II的SML结构和GEM三大状态模型刻在脑子里,再上手模拟器,效率最高。
另外,这个协议虽然名字老,但演进一直没有停。GEM 300标准已经覆盖了300mm产线更细化的自动化需求,一些新的设备端软件架构也开始往微服务方向切,把GEM通信模块独立成服务。后续如果条件允许,可以再去研究一下GEM 300的Advanced Process Control相关部分,以及设备端如何通过SECS/GEM实现配方管理和设备参数追溯。方向很多,但核心能力始终是“真正理解设备和主机之间如何可靠地协同工作”,这个底层逻辑到哪里都通用。
最后再分享一个小技巧:遇到复杂场景,先把报文手工写成SML文本,再翻译成十六进制对照学习,坚持一段时间,你对数据类型的敏感度会有质的提升。这套方法我带过的不少新人用过,普遍反馈比较有效,希望对正在学SECS/GEM的你也一样有用。