ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

半导体设备EAP系统开发实战:SECS-GEM协议从入门到Python完整实现

半导体设备EAP系统开发实战:SECS-GEM协议从入门到Python完整实现 如果你在Fab负责设备集成最先要搞懂的就是SECS-GEM。这个协议是半导体设备的普通话——不管是哪家的机台Applied、Lam、TEL、ASML只要接入Fab的自动化网络就必须讲SECS-GEM。搞懂了这个协议设备集成的工作就完成了一半。本文用一个完整的Python实现带你从协议原理走到真实代码。看完这篇你至少能自己写一个简单的SECS消息收发工具调试设备通信问题的时候不用再完全依赖厂商工程师。一、SECS-II协议基础SECS-II是半导体行业标准SEMI E5定义了主机Host通常是MES/EAP和设备Equipment之间的二进制消息格式。每条消息由两部分组成Header10字节和Body变长。Header里包含设备ID、消息ID、消息长度等元数据Body里是实际的业务数据。SECS-II的数据类型系统很有特色用单字符标识数据类型比如A是ASCII字符串B是1字节整数I2是2字节整数R4是4字节浮点数。List用方括号表示可以嵌套任意层级。这套格式设计得很紧凑适合低带宽的串口通信RS-232。二、Python实现消息解析器下面是一个精简的SECS消息编码/解码实现包含了核心的数据类型处理逻辑。理解了这段代码SECS-II的二进制格式就不神秘了。import structfrom typing import Any, List, Unionclass SecsMessage:def __init__(self, device_id, stream, function, system, dataNone, wbitFalse):self.device device_idself.s streamself.f functionself.system systemself.wbit wbit # wait bit, True need replyself.data data or []staticmethoddef encode(msg) - bytes:body _encode_data(msg.data)header struct.pack(HH, msg.device, msg.system)header bytes([msg.s, msg.f | (0x80 if msg.wbit else 0)])header struct.pack(I, len(body))[1:] # 3-byte lengthreturn header bodystaticmethoddef decode(raw: bytes):device, system struct.unpack(HH, raw[:4])s, f raw[4], raw[5]data, _ _decode_data(raw[10:])return SecsMessage(device, s, f 0x7F, system, data, wbitbool(f 0x80))def _encode_data(item) - bytes:if isinstance(item, str):encoded item.encode(ascii)return bytes([0xA0]) struct.pack(H, len(encoded)) encodedelif isinstance(item, int):return bytes([0xB1]) struct.pack(b, item) # I1elif isinstance(item, float):return bytes([0xD0]) struct.pack(f, item)elif isinstance(item, list):parts b.join(_encode_data(x) for x in item)count_bytes struct.pack(I, len(item))return bytes([0x01]) count_bytes[1:] partsreturn bdef _decode_data(bs) - tuple:if not bs: return None, bsfmt bs[0]if fmt 0xA0:length struct.unpack(H, bs[1:3])[0]return bs[3:3length].decode(ascii), bs[3length:]elif fmt 0xB1:return struct.unpack(b, bs[1:2])[0], bs[2:]elif fmt 0xD0:return struct.unpack(f, bs[1:5])[0], bs[5:]elif fmt 0x01: # Listcount struct.unpack(I, b\x00 bs[1:4])[0]items, rest [], bs[4:]for _ in range(count):it, rest _decode_data(rest)items.append(it)return items, restreturn None, bs三、GEM状态机实战GEM在SECS-II基础上定义了设备的状态机。最核心的两个概念Equipment State物理状态Running/Idle/Down/Paused和Communication State通信状态COMMUNICATING/LOCALLY CONTROLLED/ATTEMPTING OFFLINE。这两个状态必须始终同步Fab里的状态看板就是靠GEM上报的这些状态来驱动的。状态转换有严格规范设备开机后进入ATTEMPTING OFFLINE握手成功后进入COMMUNICATING收到S1F1Are You There后回复S1F2表示在线收到S2F37远程控制命令时执行START/STOP/PAUSE/RESUME。任何非规范的状态转换都会被MES报警。四、TCP通信客户端实现现代Fab的SECS通信几乎全部走TCP/IPHSMS协议不再用老旧的RS-232串口。下面的代码是一个完整的HSMS/TCP客户端实现支持连接管理、消息收发、等待回复超时控制import socketimport structimport timefrom_secs_msg SecsMessage.encodeclass SecsTCPClient:def __init__(self, host, port, device_id0):self.host hostself.port portself.device_id device_idself.sock Nonedef connect(self, timeout10):self.sock socket.create_connection((self.host, self.port), timeouttimeout)# HSMS Active Passive Select procedure# 发送S1F1 Are You Therereq SecsMessage(self.device_id, 1, 1, 0, wbitTrue)self.send(req)rep self.recv(timeout5)print(fDevice online: {rep is not None})return rep is not Nonedef send(self, msg: SecsMessage):data SecsMessage.encode(msg)self.sock.sendall(data)def recv(self, timeout5):self.sock.settimeout(timeout)header self.sock.recv(10) # 固定10字节headerif not header: return Nonelength struct.unpack(I, b\x00 header[6:9])[0]body bwhile len(body) length:body self.sock.recv(length - len(body))raw header bodyreturn SecsMessage.decode(raw)五、常见问题与排错思路问题一设备不响应S1F1最常见的问题是TCP连接建立了但设备不回复S1F2。先确认设备的IP和端口配置正确很多设备默认监听特定端口再确认设备的防火墙没有阻断入站连接。最笨但最有效的方法用Wireshark抓包看TCP三次握手是否成功看设备有没有发送任何数据。问题二消息格式错误SECS-II的二进制格式很容易出错特别是在处理List嵌套和长度字段的时候。强烈建议在调试阶段把每条发送的消息打印成十六进制同时在接收端也打印出来两边对比。特别注意List的长度字段是4字节但第一个字节固定为0实际有效长度只有3字节24位。问题三超时和重试网络超时是最难调试的一类问题。SECS-II的W-bitWait bit机制发送方在等待回复时设置W-bit如果超时未收到回复需要重发。但很多设备不允许消息重复发送幂等性重发会导致设备报警。正确做法是先确认设备是否支持消息重试再设置合理的超时时间一般建议3-5秒最后在重试前先查设备状态。EAP开发没有捷径只有多抓包、多看日志、多和设备工程师沟通。但一旦这条路走通了你会发现Fab里所有的设备集成问题在你面前都是透明的——这也是为什么EAP工程师在Fab里这么稀缺。获取更多实战案例和技术资料https://www.yezhihui.cn
返回列表