ARTICLE DETAIL

资讯详情

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

SECS/GEM 零基础对接笔记:从「这是啥」到「我能接」(全文干货版)

SECS/GEM 零基础对接笔记:从「这是啥」到「我能接」(全文干货版) 写给第一天被老板安排「把设备跟工厂系统对接」的你。 我假设你没听过 SECS、不知道 S1F2 是什么、不知道参数长什么样、不知道这些编号谁规定的。 没关系。这篇文章从拉网线讲起中间自己虚构一份完整的示例规格书带你逐页读读完你就能干活。第 0 章先搞清楚你在干嘛老板说的「对接」翻译成大白话工厂办公室里有一套电脑系统车间里有你的设备。老板要它俩通过网线聊天电脑能指挥设备开工、能随时问设备「你现在啥状态」设备出了事要主动喊报告。你要写的就是设备这一端的「聊天程序」。聊天的规矩是行业标准叫 SECS/GEM。全世界的半导体设备都这么聊所以工厂系统不用为每台设备单独开发一套——这就是你能「对接」而不是「定制开发」的原因。第 1 章名词扫盲一张表先背下来看任何 SECS 文档之前先把这些词认了不然规格书一个字都看不懂名词全称/含义人话SEMI国际半导体设备与材料协会定规矩的组织SECSSEMI Equipment Communications Standard「设备通信标准」聊天的语言GEMGeneric Equipment Model聊天的礼仪什么场合该说什么话HSMSHigh-Speed SECS Message Services语言走网线的寄送方式Host上位机、主机工厂那台电脑MES制造执行系统Host 上跑的软件管派工、批号、追溯EAP设备自动化程序Host 的另一种叫法规格书里常见EQPEquipment你的设备就是你这边规格书SECS/GEM Interface Specification工厂给你的「聊天内容清单」你的圣经再记四个标准编号文档里会反复出现标准名字管什么SEMI E4SECS-I走串口的传输老设备了解即可SEMI E5SECS-II每句话的格式S1F1、S2F41 都定义在这SEMI E30GEM设备行为在线/离线、事件、报警怎么玩SEMI E37HSMS走网线的传输IP、端口、握手、超时一句话总结E5 管「说什么」E37 管「怎么寄」E30 管「什么场合说什么」。 三层叠起来就是日常说的「SECS/GEM 对接」。第 2 章S1F2 到底是什么最多人卡住的地方2.1 编号拆开读S1F2读作「Stream 1Function 2」。Stream流 科室。就像医院分内科、外科、化验科SECS 把「设备通信」这件大事按事情种类分成十几个科室。Function功能 科室里第几张单子。化验科有「验血申请单」「验尿申请单」S1 科室里有「1 号单」「2 号单」。常用科室一览先混眼熟后面逐章细讲Stream科室管什么S1设备状态科在不在线、建立通信、查变量S2设备控制科远程命令、对时、定义报表S5报警科报警上报、报警开关S6数据收集科事件上报开批、结批S7配方科工艺配方的上传下载S9纠错科收到不认识的单子怎么处理S10终端科Host 在设备屏幕上弹文字S14对象服务科按条码查某个物料的信息2.2 最重要的规律奇数问偶数答Function 编号有个铁律奇数 提问/请求偶数 回答/回执。而且编号配对F1 问、F2 答F41 问、F42 答。看几个例子就懂了谁发报文意思Host → 设备S1F1「你在吗」设备 → HostS1F2「在我是 XX 机型软件版本 XX」Host → 设备S2F41「执行命令开批」设备 → HostS2F42「收到已执行 / 拒绝原因是……」设备 → HostS6F11「报告批次开始了」Host → 设备S6F12「知道了」设备 → HostS5F1「报告1001 号报警发生了」Host → 设备S5F2「知道了」所以「S1 代表某个功能吗」——不准确。S1 是一个科室S1F1、S1F2 才是具体的单子。 一次完整对话永远是两张单子奇数问偶数答。「SECS 相当于函数」——这个直觉是对的补全一下就精确了一张奇数单 ≈ 函数调用带着参数配对的偶数单 ≈ 函数返回值。 你代码里那个叫S1F2的类不是协议本身只是「负责拼这张回单」的代码。第 3 章参数在哪返回值长什么样3.1 报文 信封 正文每张单子报文分两部分头部Header信封。写着这是 S 几 F 几、发往几号设备Device ID、快递单号SystemBytes用来把「问」和「答」配成对。正文Body参数就装在这里。返回值也在对方回单的正文里。3.2 正文是一种「嵌套清单」按 JSON 理解就行正文的材料只有几种文档里用尖括号加类型表示记号类型人话例子L[n]List清单里面还能再装清单L[2]装 2 项A[n]ASCII字符串n 是长度A[8] PPSELECTU1/U2/U4无符号整数数字U4 5001I1/I2/I4有符号整数可为负的数字F4/F8浮点小数F8 98.5B[n]字节状态码B 0TF布尔真/假第一个例子S1F2。Host 发 S1F1正文是空的——就问一句「在吗」不用带参数。设备回 S1F2标准定义的正文S1F2 L[2] A DEMO-3000 ← 第 1 项MDLN设备型号 A 1.2.0 ← 第 2 项SOFTREV软件版本 翻译S1F2 的正文是一个装 2 项的清单第 1 项型号、第 2 项版本。这就是「你在吗」的返回值。第二个例子S1F3 查变量。Host 发 S1F3正文是「要查的变量编号」清单S1F3 W ← W 表示「我需要你回复」 L[2] U4 103 ← 我要查批号 U4 108 ← 我要查 UPH 设备回 S1F4按同样顺序给值S1F4 L[2] A LOT20260826 ← 103 的值 U4 3200 ← 108 的值 像不像查询(103, 108)返回[LOT20260826, 3200]参数在问单正文返回值在答单正文顺序一一对应。这就是全部秘密。3.3 最难的一张单S2F41 远程命令Host 让设备「选配方开批」发 S2F41下面这份是我虚构的示例第 5 章会完整定义S2F41 W L[2] A[8] PPSELECT ← 第 1 项命令名 L[3] ← 第 2 项参数清单3 个参数 L[2] A[11] ProductName ← 参数名 A[13] DEMO-PRODUCT-01 ← 参数值 L[2] A[7] LULMODE A[4] LOAD ← 上料模式 L[2] A[5] LotID A[12] LOT20260826 ← 批号 结构就是「命令名 一堆参数名 参数值对」一层套一层。设备解析完回 S2F42S2F42 L[2] B 0 ← HCACK0 已执行 L[0] ← 参数错误清单空 没错 那个B 0就是这次「函数调用」的返回值叫 HCACK标准定义HCACK意思0已执行1没这个命令2现在做不了3至少一个参数不合法4收下了做完用事件通知你5已经是这个状态了拒绝重复做6对象不存在设备代码里解析这棵树就是一层层按下标取第 0 项当命令名第 1 项里逐个遍历「参数名-参数值」对CString sRcmd msg.m_Body.m_SecsBobyVec.at(0).m_sData.bstrVal; // PPSELECT // 再遍历 at(1) 里的每个 L[2]比对 ProductName / LULMODE / LotID看着繁琐本质就是在遍历上面那棵清单树。第 4 章谁定义的——标准定骨架工厂填血肉新人最大的困惑这些编号、参数名、事件号到底谁定的答案一半 SEMI 定死一半工厂自定。SEMI 定死的全世界一样没得商量配对关系S1F1 必须回 S1F2S2F41 必须回 S2F42每张单的骨架S2F42 第一项必须是 HCACKS6F11 必须是 DATAID CEID 报表清单传输规则怎么连线、怎么握手、超时怎么处理GEM 行为模型Offline/Local/Remote 三态、事件要上报、报警要能开关工厂自定的写在规格书里一家一份内容谁定例子支持哪些远程命令、参数名叫什么工厂PPSELECT 带 ProductName / LULMODE / LotID事件号CEID多少、叫什么工厂5001批次开始、5002批次结束变量号SVID多少对应什么工厂103批号、108UPH报警 ID 表工厂1001气压低、1002真空不足批号、产品名格式工厂产品名必须能对应到本地配方文件所以开工第一件事找工厂要《SECS/GEM 规格书》。 没有它你写的每个编号都是瞎猜。规格书长什么样下一章我自己虚构一份完整的带你读。学会了读法拿到任何工厂的真实规格书你都看得懂。第 5 章示例规格书逐页精读本文核心假设我们做的是一台虚构的 「DEMO-3000 IC 测试分选机」工厂给了我们一份规格书。一份典型规格书通常有这些页连接参数 / SVID / ECID / CEID / RPTID / RCMD / ALARMID / 各 Stream 支持清单。5.1 连接参数页先把线接通参数示例值说明设备 IP / 端口192.168.1.10 : 5000HSMS 常用 5000连接模式Passive设备监听Host 来连大多数设备是这种Device ID0报文头里的设备号双方必须一致T345 秒发出后等回复的超时T510 秒断线重连间隔T710 秒Select 握手超时这一页决定「能不能连上」后面所有页决定「连上之后说什么」。5.2 SVID 页设备有哪些「可被查询的变量」SVID Status Variable ID状态变量编号。Host 用 S1F3 凭编号来查设备用 S1F4 回值。我们虚构的 SVID 表SVID名称含义 / 取值类型101ControlState控制状态0Offline 1Local 2RemoteU4102MachineState机台状态1HALT 2RUNNING 3PAUSE 4HOMEU4103LotID当前批号如 LOT20260826ASCII104OperatorID操作员工号ASCII105CurrentPPID当前配方名ASCII106ProcessedCount本批已处理数量U4107YieldRate本批良率%F8108UPH每小时产能U4三个要点① 「103 是批号」不是标准规定的是这张表规定的。 换一家工厂批号可能就是 2003。你的代码照表绑定。② 类型要和值匹配。 批号是字符串就用 ASCII数量是整数就用 U4良率带小数就用 F8。类型写错对端解析直接报错。③ 设备端的做法是「绑定内存地址」。 启动时把变量和编号绑一次AddSVID(m_LotID, CStringPointer, 103, LotID, SecsFormat::ASCII); AddSVID(m_ProcessedCount, intPointer, 106, ProcessedCount, SecsFormat::U4); AddSVID(m_UPH, intPointer, 108, UPH, SecsFormat::U4);绑完之后Host 发 S1F3 查 103协议层自动从那个内存地址读当前值回 S1F4——你什么都不用做这就是「绑定」的威力Host 看到的永远是变量的实时值。5.3 ECID 页设备的「配置参数」ECID Equipment Constant ID设备常量。和 SVID 的区别是新人必问SVIDECID是什么运行中实时变化的值配置项不常变例子批号、UPH、已测数量机型、软件版本、超时时间Host 怎么读S1F3 查S2F13 查Host 能改吗不能只读有的能S2F15 改权限在表里标我们虚构的 ECID 表ECID名称含义权限201MDLN设备型号 DEMO-3000只读202SOFTREV软件版本 1.2.0只读203MaxSpeed最大运行速度读写注意 201/202 这两个还记得 S1F2 回的「型号 版本」吗很多工厂会把它们同时登记成 ECIDHost 既能用 S1F1 探活时顺带拿到也能用 S2F13 单独查。5.4 CEID 页设备会「主动上报哪些事」CEID Collection Event ID事件编号。设备发生某件事就用 S6F11 把这个号报给 Host。我们虚构的 CEID 表CEID事件名触发时机5001LotStart开批成功5002LotEnd本批做完5003ProcessStart设备开始运行5004ProcessEnd设备停止运行5005Pause暂停生效5006Resume从暂停恢复5007ControlStateOffline控制状态切到 Offline5008ControlStateLocal切到 Local5009ControlStateRemote切到 Remote5010HomeFinish归零完成设备代码里对应一张一模一样的表业务发生时调上报接口enum class SECS_EVENT { LotStart 5001, LotEnd 5002, /* ... */ }; // 开批真正成功的那个时刻 UpdateEvent((int)SECS_EVENT::LotStart, info); // 落到协议上就是发 S6F11注意「真正成功」四个字——先做成再上报。开批函数一进来就报 LotStart后面加载配方失败了Host 以为开批了、设备其实没开两边状态就再也对不上了。5.5 RPTID 页最难懂的一页必须拿下RPTID Report ID报表编号。这是新手最容易懵的概念用外卖打比方事件CEID是「外卖到了」这条通知。 报表RPTID是通知里附带的小票——小票上写哪些内容SVID提前约定好。为什么需要小票Host 收到「批次开始」光知道「开始了」没用它还想顺带知道哪个批用的什么配方 与其让 Host 再发 S1F3 问一遍不如事件里直接带上。我们虚构的 RPTID 表RPTID打包的 SVID人话101{101, 102, 105}控制状态 机台状态 当前配方102{103, 105}批号 配方103{106, 107, 108}已测数量 良率 UPHRPTID 就是「一篮子 SVID」。 至于「哪个事件带哪几篮子」由 Host 在运行时动态配置——这就是下一章的 S2F33/S2F35/S2F37GEM 的灵魂单独开一章讲。5.6 RCMD 页Host 能指挥设备干什么RCMD Remote Command远程命令全走 S2F41 → S2F42。我们虚构 4 条命令作用参数PPSELECT选配方、开批ProductName、LotIDSTART开始运行无或形式参数STOP暂停无HOME归零无以 PPSELECT 为例规格书会给出完整报文样例就是第 3.3 节那棵树的「官方版本」并写清每个参数的校验规则ProductName 必须在本地配方列表里、LotID 不能为空……设备端收到后的标准动作四步解析 → 门禁检查 → 调设备原有功能 → 回 S2F42。「门禁检查」是重头戏以 START 为例没开批拒绝已经在跑拒绝HCACK5已是目标状态正在归零拒绝HCACK2现在做不了当前是 Offline/Local拒绝GEM 规定不在 Remote 不许远程操作都通过 → 调设备原来的启动逻辑关键设计原则SECS 层只做翻译和门禁不写业务。 远程 START 和面板上的启动按钮最终调的是同一个启动函数。协议层只是一个新入口和按钮平级。在 S2F41 的处理函数里直接搬气缸、走手臂后面维护会哭。5.7 ALARMID 页报警清单一长表每行一个报警ID 文本。我们虚构几条ALID报警文本1001气压不足1002真空吸附失败1003安全门被打开2001料盘卡住设备报警时发 S5F1S5F1 W L[3] B 1 ← ALCD1发生(set)0消除(clear) U4 1002 ← ALID报警编号查 ALARMID 表 A 真空吸附失败 ← ALTX报警文本 三个要点① 发生报一次消除还要报一次。 ALCD1 是「报警了」ALCD0 是「好了」。Host 界面上那条报警的红字靠 ALCD0 才会消掉。② Host 能关掉某条报警的上报S5F3。 设备要维护一张使能表被关掉的 ID 就别再发了。③ 上报失败本身要处理。 发 S5F1 失败说明 Host 不知道设备出事了——这本身就该在设备本地留个记录不然现场查问题两头都懵。5.8 各 Stream 支持清单你的工作量列表规格书最后会把 SEMI 标准的单子列出来逐张标「支持 / 不支持」。我们虚构的支持清单Stream支持的单子用途S1S1F1/F2、S1F3/F4、S1F13/F14、S1F15/F16、S1F17/F18探活、查变量、建立通信、上/下线S2S2F31/F32、S2F33~F38、S2F41/F42对时、报表三件套、远程命令S5S5F1/F2、S5F3/F4报警上报、报警开关S6S6F11/F12事件上报S7S7F1~F6、S7F19/F20配方传输、配方列表S10S10F3/F4Host 在设备屏弹字读法标了「支持」的每一张单就是你要实现或确认协议库已实现的工作。 拿到新规格书先把这页扫一遍工作量心里就有数了。第 6 章GEM 的灵魂——报表链S2F33 → S2F35 → S2F37 → S6F11这是全文最难、也最值得学会的一节。Host 不是被动等设备报事件而是先配置「事件怎么报」再收事件。配置分三步第 1 步S2F33 Define Report定义报表——Host 告诉设备「RPTID 102 {103, 105}」S2F33 W L[2] U4 0 ← DATAID L[1] L[2] U4 102 ← RPTID L[2] U4 103 U4 105 ← 包含的 SVID批号 配方 设备回 S2F34 确认。第 2 步S2F35 Link Event Report把报表挂到事件上——Host 告诉设备「CEID 5001 触发时带上 RPTID 102」S2F35 W L[2] U4 0 L[1] L[2] U4 5001 ← CEID批次开始 L[1] U4 102 ← 关联的 RPTID 设备回 S2F36 确认。第 3 步S2F37 Enable/Disable Event Report打开开关——Host 告诉设备「5001 这个事件允许上报」S2F37 W L[2] B 1 ← 1使能0禁止 L[1] U4 5001 ← CEID 清单 设备回 S2F38 确认。配好之后设备开批成功发 S6F11——正文自动带上小票S6F11 W L[3] U4 0 ← DATAID U4 5001 ← CEID批次开始 L[1] L[2] U4 102 ← RPTID 102 L[2] A LOT20260826 ← 103 批号的当前值 A DEMO-PRODUCT-01 ← 105 配方的当前值 Host 回 S6F12「知道了」。这条链一次记住S2F33 定义小票 → S2F35 把小票挂在事件上 → S2F37 打开开关 → S6F11 事件带着小票飞过去。 设备端只要 SVID 绑定做得好小票里的值全是自动填的。第 7 章一次完整开批报文时间线把前面所有知识串成一条线。Host 要让 DEMO-3000 做一批上料1. 网线插上TCP 连通 2. HSMS Select 握手 ← 快递通道建立这还不是 SECS 3. S1F13 → S1F14 ← 「建立通信吧」「同意」 4. S1F1 → S1F2 ← 「在吗」「在DEMO-3000版本 1.2.0」 5. S2F33 → S2F34 ← Host 定义报表小票内容 6. S2F35 → S2F36 ← Host 把报表挂到事件上 7. S2F37 → S2F38 ← Host 使能事件 8. S1F17 → S1F18 ← Host 要求上线设备同意 9. 设备切 Remote ← 设备主动报 S6F11(CEID5009) 10. S2F41(PPSELECT) → S2F42(0) ← Host 远程开批设备回「已执行」 11. 设备报 S6F11(CEID5001) ← 「批次开始」小票带批号和配方 12. 归零完成报 S6F11(5010) 13. S2F41(START) → S2F42(0) ← Host 启动 14. 设备报 S6F11(5003) ← ProcessStart 15. 跑着跑着真空报警 → S5F1(ALCD1, ALID1002) 处理完报警消除 → S5F1(ALCD0, ALID1002) 16. Host 随时 S1F3 查 {103, 108} → 设备 S1F4 回批号和 UPH 17. 本批做完设备报 S6F11(5002) ← LotEnd注意第 9 步状态变化也是事件设备要主动报不是等 Host 问。 这就是 GEM 和「一问一答」最大的区别——设备是个会主动说话的下属。第 8 章代码里怎么用最短路径好消息TCP、HSMS 握手、拆包组包、超时重发、S1F1/S1F13 这种标准单的自动应答协议库都帮你干了。你要写的只有三件事① 启动时绑定变量和事件照规格书 SVID/CEID 页抄AddSVID(m_LotID, CStringPointer, 103, LotID, SecsFormat::ASCII); AddSVID(m_UPH, intPointer, 108, UPH, SecsFormat::U4); AddCEID(5001, 批次开始事件); AddCEID(5002, 批次结束事件);② 实现远程命令的业务函数照 RCMD 页byte RCMD_PPSELECT(product, lotID) { // 1. 门禁已开批在跑Offline→ 返回对应 HCACK 拒绝 // 2. 调设备原有功能加载配方、写批号、切模式 // 3. 成功后 → 上报 LotStart 事件 // 4. 返回 HCACK 0 }③ 在业务节点上报事件和报警照 CEID/ALARMID 页UpdateEvent((int)SECS_EVENT::LotStart, info); // 事件 → S6F11 SendAlarm(alarmID, text, /*set*/true); // 报警 → S5F1两个工程细节都是血泪上报失败本身要报警。UpdateEvent返回 false说明 Host 没收到必须让现场知道不然批就乱了。不要在界面线程里等 Host 回复。 主动向 Host 要数据比如 S14 查物料信息可能卡几秒放工作线程里等。第 9 章联调方法与新手必踩的坑怎么测先用模拟器。 装一个 SECS 模拟 Host 的工具在自己电脑上IP 指本机先把 S1F1、开批、事件整条链路跑通再去现场。逐条对规格书。 每实现一张单用模拟器发一遍核对正文结构。留通信日志。 每条收发报文落盘带时间戳。现场出事先翻日志对报文不要猜。做断线测试。 拔网线、杀 Host 进程看设备会不会乱该拒的命令要拒重连后状态要对得上。九个坑checklist把 S1F2 当函数名满工程找。 它是报文编号代码里的S1F2类只是拼这张回单的。以为编号全世界通用。 S1F1 通用但 CEID 5001、SVID 103 是这份规格书定的换厂先换表。只发不收。 你发 S6F11Host 要回 S6F12。回复超时T3就是失败要记日志、要报警。网通了就以为对接好了。 Ping 通 ≠ Select 成功 ≠ S1F13 建立 ≠ Remote。四层一层层查。正文少包一层 List。 联调第一大错。对着规格书的L[2] ...一层层数。在协议层写业务。 S2F41 处理函数里直接走手臂维护时会哭。协议层只翻译、只门禁、只调旧接口。内部错误码直接回给 Host。 内部用 10、11 区分原因没问题S2F42 的 HCACK 必须落在标准 0~6。忘了 Offline/Local/Remote。 不在 Remote远程命令必须拒。现场「Host 发了没反应」一半是这个原因。事件提前报。 先做成再上报。顺序反了两边状态永远对不上。收尾一页纸记住全部SECS SEMI 定的设备聊天语言HSMS 走网线GEM 聊天礼仪。E5 管说什么E37 管怎么寄E30 管什么场合说。S1F2 S1 科室设备状态的第 2 号单是 S1F1「你在吗」的回单。奇数问偶数答。参数在问单正文Body里返回值在答单正文里正文是L/A/U4/B嵌套的清单树按 JSON 理解。谁定的单子骨架 SEMI 定死命令参数、SVID、CEID、RPTID、报警 ID工厂规格书定一家一份。规格书核心表SVID能查什么、ECID能配什么、CEID会报什么、RPTID事件带什么小票、RCMD能指挥什么、ALARMID报警清单。GEM 灵魂链S2F33 定义报表 → S2F35 挂到事件 → S2F37 使能 → S6F11 带小票上报。你的代码只做三件事绑定变量、实现 RCMD、在业务点打事件报警。协议只是翻译官设备本身的流程才是本体。把规格书放手边照着填你也能接。
返回列表