1. 课程导入与SECS-II协议全景
在半导体制造工厂中,一台晶圆刻蚀机、一台量测机台或一套传送机械手,往往需要与工厂主机(Host)持续交换成百上千条指令与数据。设备要上报“晶圆已到位”,主机要下发“开始工艺配方”,量测机台要回传厚度、电阻率等测量结果——这些交互背后,依赖的正是SEMI组织定义的一套通信标准体系。本课程聚焦其中的核心:SECS-II消息解析与设备指令交互实战。在动手解析报文之前,我们需要先建立一张完整的“地图”,弄清楚各层协议各自负责什么、彼此如何衔接,以及我们最终要在哪一层做文章。
一、学习目标
完成本课程后,你应当能够独立完成以下工作:读懂一条SECS-II消息的完整结构,包括流(Stream)、功能(Function)、数据项(Data Item)与列表(List)的嵌套关系;能够手工或借助工具解析十六进制报文,还原出设备实际发送的语义;能够基于HSMS建立与设备或模拟器的连接,完成S1F1、S1F13、S2F41等典型消息的收发;能够定位常见的通信故障,例如连接建立失败、消息超时、数据格式不匹配等。简单说,目标是“看得懂、连得上、发得出、查得清”。
二、半导体设备通信架构
典型的设备通信架构可以自上而下分为四层。最上层是工厂主机系统(MES/EAP),负责生产调度与数据采集;中间是通信协议层,即SEMI标准定义的SECS-I、HSMS与SECS-II;最下层是设备的控制软件与工艺模块。主机与设备之间并非直接“对话”,而是通过协议层完成消息的封装、传输与解析。设备内部的设备控制程序(Equipment Control)把工艺状态、报警、测量值组织成SECS-II消息,再交给下层传输协议发送出去;主机侧则反向解析并作出响应。
理解这个架构的关键在于:SECS-II只定义“消息长什么样、代表什么含义”,它不关心消息怎么在网线或串口上传输。传输任务由SECS-I或HSMS承担。这种分层设计使得同一套SECS-II消息可以跑在不同的物理链路上。
三、SECS-I、HSMS、SECS-II与FTP的关系
这四者常被初学者混为一谈,其实分工非常清晰。SECS-II是“语言”,规定消息的语法与词汇;SECS-I和HSMS是“嗓门和电话线”,负责把语言传出去;FTP则是“快递”,专门运送大件物品。具体来说:
- SECS-II(SEMI E5):定义消息内容。每条消息由Stream和Function编号标识,例如S1F1是“Are You There”请求,S1F2是应答。消息体由数据项组成,数据项有格式码(如A表示ASCII,U4表示4字节无符号整数,L表示列表)。
- SECS-I(SEMI E4):基于RS-232串口的传输协议,采用块传输和握手应答机制,速率通常为9600bps到115200bps。它定义了块头、校验和、重传规则。
- HSMS(SEMI E37):基于TCP/IP的传输协议,支持全双工、多会话,是现代设备的主流选择。它定义了连接建立、选择、取消选择、心跳等状态机。
- FTP:不承载SECS-II消息,而是用于传输工艺配方、量测原始数据、设备日志等大文件。主机和设备之间通常约定好文件路径和命名规则。
一个常见的误解是“HSMS就是SECS-II”。实际上HSMS只负责把SECS-II消息字节流可靠地送到对端,消息的含义仍由SECS-II解释。调试时如果连接建立成功但消息无响应,问题往往在SECS-II层而非HSMS层。
四、典型应用场景
在晶圆厂中,SECS-II消息贯穿生产全流程。举几个典型场景:设备启动后,主机发送S1F13建立通信,设备回S1F14确认;生产前,主机用S2F41下发远程命令(如“开始工艺”),设备回S2F42报告执行结果;工艺过程中,设备主动发送S6F11事件报告,携带晶圆ID、腔体状态等数据;量测机台完成测量后,通过S6F11上报测量值,或通过FTP上传详细数据文件。报警发生时,设备发送S5F1报警消息,主机回S5F2确认。这些场景构成了设备与主机交互的主干。
五、实战环境搭建
本课程的实战环境不依赖真实产线设备,而是用软件模拟器搭建。推荐方案如下:
- 准备一台开发机(Windows或Linux均可),安装Python 3.8以上版本。
- 安装开源SECS/GEM库,例如
secsgem,它同时支持HSMS和SECS-I,并提供设备端与主机端模拟。 - 编写一个简单的设备端脚本,监听端口5000,等待主机连接。
- 编写主机端脚本,连接设备端,发送S1F1并打印收到的S1F2内容。
- 使用Wireshark抓包,观察HSMS的Select请求与SECS-II消息的十六进制字节流,对照解析结果验证理解。
下面是一段最小可运行的设备端示例代码,用于接收S1F1并回复S1F2:
from secsgem.hsms import HsmsServer
from secsgem.secs import SecsStreamFunction
def on_s1f1(connection, message):
# 收到S1F1,回复S1F2,携带设备型号与版本
reply = SecsStreamFunction(1, 2, {
"MDLN": "ETCHER-01",
"SOFTREV": "1.0.3"
})
connection.send_response(reply)
server = HsmsServer(port=5000)
server.register(1, 1, on_s1f1)
server.start()
print("设备端已启动,监听5000端口...")
运行后,用主机端脚本连接并发送S1F1,若能在设备端日志看到消息并收到S1F2回复,说明环境搭建成功。此时再用Wireshark抓包,你会看到HSMS的Select.req、Select.rsp,以及后续的Data消息。把Data消息的十六进制内容复制出来,对照SECS-II格式码逐字节解析,就能真正理解“消息长什么样”。