三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

不用手写 XML:我用这款工具 1 小时配完 GEM 模型

不用手写 XML:我用这款工具 1 小时配完 GEM 模型

做半导体设备自动化(EAP/SECS-GEM)开发的朋友,应该都有过这样的经历:

客户突然改需求——“再给我加 50 个 SVID,15 个 Alarm,Recipe 变量也要调整”。
你打开那个 3000 行的 XML 文件,开始手动改标签、调属性、对引用关系……改完编译报错,排了 2 小时发现是少了一个闭合标签。

这不是段子,是大多数设备商 EAP 团队的日常。

今天聊一款我最近深度使用的SECS/GEM 通信模型 XML 配置工具——它让"配一套完整的 GEM200 + GEM300 模型"这件事,从几天压缩到 1 小时


一、手写 XML 的痛苦,谁写谁知道

在讲工具之前,先说说我们之前"纯手写"的痛点。一份标准的 EAP 设备模型 XML,通常包含:

  • GEM200 基础层:HSMS 通信参数、SVID/ECID 变量、CEID 事件、ALID 报警、Remote Command、Terminal、Clock、Log
  • GEM300 高级层:E87 Carrier(载具管理)、E90 Substrate(基板追踪)、E40 ProcessJob(工艺作业)、E94 ControlJob(控制作业)
  • Equipment 设备层:Module(模块)、LoadPort(负载端口)、WaferMap(晶圆图谱)

一个中等复杂度的 300mm 设备,XML 轻松突破5000 行。手写意味着:

痛点后果
标签拼写错误(如</EibModel:Event>少个斜杠)运行时才报错,排查 2 小时
SVID/CEID/ALID 引用关系错乱Host 收到事件但数据是空的
属性值类型不匹配(该填 int 填了 string)设备启动直接崩溃
不同模块间 ID 冲突调试阶段才发现两个变量共用一个 VID
客户改需求要全局搜索替换改一处漏三处,回归测试全跑一遍

最要命的是:SEMI 标准文档有几千页,手写 XML 等于把标准文档再实现一遍


二、这款工具是什么?

简单说,它是SECS/GEM 通信模型的 XML 可视化建模器

核心思路:把 SEMI 标准的对象模型,用树状导航 + 表单界面来管理,最终导出合规的 XML 文件

你不需要记住 XML 标签怎么写,不需要查文档确认属性名拼写,只需要在表单里填值、下拉框里选枚举、点 Set 保存

界面全景

工具左侧是功能导航树,按 SEMI 标准分层组织:

GEM200 ├── Hsms(通信参数) ├── Variable(SVID/ECID 管理) ├── Event(CEID 管理) ├── Report(报告映射) ├── Alarm(ALID 管理) ├── Terminal(终端服务) ├── Clock(时钟同步) ├── Command(远程命令) └── Log(日志配置) GEM300 ├── E87 Carrier(载具管理) ├── E90 Substrate(基板追踪) ├── E94 ControlJob(控制作业) ├── E40 ProcessJob(工艺作业) └── Module Track(模块追踪) Equipment ├── Module(设备模块) ├── LoadPort(负载端口) └── WaferMap(晶圆图谱)

右侧是对应模块的表单配置区,每个参数都有下拉选择、输入校验、关联检查。


三、实战演示:1 小时配完一套 GEM 模型

下面以"配置一台 300mm 刻蚀设备的完整 GEM 接口"为例,展示工具的实战效率。

Step 1:GEM200 基础通信配置(10 分钟)

打开工具,选中GEM200 → Setting,右侧出现基础通信表单:

  • Local IP:填192.168.1.100(设备网卡 IP)
  • Local Port:填5000
  • Device ID:填1
  • Mode:下拉选Passive(300mm Fab 标配)
  • LinkTestInterval:填60000(60 秒心跳)
  • InitControlState:下拉选OnlineLocal
  • DefaultOnlineState:下拉选OnlineLocal
  • AttemptOnlineFail:下拉选HostOffline
  • T3~T8 超时:分别填45000 / 10000 / 50000 / 10000 / 5000

关键点:Mode、ControlState 这些值都是下拉枚举,不会出现"手滑填错字符串导致状态机不认"的问题。

Step 2:Variables(SVID/ECID)批量配置(15 分钟)

选中GEM200 → Variable,进入变量管理界面。

左侧表单填单个变量:

  • Module Name:下拉选InTool300mm
  • Name:填ChamberPressure
  • Parameter Type:下拉选FloatData
  • Classification:下拉选Data
  • Unit:填mTorr
  • VID:填10001
  • VID Type:下拉选SVID

Add保存。

右侧表格实时显示所有已配置的变量:

VidVID TypeAttributeNameAttributeTypeValue
20ECIDLotIDStringDatanull
50001SVIDPortIdentifierStringData1
10DVIDPressureFloatDatanull
11DVIDTemperatureFloatDatanull
160SVIDCarrierRecreateSupportedBooleantrue

效率提升点

  • 不用手写<EibModel:Variable>标签
  • Classification 下拉选Configuration / Control / Data,避免分类错误
  • 表格视图一目了然,哪个 VID 没填、哪个重复,秒发现

实操经验:一台刻蚀腔有 200+ 传感器通道。我建议全部暴露成 SVID,宁多勿少。后期客户要做 FDC(故障检测)时,缺数据才是真灾难。

Step 3:Events & Reports 事件报告配置(15 分钟)

选中GEM200 → Event,配置 Collection Event:

CEIDNameDescription
802PressureMeasurementMade压力测量完成
400001ProcessingStarted加工开始
400002ProcessingCompleted加工完成
400003ProcessingStopped加工停止
400004ProcessStateChange加工状态变更

然后选中GEM200 → Report,建立Event → Report → VIDS的映射链:

CEIDCEIDNameReportIDVIDS
816OperatorCommandIssued3210;11;12;
815MessageRecognition3112;
802PressureMeasurementMade3011;12;
801TestMeasurementMade2910;12;

这是 SECS/GEM 最容易出错的地方——Event 触发后,Host 收到的数据取决于 Report 里绑定的 VIDS 列表。手写 XML 时,VID 引用错了完全没提示;用工具,绑定关系在表格里可视化校验,一目了然。

Step 4:Alarms 报警配置(10 分钟)

选中GEM200 → Alarm,配置设备报警:

ALIDNameDescriptionSetCEIDClearCEID
55ExceptionCondition55异常条件 551000510006
100ExceptionCondition100异常条件 1001000110002
101ExceptionCondition101异常条件 1011010110102
99999UnknownException未知异常

每个报警绑定Set CEID(触发事件)和Clear CEID(清除事件),Host 就能精确区分"报警发生了"和"报警解除了"。

踩坑经验:之前手写 XML 时,ClearCEID 漏配过,结果 Host 端报警永远消不掉,Fab 验收直接打回。用工具表单配置,Set/Clear 两个字段并排展示,想漏都难。

Step 5:E87 Carrier 载具管理配置(5 分钟)

切换到GEM300 → E87 Carrier,配置载具状态机事件:

Carrier Service Events(载具状态转换事件):

IDNameStatemap
1301CarrierSMTrans01NoState → IDNotRead
1302CarrierSMTrans02IDNotRead → WaitingForHost
1303CarrierSMTrans03IDVerified → Clamped
1313CarrierSMTrans13Complete → NotAccessed

Carrier Service Location Events(载具位置事件):

IDName
1351CarrierLocationChange
1352CarrierClamped
1353CarrierClosed
1354CarrierOpened
1355CarrierUnclamped

关键参数配置

在 Equipment 节点下选中 LoadPort,配置:

  • clampControl = 1(全自动 Fab 必须,否则 AMHS 来了不松夹)
  • carrierHoldControl = 0
  • accessMode = AUTO

关于clampControl的坑,我之前单独写过一篇文章《E87 ClampControl 这个参数,90% 的设备商都没配对》,感兴趣可以翻我博客。

Step 6:导出 XML 并验证(5 分钟)

所有模块配置完成后,点击Export(导出),工具自动生成符合 SEMI 标准的 XML 文件:

D:\git\demo0000\gem300\代码\代码\AutomationServices\InTool300mmModel.xml

文件包含完整的:

  • <EibModel:E87LoadportSystem>节点(含 clampControl、carrierHoldControl 等属性)
  • <EibModel:Variable>列表
  • <EibModel:Event><EibModel:Report>映射
  • <EibModel:Alarm>定义
  • <EibModel:Command>及参数配置

导出后,用 EAP 运行时加载 XML,启动设备,Host 端 Simulator 连接测试,一次通过


四、效率对比:手写 vs 工具配置

任务手写 XML用这款工具效率提升
GEM200 基础配置4 小时10 分钟24x
50 个 SVID 录入3 小时15 分钟12x
20 个 Event + Report 映射4 小时15 分钟16x
15 个 Alarm 配置2 小时10 分钟12x
E87 状态机事件3 小时5 分钟36x
导出 + 验证1 小时5 分钟12x
总计17 小时(2+ 天)1 小时≈17x

这还只是"从零新建"的场景。如果是客户改需求、加变量、调参数的日常维护,工具的优势更大——改个值点 Set,不用翻 5000 行 XML 找位置。


五、工具的核心价值(不只是快)

1. 降低出错率

  • 下拉枚举防止非法值(如 Mode 只能选 Active/Passive)
  • 表单校验防止类型不匹配(该填 int 的不会让你填 string)
  • 引用关系可视化(Event → Report → VID 链路一目了然)

2. 降低门槛

  • 不需要熟读 3000 页 SEMI 标准文档才能上手
  • 工艺工程师也能参与模型配置,不依赖核心开发
  • 新人 1 天可上手,手写 XML 至少要 2 周培训

3. 配置与代码解耦

  • XML 模型是静态描述文件,供 EAP 运行时加载
  • 改配置不改代码,不用重新编译、不用重新认证
  • 同一套代码 + 不同 XML = 适配不同客户/不同设备型号

4. 版本可管理

  • XML 文件天然适合 Git 版本管理
  • 每次变更有 diff,可审计、可回滚
  • 多客户项目并行,配置互不干扰

六、适用场景

场景是否推荐理由
设备 OEM 出厂 GEM 接口配置✅ 强烈推荐不同客户配置不同,工具化是刚需
Fab 现场 EAP 集成调试✅ 推荐快速响应 Host 端变更需求
通信仿真与离线联调✅ 推荐配好 XML 直接跑 Simulator
老旧设备 SECS-I 改造⚠️ 视情况需确认工具是否支持 SECS-I
纯运行时监控❌ 不适用这是配置工具,不是监控软件

七、写在最后

半导体自动化的难点,从来不是"把消息发出去",而是让设备在 7×24 小时、网络抖动、操作员误触的真实环境里,依然稳得像块石头

而稳的第一步,是模型配置不出错

手写 5000 行 XML,出错是必然,不出错才是偶然。
用对工具,把精力花在真正重要的事上——业务逻辑、状态机、客户价值——而不是和 XML 语法较劲。

如果你也在做 SECS/GEM 或 GEM300 相关开发,欢迎在评论区聊聊你现在的配置方式,咱们一起把效率卷上去。


系列文章预告

  • 《做 SECS/GEM 这些年,我踩过的 7 个最致命的坑》
  • 《E87 ClampControl 这个参数,90% 的设备商都没配对》
  • 《E40 ProcessJob 与 E94 ControlJob:别再搞混了》

觉得有用请点赞 + 收藏,你的支持是我持续输出干货的动力 💪


—— 一个在半导体自动化领域摸爬滚打的 EAP 工程师

← 返回列表