GEM300 联调避坑指南:E87/E90/E40 到底该先实现哪个?

📅 2026/8/14 16:44:39
GEM300 联调避坑指南:E87/E90/E40 到底该先实现哪个?
GEM300 联调避坑指南E87/E90/E40 到底该先实现哪个摘要设备商一句“我们支持 GEM300”背后可能只是连通了 HSMS 的空壳。E87Carrier Management管 FOUP、E90Substrate Tracking管单片晶圆、E40Process Job管工艺执行、E94Control Job管调度编排——各自管什么、联调时先啃哪个、每个标准最少要做到什么程度才能过FAT直接决定你是两周过关还是三个月返工。本文给一套基于 300mm Fab 实战的落地优先级与最小可行实现MVI清单附带设备商糊弄手法识别指南。一、先搞清除GEM300 不是一个数是一家人GEM300 建立在 **SEMI E30GEM**通信基础之上核心扩展标准分如下标准全称管的事不归它管的事E87Carrier ManagementFOUP/Carrier 的 ID 校验、SlotMap、LoadPort 状态机、装卸交互单片晶圆在腔体间的移动E90Substrate Tracking每一片晶圆Substrate的位置、状态、历史轨迹FOUP 整体的装卸与 AMHS 握手E40Process Job ManagementProcess Job 生命周期Create/Start/Pause/Abort/Complete、绑 Recipe多 Job 的调度编排E94Control Job Management把多个 Process Job 串成一批任务Host 级调度单片晶圆级位置追踪E39Object Service上面所有对象Carrier/Substrate/Job的通用 CRUD 与属性查询通信底层E116Equipment PerformanceBusy/Idle/Blocked 等设备性能状态物料本身记住一句话E87 管 “盒子”E90 管 “片子”E40 管“怎么跑”E94 管“先跑哪批”。二、落地优先级先 E87再 E90最后 E40E94 看项目第一优先E87没有 Carrier 管理后面全是空中楼阁为什么先搞它AMHS 把 FOUP 放到 LoadPort 后Host 第一件事就是问CarrierID和SlotMap。E87 的 LoadPort 状态机是后续所有动作的门禁——状态不对Host不会下发任何指令。E87 标准要求 LoadPort 至少有10 个明确定义的状态包括NOT_ACCESSEDPort 未被访问READY_TO_LOAD准备好放盒CARRIER_PRESENTFOUP 在 Port 上未夹紧CLAMPEDFOUP 已夹紧IN_ACCESS正在开盖/取片CARRIER_COMPLETE所有晶圆已取出READY_TO_UNLOAD准备卸盒…等等CIVCarrier ID Verification失败、NoRead、IDVerificationFailed不处理PE 直接打回。因为 FOUP 放错槽位 整批晶圆报废。MVI最小可行实现清单检查项必须做到设备商常见糊弄状态模型覆盖NoState/NeedsProcessing/InProcess/ProcessingComplete/Rejected/Lost只有IDLE和RUNNING时间戳PLC硬件锁存E148对齐±10msdatetime.now()现取事件完整性每次移动都有 S6F11含 FromLoc/ToLoc只报关键节点中间过程省略异常必报Pick 失败→REJECTED掉片→LOSTAlarm失败也回COMPLETED历史查询S12F3/S12F4 能查完整 History和 PLC 逐条对齐查不到或数据不完整关键细节SubstrateID 的传递链E90 要求 SubstrateID 在整个流程过程中不可变。常见断链点FOUP 里 Slot 5 的晶圆取出后 Robot 给它分配了新 ID →错误经过 LoadLock 时 ID 丢失到 PM 后重新生成 →错误同一片晶圆在 Robot 两个 Arm 之间传递时 ID 混淆 →错误正确做法SubstrateID 从 SlotMap 读取后全程透传任何环节都不允许重新生成或修改。第三优先E40Process Job前期可以“瘦”一点为什么放后面很多单腔体或简单 track 设备初期 Host 用S2F41 Remote Command下 Recipe 也能跑。但一旦有多步工艺、Run-to-Run、Pause/Resume 需求E40 必须上。E40 是 GEM300 里状态机最复杂的标准没有之一。Process Job 有 15 个定义状态状态跳转条件涉及 Recipe 合法性、设备状态、Substrate 状态等多个维度。MVI 清单检查项必须做到设备商常见糊弄状态机Create→Queued→Setup→Active→Complete/Aborted完整只有Created和Done消息集S16F1~S16F5 基本消息通只实现了 S16F1Create对象绑定PJ 和 Carrier/Substrate 绑定完成时回挂到具体晶圆PJ 是孤立的不知道处理的是哪片Recipe 管理S7F1 选 Recipe不硬编码Recipe 名写死在代码里Pause/Resume能暂停并恢复不丢状态Pause 等于 StopResume 从头来Process Job 和 Substrate 的关系这是最容易混乱的地方。一张图说明Control Job (E94) └── Process Job 1 (E40) ── 绑定 ──→ Carrier A (E87) │ └── Substrate 1 (E90) → PM1 │ └── Substrate 2 (E90) → PM2 └── Process Job 2 (E40) ── 绑定 ──→ Carrier B (E87) └── Substrate 3 (E90) → PM1层级关系CJ 包含多个 PJPJ绑定CarrierCarrier包含SubstrateSubstrate的移动由E90追踪。可以延后E94/E39/E116标准什么时候必须前期怎么 MockE94Host 要做“一批 FOUP 连续排产”、多 Job 有依赖关系用单 PJ 模拟Host侧自己做调度E39需要动态查询/修改对象属性配合 E87/E90 用不用单独攻关E116需要设备利用率报表、OEE分析SAT阶段再补FAT不强制三、联调顺序FAT现场踩坑版阶段一地基第1-2天HSMS 通 E30基础S1F13/14 握手S2F49 常量枚举确认Alarm 表、Collection Event 列表、Data Variable 列表核对通信超时参数T3/T5/T6/T7确认状态模型确认Equipment State Model E30定义CONFIGURED→IDLE→PROCESSING→ALARM等确认当前状态确认状态跳转条件阶段二E87 单 Port 全流程第3-5天LoadPort 状态机走一遍手动放盒 → 夹紧 → CIV → 开盖 → 确认READY_TO_ACCESS手动卸盒 → 关盖 → 松开 → 确认NOT_ACCESSEDCIV 异常测试放一个 ID 不匹配的 FOUP → 确认设备报IDVerificationFailed放一个无 RFID 标签的 FOUP → 确认报NoReadSlotMap 验证用带实际晶圆的 FOUP→ 确认 SlotMap 和物理一致故意放一个交叉槽位的 FOUP → 确认设备能识别并报异常阶段三E90 单片流转第6-8天手动取片 → 查 HistoryRobot 从 FOUP 取一片 → 确认SubstrateLocationChange事件放入 PM → 确认状态变为IN_PROCESS工艺完成 → 确认状态变为PROCESSING_COMPLETE放回 FOUP → 确认 History 完整S12F4 查询验证Host 发 S12F3 查询该片晶圆的完整 History逐条核对时间戳、位置、事件类型阶段四E40 Process Job第9-12天PJ 全生命周期Host 创建 PJ→ 绑定 Recipe → Start过程中 Pause → Resume完成后查询 PJ 状态PJ 与 Substrate 绑定验证确认PJ完成时能回挂到具体晶圆确认History里能追溯到是哪个PJ处理的阶段五异常注入第13-15天制造各种异常看事件是否全报Robot 真空失败 →REJECTEDProcess 超时 →ABORTED双片同槽 →LOST Alarm网络断开 →Comm Fail状态正确阶段六E94如需要多 PJ 编排创建CJ→ 添加多个 PJ → 按顺序执行确认前一个 PJ 完成后才启动下一个四、设备商最爱偷懒的 10 个地方对照打叉#糊弄手法怎么识破1LoadPort 状态只有3个IDLE/BUSY/ERROR要求演示CARRIER_PRSENT→CLAMPED的跳转过程2CIV 永远返回 OK放一个假 FOUP看设备反应3SlotMap 永远返回 25 片满槽用空 FOUP 测试4E90 用datetime.now()打时间戳对比PLC日志看时间差5SubstrateID 在 Robot 传递时丢失查 History 里同一片晶圆的 ID 是否一致6Process Job 只有 Created 和 Done要求演示 Pause/Resume7Recipe 名硬编码尝试用 S7F1 换一个 Recipe 名8异常时沉默不报拔传感器线看有没有 S6F119状态机跳转不检查前置条件在 OFFLINE 状态下发 PROCESSING 指令10History 查不到或数据不完整S12F4 查询逐条和 PLC 对账以上中一条FAT签字别签。五、真实项目中的“糊弄链”血泪史案例 1LoadPort 状态机的“缩水版”某设备商的 E87 实现只有 4 个状态IDLE、LOADING、READY、UNLOADING。FAT 时我们要求演示CARRIER_PRESENT→CLAMPED的跳转他们花了 3 天改代码。原因是他们的软件架构根本没有状态机全靠if-else堆出来的。案例 2E90 的时间旅行某项目 SubstHistory 里出现了时间戳倒流第 5 条记录的时间是 10:05:12第 6 条是 10:05:08。查出来是设备重启后 NTP 还没同步代码就用回滚后的系统时间打了时间戳。我们要求他们在同步完成前禁止上报 E90 事件他们改了 2 周。案例 3Process Job 的假暂停某设备商演示 E40 Pause 时Robot 确实停了。但我们用 S1F3 查询设备状态发现状态还是PROCESSING没有跳到PAUSED。追问之下才知道他们的 Pause 只是停了电机状态机没跳转。Host 侧以为还在跑继续下发指令差点撞车。六、FAT 检查清单建议打印贴墙E87 检查项LoadPort 状态机完整≥10 个状态CIV 流程完整S3F17 通SlotMap 准确反映物理状态异常事件齐全NoRead、IDMismatch、CarrierLost 等所有状态跳转有 PLC 硬信号背书E90 检查项Substrate 状态模型覆盖所有定义状态时间戳硬件锁存E148 对齐每次移动都有 S6F11 事件SubstrateID 全程不可变S12F4 查询结果和 PLC 日志 100% 吻合异常必报REJECTED/LOST AlarmE40 检查项PJ 状态机完整≥10 个状态S16F1~S16F5 消息通PJ 和 Carrier/Substrate 绑定正确Pause/Resume 状态机正确跳转Recipe 通过 S7F1 选择不硬编码E94 检查项如适用CJ 能包含多个 PJPJ 按依赖顺序执行CJ 状态正确反映子 PJ 状态七、总结GEM300 联调最忌齐头并进——E87 没稳就测 E90轨迹全是假的E90 没稳就测 E40Job 绑定的晶圆都不对。正确节奏E87 打底 → E90 对账 → E40 收口 → E94 看需求补。别被设备商我们都支持 GEM300这句话带跑。你让他当场演示S3F17之后 LoadPort 状态怎么跳S12F4查一片晶圆的完整历史Process Job Pause 后设备状态是什么三关过了才算真支持。你在 GEM300 联调里被设备商哪一层坑得最惨E87 的 LoadPort 状态机E90 的时间戳还是 E40 的 Pause/Resume评论区聊聊你的血泪史。