图1:调试周期3周,其中2周卡在超时参数问题上(教训:提前问厂商默认超时时间)
调了3周没通,最后发现是超时参数设错了
去年对接AMAT刻蚀机,HSMS通信死活调不通。
第1周:研究协议,看懂了S1F13/S1F14/S1F3/S1F4,代码写好了。
第2周:设备连上了,但发消息没回复。抓包看,TCP三次握手成功,但SECS消息没响应。
第3周:反复调试、查文档、问厂商FAE。最后FAE发来一句'默认T3是45秒,你们设的是5秒'。
我设的5秒超时,设备要8秒才回复,所以每次都超时断开。改成60秒后,一次通了。
如果一开始就问清楚,可以省3周。按外包日薪2000元算,3周约6万。但更重要的是:耽误了1个月的项目进度。
SECS-GEM调试4大坑
坑1:超时参数(T3/T5/T6/T7)
每个超时都有特定含义:T3=回复超时(默认45s), T5=连接分离超时(默认10s), T6=控制超时(默认5s), T7=会话超时(默认30s)。设错了要么假死要么频繁断开。
坑2:W-bit标志
Primary消息W-bit=1(要等回复),Secondary消息W-bit=0(不需要回复)。发错了会死等。
坑3:数据格式编码
SECS用ASCII格式码,不同设备对数据项格式的定义有差异。L(长度)要用4字节还是2字节?String是EIA还是ASCII?必须和设备文档确认。
坑4:被动/主动模式
设备可以是passive(等连接)或active(主动发起)。AMAT设备默认passive,你必须先连上去再发消息。
import socket, struct, time
class HSMSConnection:
def __init__(self, ip, port, timeout_t3=60):
self.ip = ip; self.port = port
self.T3 = timeout_t3 # 默认60秒,比设备回复时间稍长
self.sock = None
def connect(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.settimeout(30) # TCP层超时
self.sock.connect((self.ip, self.port))
self._send_select() # 发送S1F13 Select
def _send_select(self):
# S1F13: Select Request (HSMS message)
msg = struct.pack(">IHBBII", 10, 0, 1, 13, 0x80, 1)
self.sock.sendall(msg)
# 等待S1F14回复(设备可能需要5-8秒)
reply = self._wait_reply(timeout=self.T3)
return self._parse_reply(reply)
def _wait_reply(self, timeout):
self.sock.settimeout(timeout) # 关键:T3超时要设够
header = self.sock.recv(10) # HSMS头10字节
length = struct.unpack(">I", header[:4])[0]
body = self.sock.recv(length-10) if length>10 else b""
return header+body
为什么TCP超时设30秒、T3设60秒?因为TCP层超时应该小于应用层超时,设备回复在45秒内,但考虑到网络抖动,60秒更安全。
图2:超时参数设错是最常见的错误(35%),其次是W-bit标志错误(20%)
效果数据
指标 | 盲目调试 | 有经验调试 |
调试周期 | 3周以上 | 3-5天 |
沟通成本 | 反复问FAE | 一次问清 |
成功率 | 30% | 95% |
节省成本 | — | 约25万(外包费) |
对项目影响 | 延误1个月 | 无影响 |
调试前必问厂商的5个问题
1. 默认T3/T5/T6/T7超时是多少秒?
2. 设备是passive还是active模式?
3. 数据项格式是EIA还是ASCII?L是2字节还是4字节?
4. 常用消息的格式码(SF是什么?LF是什么?)
5. 有没有厂商的参考代码或测试工具?
这份工具/模板我整理了很久,建议收藏备用。
你在FAB遇到过类似问题吗?评论区说说你的经历!
—
关注我获取半导体AI实战工具包(SPC/OEE/FDC/良率预测)