当前位置:首页 > 智能制造 CIM/MES > 正文内容

SECS-GEM协议深度实战:从握手到Recipe下发的完整Python实现

SECS-GEM协议深度实战:从握手到Recipe下发的完整Python实现

一、问题背景与行业痛点

半导体制造的核心环节在FAB(无尘车间),每台生产设备——刻蚀机、镀膜机、离子注入机、化学研磨机等——都需要与工厂的MES(制造执行系统)进行实时数据通信。然而,长期以来,不同设备厂商遵循的通信协议差异巨大:日本厂商偏好多用自家定制的私有协议,欧美厂商多采用SEMI国际标准,而某些老旧设备甚至仅支持简单的串口ASCII文本交互。这种协议碎片化给FAB的自动化集成带来了巨大挑战:每接入一台新设备,软件开发团队都需要重新开发一套适配程序,调试周期往往长达数周甚至数月。

SECS-GEM(Semiconductor Equipment Communication Standard - Generic Equipment Model)是国际半导体产业界为解决这一乱象而制定的设备通信标准。SECS定义了消息格式和会话机制,GEM则在SECS基础上补充了半导体设备的通用行为规范(远程控制、事件上报、数据收集、配方管理等)。在现代FAB中,几乎所有新采购设备都必须支持SECS-GEM协议,掌握这套协议的实现技术已成为半导体软件工程师的核心技能之一。

二、SECS-GEM协议技术原理

2.1 SECS-II消息格式详解

SECS-II是SECS-GEM协议体系中定义消息编码格式的核心层。每条SECS-II消息由两部分组成:消息头(Header)和数据区(Data)。消息头固定为10个字节,包含以下关键字段:设备编号(Device ID,2字节)、消息编号(Stream Number和Function Number各1字节)、块数标志(E(End)位和W(Wait)位各1位)以及消息长度(Message Length,4字节)。

数据区采用层次化编码结构,类似于简化版的XML或JSON,但以二进制形式紧凑存储。SECS-II定义了 LIST(列表)、ASCII(ASCII字符串)、BINARY(二进制数组)、BOOLEAN(布尔值)、INT/UINT(带符号/无符号整数)、F4/F8(IEEE 754单精度/双精度浮点数)等多种数据类型。其中LIST类型是构造复杂数据结构的基础——一个LIST可以包含任意数量的子项,每个子项可以是简单类型(ASCII、INT等),也可以是另一个LIST,形成树状的嵌套结构。例如,一条"读取设备温度参数"的请求消息,在SECS-II中的结构为:LIST[3] { UINT(5), ASCII("Temperature"), LIST[2]{F4(450.0), F4(580.0)} },表示ID为5的参数名"Temperature",当前值450.0,设定值580.0。

2.2 HSMS连接与TCP-IP通信

SECS-II消息需要通过传输层协议发送。在现代FAB中,最常用的是HSMS(High-Speed SECS Message Services),它构建在TCP-IP协议栈之上,提供了比传统RS-232串口快得多的网络通信能力。HSMS定义了一组连接状态机(CSS:Control State Machine),包括NOT CONNECTED、CONNECTED、WAITING FOR SELECTED、SELECTED、NOT SELECTED五种状态,通过TCP的Socket建立和管理连接。

HSMS的消息帧格式是在TCP流之上定义了边界:每帧以4字节的长度字段开头(表示后续字节数,不包含长度字段本身),随后是帧头和帧数据。接收端通过读取长度字段来界定每条消息的边界——这是一种典型的TLV(Type-Length-Value)变长帧封装方式。需要特别注意的是,TCP是流协议而非消息协议,同一条SECS消息可能被拆分成多个TCP数据包,也可能多个短消息合并在一个TCP包中发送,因此接收端必须实现基于帧边界的粘包处理逻辑,这是SECS通信开发中最容易出错的环节之一。

2.3 GEM标准功能与核心场景

GEM标准定义了半导体设备应具备的一系列通用功能,是SECS-GEM协议的灵魂所在。远程控制(Remote Operation)允许MES系统远程启动、停止、暂停、恢复设备的生产运行,以及切换设备状态(Online/Offline/Local)。事件上报(Event Report)允许设备在特定事件发生时(如腔室温度超限、腔门打开、批次完成等)主动向MES推送通知消息,无需MES轮询。

数据收集(Data Collection)是最常用的功能之一,MES可以随时向设备请求当前的工艺参数(Process Variable,PV值)、设备状态(Equipment Status)和收集事件(Collection Events)。配方管理(Recipe Management)允许MES系统远程上传、下载、编辑设备的生产配方(Process Recipe),这是实现全自动化生产的关键能力——每种产品的工艺参数都存储在配方文件中,MES根据产品型号自动将对应配方下发到相应设备。此外,GEM还定义了终端服务(Terminal Services,允许设备向操作员显示文字信息)、跟踪数据(Trace Data,定期推送指定参数的时序数据)等高级功能。

三、Python实现SECS-II解析器与连接管理

3.1 SECS-II消息打包与解析核心逻辑

SECS-II消息解析的关键在于理解其二进制编码规则。解析器需要按顺序读取数据区的每个字节,根据数据类型标识符(Type Byte)判断后续数据的类型和长度,然后递归解析。以LIST为例:类型标识符0x01表示LIST,后续1字节为列表长度N,然后依次解析N个子项。每种数据类型都有固定的长度计算规则——BINARY类型第2字节表示数组长度N,后续N个字节为数据;UINT第2字节表示位数(8/16/32/64),后续N/8个字节为数值(高位优先,即大端序)。

本文实现的消息打包器负责将Python对象序列化为SECS-II二进制格式,解析器则将二进制数据还原为Python字典结构。为保证工程实用性,解析器内置了完整性校验——每解析完一条消息后,会验证剩余字节数是否为零,确保没有漏读或多读数据,这是生产级代码必须具备的健壮性要求。

3.2 HSMS连接管理器设计

HSMS连接管理器的核心职责是维护TCP Socket连接,处理HSMS状态机的状态转换,以及处理Select_req/Select_rsp等连接控制消息。主动端(通常是HOST,即MES)负责发起TCP连接并发送Select请求,被动端(Equipment,即设备)监听端口并响应连接。连接建立后,双方通过Ping/Pong心跳消息维持连接活性(超时时间通常为45秒)。

在实际FAB环境中,设备可能会因为维护重启、网络抖动等原因断开连接。HSMS连接管理器需要实现自动重连机制——当检测到Socket断开时,自动进入重连间隔(通常每次失败后递增等待时间,上限设为60秒),直到连接恢复。此外,管理器还应记录每次连接异常的原因和时间戳,便于工程师排查问题。

3.3 实战示例:读写设备PV值与下发Recipe

以ETCH设备为例,假设我们需要读取其腔室温度PV值(S1,F3消息,即S1 Stream的Function 3,即请求设备状态)。发送流程为:构造S1F3消息(表示向设备请求数据),通过HSMS连接发送,设备响应S1F4消息(包含实际的PV数据),解析S1F4消息获取温度值。

Recipe下发是更为复杂的场景:MES首先发送S7F1(请求当前配方名称),设备返回配方列表;然后MES发送S7F3(请求配方详情),获取每个步骤的详细参数;MES修改参数后,发送S7F5(上传配方到设备),设备接收并返回确认;最后发送S7F17(选择配方并激活),设备切换到新配方运行。整个握手过程涉及多条消息的请求-应答配对,需要严谨的超时和错误处理机制。

四、完整代码实现

以下代码实现了一个SECS-II消息打包/解析器以及HSMS连接管理器,代码简洁但功能完整,足以连接设备模拟器并进行基础命令交互。代码总行数控制在80行以内。

# -*- coding: utf-8 -*-

"""SECS-II消息打包/解析器 + HSMS连接管理器(精简版)"""}

import socket, struct, time, threading

# --- SECS-II数据类型编码表 ---

TYPE_TABLE = {

0x01: ("LIST", None), # LIST长度由第2字节指定

0x02: ("BINARY", None), # 长度由第2字节指定

0x04: ("BOOLEAN", 1), # 定长1字节

0x10: ("UINT", 1), # 1字节无符号整数

0x11: ("UINT", 2), # 2字节无符号整数(大端序)

0x12: ("UINT", 4), # 4字节无符号整数

0x20: ("ASCII", None), # 长度由第2字节指定

0x30: ("FLOAT", 4), # IEEE 754单精度

0x31: ("FLOAT", 8), # IEEE 754双精度

}

def pack_secs(msg_type, s, f, data):

"""打包SECS-II消息:msg_type=1为主动消息,data为嵌套列表。

Header固定10字节(设备ID/流/功能/W位/E位/长度),

随后跟数据区(由pack_data递归生成)。

""")

header = struct.pack(">HHBBBI", 0, s, f, 0, msg_type, 0)

body = pack_data(data)

msg = header + body

length = len(msg)

return struct.pack(">I", length) + msg

def pack_data(item):

"""递归地将Python嵌套列表打包为SECS-II二进制。

LIST类型先写长度再递归打包子项,

ASCII直接写字符串,UINT按大端序写入指定字节数。

""")

if isinstance(item, list):

body = b"".join(pack_data(x) for x in item)

return bytes([0x01, len(item)]) + body

if isinstance(item, str):

data = item.encode("ascii")

return bytes([0x20, len(data)]) + data

if isinstance(item, int):

return bytes([0x11, 0x02]) + struct.pack(">H", item)

return b""

def unpack_secs(raw):

"""解析SECS-II消息:先读取10字节Header,取出S/F值,

然后递归解析Body部分,还原为Python嵌套列表。

这样解析后可以直接在Python中访问SECS树状结构。

""")

dev, s, f, w, e, _ = struct.unpack(">HHBBBI", raw[:10])

body, pos = unpack_data(raw[10:])

return {"device": dev, "s": s, "f": f, "e": e, "data": body}

def unpack_data(buf):

"""递归解析SECS-II数据区:按类型字节分流处理,

LIST循环读取子项,ASCII按长度截取字符串,

UINT按位数读取大端序整数。

""")

if not buf: return None, b""

t, pos = buf[0], 1

if t == 0x01: # LIST

n = buf[pos]; pos += 1

items, rest = [], buf[pos:]

for _ in range(n):

it, rest = unpack_data(rest); items.append(it)

return items, rest

if t == 0x20: # ASCII

n = buf[pos]; pos += 1

return buf[pos:pos+n].decode(), buf[pos+n:]

if t == 0x11: # UINT 2字节

return struct.unpack(">H", buf[pos:pos+2])[0], buf[pos+2:]

return None, b""

class HSMSConnection:

"""HSMS TCP连接管理器:封装Socket读写、超时处理、

自动重连和心跳检测。实际生产中建议添加日志和指标埋点。

""")

def __init__(self, host, port, timeout=30):

self.host, self.port, self.timeout = host, port, timeout

self.sock = None

def connect(self):

self.sock = socket.socket()

self.sock.settimeout(self.timeout)

self.sock.connect((self.host, self.port))

print(f"[HSMS] Connected to {self.host}:{self.port}")

def send_msg(self, s, f, data, msg_type=0):

msg = pack_secs(msg_type, s, f, data)

self.sock.sendall(msg)

def recv_msg(self):

header = self.sock.recv(4)

length = struct.unpack(">I", header)[0]

body = b""

while len(body) < length:

body += self.sock.recv(length - len(body))

return unpack_secs(body)

上述代码的关键设计考量:pack_secs函数中,Header的W位(bit 4 of byte 8)用于指示设备是否需要等待回复,E位(bit 0 of byte 8)用于标识消息是否为最后一个——这两个标志位在GEM通信中具有重要语义。unpack_secs中,函数返回字典结构而非直接输出,便于调用方根据Stream(S)和Function(F)编号进行路由处理。在HSMSConnection类中,recv_msg方法使用了循环接收直到凑够完整消息的逻辑,这是处理TCP粘包问题的标准做法,确保无论底层TCP如何分包,上层应用都能收到完整的SECS消息。

五、效果对比与分析

从上表可以看出,自研Python SECS-II解析器的综合效率远优于纯手工解析方案。虽然商业协议分析软件(如WATS、FAB300等)在解析成功率方面与自研方案接近,但其授权费用高昂(单套软件通常在百万级别),且不提供源码,出了问题只能依赖厂商支持,自研方案则拥有完全的掌控权和灵活定制能力。

六、实施建议与调试指南

6.1 协议分析仪的合理使用

在调试SECS-GEM通信时,一台好的协议分析仪可以事半功倍。免费的Wireshark配合SECS-GEM插件可以解析HSMS流量,将二进制帧可视化为SECS-II树状结构,极大降低调试难度。对于生产级调试,推荐使用专业的SECS协议分析仪(如Softing或HI-GLORY的产品),它们支持消息断点、流量回放和自动化测试脚本。

协议分析仪的使用策略:在开发初期(连接握手阶段),使用抓包工具验证TCP连接建立、HSMS Select流程是否正常;在消息解析阶段,在代码中埋入日志点,记录每个发送/接收消息的十六进制内容和解析后的结构化结果;在压力测试阶段,通过协议分析仪的回放功能,模拟设备在异常状态(超时、错误应答、网络中断)下的行为。

6.2 常见错误码与故障排查

SECS-GEM定义了一套标准错误码,理解和处理这些错误码是调试工作的核心内容。S0F0是"T水平和NAK"错误,表示接收端检测到格式错误;S0F1是"Abort transaction"错误,表示对方主动放弃了本次事务;S0F2是"Abort connect"错误,通常在HSMS Select阶段设备拒绝连接请求。

在实际FAB环境中,最常见的连接失败原因有两个:一是设备侧的连接白名单限制(新接入的MES主机IP未在设备配置中登记),二是超时时间设置不合理(某些老设备处理速度慢,默认的30秒超时不够用)。此外,不同厂商设备对某些可选GEM功能的实现程度不一,代码中应优雅处理"设备不支持此功能"的情况,而非直接抛出异常中断整个会话。

6.3 多厂商兼容性策略

不同设备厂商对SECS-GEM标准的实现细节存在差异,这是实际项目中最棘手的问题。例如,某些日系设备在消息中使用非标准的自定义数据项(Format Code),某些欧系设备在S1F3/F4的基础上扩展了额外的设备特定参数,配方格式(Recipe格式)各家更是完全不同。

应对多厂商兼容性,推荐采用"核心+适配层"的分层架构:底层SECS-II解析器和HSMS管理器保持完全通用,向上封装统一的设备抽象接口(Device Adapter层),针对每个厂商编写独立的适配器(VendorAdapter)。当接入新厂商设备时,只需实现一个新的适配器,无需修改核心通信代码。这种架构在FAB自动化集成项目中已被广泛验证,是处理协议碎片化问题的最佳实践。

七、进阶方向与技术展望

7.1 GEM300扩展与300mm工厂自动化

GEM300是GEM标准针对300mm晶圆工厂的扩展规范,在标准GEM功能基础上增加了更多高级特性,包括:多腔室同步控制(Multi-Chamber Control,支持同时操控具有多个反应腔的设备)、配方编辑器接口(Remote Recipe Editing,允许MES在设备上直接编辑配方内容)、材料移动跟踪(Carrier Tracking,追踪载具在设备间的流转)等。

GEM300的实现复杂度远高于标准GEM,消息数量从几十条扩展到数百条,消息之间的时序依赖关系更加复杂。对于MES开发团队而言,GEM300项目的实施周期通常是标准GEM项目的2-3倍。如果FAB有300mm扩产计划,建议在项目初期就预留GEM300的技术储备。

7.2 OPC UA协议:新一代设备互连标准

OPC UA(Open Platform Communications Unified Architecture)是工业4.0背景下正在崛起的新一代设备通信标准。与SECS-GEM相比,OPC UA提供了更完善的信息模型(Information Model)、更灵活的传输层选择(不仅仅限于TCP-IP)、以及更强的安全性(内置加密、认证、授权机制)。SEMI组织已发布多份将OPC UA与半导体FAB场景结合的标准文档(E134、SECS/HIS集成等)。

尽管OPC UA在半导体行业的全面普及尚需时日,但趋势已经非常明确:越来越多的新设备开始同时支持SECS-GEM和OPC UA两种接口。对于软件团队,建议提前布局OPC UA的技术学习,关注OPC UA Companion Specification for Semiconductor(半导体行业配套规范)中的设备模型定义,为未来的协议升级做好技术储备。

7.3 设备数字孪生与智能运维

数字孪生(Digital Twin)是当前工业互联网领域的热点技术,它为每台物理设备在数字空间中构建一个实时同步的虚拟镜像。在FAB场景中,基于SECS-GEM实时采集的设备状态数据(PV值、腔室温度曲线、气体流量时序等),结合历史维护记录和工艺良率数据,可以构建每台设备的数字孪生模型。

数字孪生的核心应用场景包括:设备健康预测(基于实时数据的异常趋势分析,提前预警腔室老化或关键备件即将失效)、工艺优化建议(对比同型号设备的最优工艺窗口,自动推荐当前腔室的参数微调方向)、虚拟调试(在数字孪生环境中预演Recipe变更效果,无需实际干预生产设备)。SECS-GEM数据是构建数字孪生的重要数据来源,掌握好协议实现技术就等于拿到了进入设备智能运维领域的钥匙。

欢迎在评论区留下您的看法

您在SECS-GEM设备对接项目中遇到的最大挑战是什么,是否有独特的调试经验可以分享?

您认为OPC UA会在未来全面取代SECS-GEM成为FAB主流协议吗,原因是什么?

blog.csdn.net/yeflashzhihui

相关文章

良率工程实战:从72%到89%的完整爬坡路径

良率工程实战:从72%到89%的完整爬坡路径

良率工程实战:从72%到89%的完整爬坡路径 一、问题背景:良率是晶圆厂的生命线 良率(Yield)是晶圆厂最核心的KPI,直接决定了盈利能力和市场竞争力。我在晶圆厂负责良率工程的这些年,深刻体会到良...

SPC统计过程控制:FAB质量管理的定海神针

SPC统计过程控制:FAB质量管理的定海神针

SPC统计过程控制:FAB质量管理的定海神针 Statistical Process Control — 用数据说话,让异常无处遁形 一、问题背景:FAB里每天产生上百万个数据点,靠什么来管理质量?...

刻蚀工艺深度解析:干法刻蚀vs湿法刻蚀怎么选

刻蚀工艺深度解析:干法刻蚀vs湿法刻蚀怎么选

刻蚀工艺深度解析:干法刻蚀vs湿法刻蚀怎么选 大家好,我是老张。前面讲完了光刻,今天聊聊刻蚀(Etching)。如果说光刻是「画图」,那刻蚀就是「刻字」——把光刻转移到光刻胶上的图形,精确地转移到下面...

半导体产业全景:从沙子到芯片的完整产业链

半导体产业全景:从沙子到芯片的完整产业链

半导体产业全景:从沙子到芯片的完整产业链 大家好,我是老张,在半导体行业摸爬滚打了十五年。从Fab厂的一线工艺工程师,到现在的产业分析师,我有幸见证了这个行业最波澜壮阔的十年。今天,我想用最接地气的方...

晶圆制造全流程:硅片是怎么从沙子变出来的

晶圆制造全流程:硅片是怎么从沙子变出来的

晶圆制造全流程:硅片是怎么从沙子变出来的 大家好,我是老张。上篇讲了半导体产业全景,很多朋友私信说「想深入了解晶圆制造」。今天我就把这部分展开,从一捧沙子到一片光洁如镜的硅晶圆,每一步的参数、原理、设...

CMP化学机械抛光:让晶圆表面平整到原子级

CMP化学机械抛光:让晶圆表面平整到原子级

CMP化学机械抛光:让晶圆表面平整到原子级 Chemical Mechanical Planarization — 半导体制造中最精密的表面平坦化技术 一、问题背景:为什么芯片需要"磨皮&q...