简介:SECS/GEM作为从半导体行业走向智能制造的关键通信协议,如今已广泛应用于各类工业制造设备,用于统一设备与制造系统间的状态上报与控制。这份中文详解文档面向设备工程师、自动化集成人员与制造信息化从业者,系统梳理协议核心概念、常用术语与消息日志机制,并重点展开Streams and Functions指令体系的系统保留与自定义分类、详细指令含义及适用场景,有助于快速建立对协议的整体认知。压缩包内为1个PDF文件(约955KB),共十章内容,覆盖降低设备集成成本、网络带宽高效利用、数据密度小、无数据翻译、环路保证与安全机制等特性,从设计初衷到指令用法均有清晰说明,是一份便于入门与查阅的中文技术资料。该资源已有2265人学习/下载,适合初次接触SECS/GEM、需要为设备接入标准通信接口或理解设备间数据交互逻辑的工程技术人员参考。
1. SECS/GEM 是什么:从一条晶圆设备报警消息讲起
半夜两点,值班系统弹出一条报警,某台刻蚀机的主腔压力越限。你要是站在旁边看通信日志,会发现上位机只收到一条 40 来字节的二进制消息,然后主机软件立刻弹窗显示"ALARM: Chamber Pressure High, PV=xx Torr"。这套快速、低开销、不用翻来覆去翻译数据的机制,就是半导体行业里几乎绕不开的 SECS/GEM。
SECS/GEM 不是一个单点协议,而是一组标准的合称:消息标准、传输标准、设备行为标准各管一段。搞过设备集成的人都知道,现场最容易翻车的往往不是工艺,而是设备与上位机"聊不聊得起来"。这份中文详解把 E5/E30/E37 的目录、术语、Stream/Function、超时、格式码、通信状态、常用功能都过了一遍,适合正在做半导体、光伏、LED 类设备对接的工程师拿来当手册查,也适合刚接触 SECS/GEM 的新手按章节建立整体概念。下面我把这份资源拆开,讲清楚它到底怎么用、参数怎么设、坑在哪里。
2. 三层协议拆开看:E5 管消息、E30 管行为、E37 管传输
SECS/GEM 难上手,很大一部分原因是它不像普通 API 那样只有一个接口文档,而是层层叠叠好几套标准同时生效。看这份详细文档之前,建议先把三层关系立住,否则后面查指令、查格式码时会越看越乱。
2.1 SECS-II 消息层:Stream/Function 与 10 字节消息头
SECS-II(E5 标准)解决的是"消息长什么样"。它定义了一套通用消息结构,消息最前面是一个 10 字节的消息头,后面跟着正文。消息头里最关键的是 Stream(流)和 Function(功能)两个字段,组合成我们常说的 SxFy 指令形式——比如 S1F13、S6F11。Stream 表示消息大类,Function 表示大类里的具体动作,主机和设备就是靠这对编号辨认"这是谁发来的什么请求"。
正文部分由格式码(Format Code)引导,每条数据项前面都有一个字节说明数据类型,再跟一个字节说明数据长度。这种设计让 SECS 消息自描述性很强:收到消息的人不需要额外查一张字段映射表,就能从消息体里解析出完整结构。这也是后面讲数据密度小、无数据翻译这两个特性的底层原因。我刚接触时吃过亏,拿着报文对着文件慢慢数偏移量,后来把 10 字节头背下来,效率高了很多。
2.2 HSMS 传输层:TCP/IP 上的帧格式与连接控制
HSMS(E37 标准)解决的是"消息怎么送过去"。它定义在 TCP/IP 之上,用二进制帧承载 SECS-II 消息。每个 HSMS 帧分成帧头和数据两块:帧头里有消息长度、Stream、Function、WBit(是否需要回复)和系统字节(System Bytes);数据块就是 SECS-II 的消息体。
这一层最容易忽略的是连接控制消息。设备与主机建立 TCP 连接后,还得先完成一套 Select(选择)握手,连接才算真正可用。日常维持连接的还有 Linktest(链路测试)消息,主机或设备会周期性地发一条测试消息确认对方还活着。这样做的意义在于:TCP 连接本身只能告诉你端口还通不通,Linktest 才能告诉你协议栈活没活。
| HSMS 控制消息 | 方向 | 用途 |
|---|---|---|
| Select.req | 发起方→响应方 | 请求建立协议连接 |
| Select.rsp | 响应方→发起方 | 接受或拒绝连接请求 |
| Linktest.req | 任一方 | 链路活性探测 |
| Separate.req | 任一方 | 主动断开协议连接 |
具体默认参数后面第 4 章会细说,这里先记住一条:如果通信日志里反复出现"Linktest 超时",通常不是网络不通,而是 Select 握手没做完。
2.3 GEM 行为层:最低需求与可选功能的边界
E30(GEM)解决的是"设备必须具备什么行为"。它不定义新消息格式,而是规定了一组最低需求:状态模型、在线/离线控制、报警管理、事件上报、变量读取、远程命令等,这些是所有符合 GEM 的设备必须支持的。而配方管理、加工程序管理、原料运输、设备终端服务、假脱机(Spooling)这些列为附加功能,设备可以按自身情况选择实现还是不实现。
这个设计很务实。一个只有十几个 I/O 点的简单设备,和一套有几千个采集事件的复杂设备,可以用同一套技术,只是实现的功能子集不同。做集成时第一步先确认对方的 GEM 功能清单,哪些是必选、哪些是可选、哪些干脆没做,能避免很多"我发了 S7F5 对方根本没反应"的尴尬。
2.4 消息日志:排查通信问题的第一现场
这份详解第二章单独讲了消息日志,我建议把这个功能提到很高的优先级。消息日志不是可选项,它是排查 SECS/GEM 通信问题的黑匣子。成熟的调试工具会把每个方向的消息都打出来:时间戳、方向、Stream/Function、系统字节、消息体内容,有些还会标出解析后的格式码树。
现场排查时我的习惯是:先看日志里有没有 SxFy 号对得上,再看系统字节能不能配对,最后才翻具体数值。很多时候"设备没上报"根本不是设备没发,而是主机软件没订阅、或者链路中途被防火墙断了。日志能把这类问题从"玄学"变成"可定位"。拿到这份文档后,我建议先把第二章读透,再往后翻指令表。
3. Stream 与 Function 手册速查:高频指令、场景与订阅三连
第四章是这份资料里最值钱的部分之一。它把 Stream 的分类、系统保留区、具体指令含义和适用场景整理成了表。实际工程中不需要背全部指令,但常用的十几个必须形成条件反射。
3.1 系统保留区与自定义区:哪些指令能随便发
标准里 Stream 0 到 9 是系统保留区,由标准组织统一分配,设备厂商不能乱改含义;再往上的 Stream 留给行业自定义。实际项目中,S1 到 S9 覆盖了大多数通信场景,S10 之后的终端、其他扩展按需使用。做集成时要注意:不要自己发明 SxFy 号塞进保留区,容易和其他工具冲突。需要私有功能时,优先走厂商自定义 Stream,并在文档里明确标注。
3.2 高频指令拆解:从 S1F0 到 S6F11 的用途表
下面这张表是我在项目里高频用到的指令族,整理自资料第四章,也结合了实际调试经验。新手第一次做设备联调,先把这张表背下来,基本能应付八成场景。
| 指令 | 方向 | 用途 |
|---|---|---|
| S1F0 | 双向 | 中止当前事务 |
| S1F1 | 主机→设备 | 询问设备是否存在(Are You There) |
| S1F13 / S1F14 | 主机→设备 | 建立通信请求 / 回复,联调第一件事 |
| S2F17 / S2F18 | 主机→设备 | 请求设备时间 / 返回时间,时钟同步 |
| S2F33 / S2F34 | 主机→设备 | 定义报告 / 回复 |
| S2F35 / S2F36 | 主机→设备 | 定义报告链接 / 回复 |
| S2F37 / S2F38 | 主机→设备 | 设置收集事件 / 回复 |
| S2F41 / S2F42 | 主机→设备 | 远程命令请求 / 回复 |
| S5F1 | 设备→主机 | 报警上报 |
| S6F11 | 设备→主机 | 事件数据上报,采集的核心消息 |
| S7 系列 | 双向 | 加工程序、配方管理 |
| S9 系列 | 设备→主机 | 通信错误报告 |
注意 S1F13 是联调的第一个动作,主机发过去,设备回 S1F14,才代表通信建立成功。后面所有带 WBit 的主消息,都需要对方回复副消息,这个机制是 SECS/GEM 的基本模型——一次请求必然对应一次响应。
3.3 从订阅到上报:S2F33/S2F35/S2F37 的一次完整通信
事件上报不是设备默认就往外发数据的,必须先由主机订阅。订阅流程是三步走,缺一步都收不到数据:
第一步,用 S2F33 定义报告(Report),把要采集的变量 ID 组合成一个报告,设备回 S2F34 确认;第二步,用 S2F35 把报告链接到某个收集事件(Collection Event),设备回 S2F36;第三步,用 S2F37 使能这个收集事件,设备回 S2F38。之后设备侧一旦触发对应事件,才会主动发 S6F11 把报告里的数据推给主机。
参数说明:S2F33 里要带上 Report ID 和变量 ID 列表;S2F37 里是收集事件 ID 列表及使能/禁用标志。常见做法是把报告 ID 和事件 ID 做一个映射表存在主机配置里,方便以后增删。我一般会用 1 到 65535 之间的编号,低段留给系统,高段给各工艺组分配,避免多人联调时互相覆盖。
3.4 时钟、远程命令与错误消息:容易被忽略的标准动作
时钟同步看似简单,实际很坑。S2F17 请求、S2F18 返回,两边时间差超过设备允许范围时,有些设备会拒绝开始工艺。联调手册上往往只写了一行"时间需要同步",但没告诉你设完时间要重启通信会话才生效。远程命令走 S2F41/S2F42,命令名和设备具体实现强相关,必须在设备文档里确认命令 ID。错误消息走 S9 系列,收到 S9 系列消息时,通常说明上一条消息格式或内容有问题,看到 S9 第一反应不是修设备,而是查自己刚才发了什么。
4. 超时、格式码与控制状态:参数不敢乱设的四个细节
这一章对应资料里的第五、六、七章。这三章单独看都不厚,但联调中八成疑难杂症都从这里来。很多工程师对指令表背得滚瓜烂熟,一到超时参数和格式码就随意发挥,结果就是现场反复断线、解析错位。
4.1 T1~T7 超时:每个定时器在盯什么
HSMS 定义了一组超时定时器,每个定时器负责一段通信生命周期。把这组参数设对,通信稳定性立马不一样。常见默认值如下表:
| 超时 | 典型值 | 盯什么 |
|---|---|---|
| T1 | 10 秒 | TCP 连接建立等待 |
| T2 | 15 秒 | 消息字符间超时 |
| T3 | 45 秒 | 等待副消息回复 |
| T4 | 45 秒 | 连接建立后等待后续信号 |
| T5 | 5 秒 | 连接分离等待 |
| T6 | 5 秒 | 控制事务(Select 等)等待 |
| T7 | 10 秒 | 链路空闲,触发 Linktest 的间隔 |
现场最容易出问题的是 T3。有些设备处理 S6F11 上报时要访问数据库、要生成报告文件,响应时间波动很大,T3 设成 30 秒就可能频繁超时。我一般会保留标准默认值起步,联调顺利后再根据实际情况微调,不要一上来就为了"响应快"把 T3 压得很低。
4.2 格式码:从 L 到 F8 的编码规则与数据密度
格式码是 SECS-II 正文的骨架。每条数据项由一个格式码字节开头,常见的有:L(列表,嵌套结构的基础)、B(二进制)、A(ASCII 字符串)、U1/U2/U4(无符号 1/2/4 字节整数)、I1/I2/I4(有符号整数)、F4/F8(浮点数)。解析时先看格式码,再看长度,最后按类型取数。
容易踩坑的地方是:同一个"4 字节数据",U4 和 I4 解析结果完全不同。设备如果有符号数用了 U4 格式码,负数值传过来会被解析成一个很大的正数,光看报文很难发现。资料第六章的格式码说明表建议完整看一遍,遇到解析结果和预期不符时,先回去查格式码和长度字节,别急着怀疑设备数据本身。
另外要理解"数据密度小"这个优势:SECS 消息中一条 4 字节整数在网络上实际占用 6 字节(1 字节格式码 + 1 字节长度 + 4 字节数据),8 字节浮点占用 10 字节。对比 JSON/XML 每条数据还要带键名和分隔符,SECS 的开销确实小得多。当消息里有一百个浮点数时,SECS 的数据密度能到 78%,而 JSON/XML 相对就低很多了。这就是半导体工厂愿意在带宽并不富裕的产线上跑 SECS/GEM 的原因之一。
4.3 HSMS 连接状态与控制状态:在线与离线怎么界定
通信状态分两层:TCP 层的连接状态和 GEM 层的控制状态,很多新人把这两层混在一起,排查时就乱了。
HSMS 连接状态描述 TCP 连接和协议握手情况:未连接、连接中、已连接。已连接意味着 Select 握手完成,可以收发消息。控制状态描述的是设备逻辑上的工作模式:离线(Offline)模式下设备不接受远程命令,只能本地操作;在线(Online)模式下主机可以发送远程命令和控制设备。有些设备还有"在线但本地优先"的中间状态,这个必须看设备手册。
联调时经常遇到"TCP 通了但命令发不过去"的情况,这时要查的是控制状态是不是在离线。很多设备断电重启后默认回到离线,主机需要先发在线命令。这个顺序搞反了,后面所有远程操作都会失败,而且是那种看似仝通、死活不回应的失败。
4.4 数据密度对比:同样一条上报,三种格式差多少
资料里给了一张很直观的对比:一条带 2 个整数、2 个浮点数、事件 ID 和报告 ID 的典型事件报告,实际数据 32 字节。SECS 消息只多了 10 字节头部和极少的格式码长度开销,而同样内容的 JSON/XML 要带上键名、引号和结构分隔符,体积翻好几倍。当数据量扩大到 100 个浮点数时,SECS 的开销占比进一步下降,这个特性让它特别适合高频采集场景。设计上报频率和采集点位时,可以放心地让设备多发布一些数据,带宽不是瓶颈。
5. 避坑与常见问题:设备集成现场踩过的 5 个真实深坑
这一章专门写联调实战里反复出现的几类问题。每一条都是我在现场真刀真枪遇到过、并且看着别人也踩过的,按"现象→原因→解决"写清楚。
5.1 Active/Passive 配反,Linktest 永远超时
现象:TCP 端口能连通,但 Select 握手就是过不去,或者链路建立后 Linktest 一直超时,日志里全是重连记录。
原因:HSMS 通信双方有主动(Active)和被动(Passive)角色之分,主动方发连接请求,被动方监听等待。两边如果都配成了主动或都被动,连接根本建立不起来;就算连接建立了,Select 握手的发起方向不对也会导致协议状态混乱。
解决:先确认角色配置。常见做法是主机设为主动方主动连接设备,设备设为被动方监听端口;也可以反过来,但两边必须一主动一被动。改完角色要重启通信进程,因为 TCP 层状态不会自动重置。
5.2 T3 设得太紧,S9 系列通信错误刷屏
现象:日志里开始出现 S9 系列的通信错误消息,紧接着连接断开、重连,循环往复。
原因:T3 是等待副消息回复的超时。设成 10 秒、5 秒这种激进值后,设备处理稍慢一点,主机就判定事务超时,发通信错误消息。有些设备 CPU 负载一高,响应延迟轻松超过几秒。
解决:把 T3 恢复到 45 秒起步,观察设备在满载工况下的实际响应时间,再留出 2 到 3 倍余量。不要为了"快速发现断线"把 T3 压太低,代价是正常业务被误杀。
5.3 订阅了事件但不上报,漏了 S2F37
现象:S2F33 定义报告成功、S2F35 链接成功,设备侧也确实触发了事件,但上位机就是收不到 S6F11。
原因:只做了定义和链接,没做使能这一步。可能是漏调用了 S2F37,也可能调用了但传了 disable 标志,或者使能后设备没收到 S2F38 确认就重启了。
解决:检查三连调用是否完整,确认 S2F38 返回成功。设备重启后收集事件使能状态可能会丢失,需要在建立通信后重新下发一次配置。我一般会把订阅流程封装成一个函数,启动时自动执行,避免手工漏步骤。
5.4 系统字节撞车,请求和回应对不上
现象:测试工具和正式系统同时连着同一台设备,两边消息的系统字节范围重叠,导致主消息和副消息配对错乱。具体表现是:你发的 S2F17 时间请求,回过来的数据像是对面那个工具发的。
原因:SECS/GEM 靠系统字节唯一标识一个事务。多个客户端用同一套编码规则(比如都从 0 开始递增),设备端无法区分两个会话的同一编号。
解决:确保每台主机使用独立的系统字节范围或随机起始值,联调工具和生产系统不要共用一套编号。如果设备同时支持多条 TCP 连接,更要确认连接维度上的系统字节隔离机制。
5.5 格式码类型写错,负数和字符串全乱码
现象:设备上报的数据解析出来完全不对,负数变超大正数、字符串里出现乱码字符。
原因:格式码写错类型。最常见的是有符号整数用无符号格式码解析、短字符串长度没算对,或者是列表结构里少算了一个 L 格式码导致嵌套错位。
解决:打开消息日志,逐字节对照格式码表解析,先确认外层 L 结构完整,再确认每条数据的格式码和长度。遇到解析不一致时,不要靠猜,从报文的第一个字节开始重新捋一遍。血泪经验是:凡是"看起来对了但总差一点"的数据,八成是某个长度字节多了一或少了一。
6. 用三层自测清单验证接口:抓包 + 日志 + 模拟器
SECS/GEM 接口不像是普通 REST API,点个按钮就能看到返回。它的验证必须分层做,我总结了一个三层自测清单,每接到新设备都强制走一遍。
第一层,消息日志验证。在主机端打开完整日志,确认通信建立序列完整:TCP 连接成功、Select 握手完成、Linktest 正常;再确认订阅三连成功。这一层过了,说明基本通道没问题。
第二层,抓包验证。如果日志不够可信,直接抓 TCP 包看 HSMS 帧结构。一条典型命令就能验证:
tcpdump -i eth0 -s 0 -X port 5000-i eth0指定网卡,-s 0抓完整包,-X同时打印十六进制和 ASCII,port 5000按常用 HSMS 端口过滤。抓包后先看帧最前面的 4 字节消息长度,再往后数 10 字节消息头,核对 Stream、Function、系统字节,就能确认设备发出的报文和主机解析的是不是同一个东西。参数说明:端口号要按设备实际配置改,有些设备会监听 1024 之类的自定义端口;抓包机要接在镜像口或串联在链路上,否则只能看到单方向流量。
第三层,一致性验证。用一个支持 SECS/GEM 的模拟器或测试软件,先跑一遍标准场景:通信建立、时钟同步、读取变量、订阅事件、模拟报警、远程命令。设备文档里写的功能,一个个过一遍,每个功能都留日志存档。这样做的价值在于,把设备侧实现和文档描述的一致性在联调开始前就确认掉,而不是等产线跑起来再发现问题。
从那以后,我每接到一个设备对接任务,都强制自己先跑完这三层再往下谈业务,再也没在"通信起不来"这件事上熬夜。这套流程也建议你试试,希望帮到你。
本文还有配套的精品资源,点击获取