简介:面向半导体设备软件开发工程师的SECS/GEM SDK试用版,基于SECS-I与SECS-II通信协议及GEM设备模型构建,其中SECS-I负责控制与状态信息,SECS-II用于大数据量交换,最终实现设备与Fab主机间的高速数据交换、事件报告、命令响应等自动化交互。压缩包内共237个文件,约29.53MB,主要包含70个DLL动态库、33个头文件、27个CPP源码、38个C#文件,并辅以CSV、INI配置,以及示例工程、PDF文档、模拟器和测试工具等,覆盖协议封装、API调用、错误处理、上层应用集成等完整开发环节。已有158人学习下载。开发者可通过其中的SendSECSMessage、ReceiveSECSMessage、HandleGemEvent等API学习SECS消息的打包解包与GEM事件处理,配套示例代码和演示程序展示了如何将SECS/GEM功能集成到设备控制或生产管理系统中;同时,SDK支持C/C++、C#等多语言与Windows/Linux跨平台环境,并附带详细API文档、错误代码说明及性能分析工具,方便评估通讯效率与稳定性。试用版存在时间或功能限制,正好可在正式采购前验证其适用性。
1. 为什么说「试用」一份 SECS GEM SDK,比跑通 demo 更考验工程判断
拿到「SECS GEM SDK 2022.7.14 试用」这个标题时,多数人第一反应是下载、装环境、跑自带示例,然后写一份「跑通了」的结论。但这件事真正的难点在于:SECS/GEM 这套协议族在设备端和上位机(Host)之间的行为约束极严,demo 只覆盖了最理想的一条路径,评估要回答的是「设备侧消息乱序时 SDK 怎么表现、超时边界在哪、许可证裁掉了哪几个模块」。做的若是半导体设备端软件、MES 自动化集成或产线改造,试用期往往只有两到四周,这段时间内判断失误,后面换 SDK 的成本远高于采购成本。这篇文章就把我评估这类 SDK 的完整过程拆开讲:协议分层怎么看、最小联调怎么搭、参数怎么调、哪些坑值得提前绕开。
2. SECS/GEM 不是单个协议:SDK 里必须看懂的四个分层
很多人把 SECS/GEM 当成一个协议,实际它是 SEMI 标准族的总称。SDK 把这套标准包装成 API,但标准本身的分层关系决定了你在配置界面里看到的每一个选项。理解分层,才能知道连接失败时该查哪一层、消息格式报错时该改哪一个模块。
| 分层 | 对应标准 | 承担职责 | 常见载体 |
|---|---|---|---|
| 物理与链路层 | E37(HSMS)、E4(SECS-I) | 字节流传输、连接管理 | TCP/IP 或 RS-232 |
| 消息层 | E5(SECS-II) | Stream/Function 定义、数据项编码 | SML 消息 |
| 应用模型层 | E30(GEM) | 状态机、事件、报警、配方管理 | 设备行为规范 |
SDK 一般会按这三层组织模块:通信驱动、消息编解码、GEM 状态机引擎。试用时先打开安装目录的模块清单,确认这三块都在,再谈联调。
2.1 E37 HSMS 与 E4 SECS-I:先确认你的产线走以太网还是老串口
E37(HSMS)是当前主流,它定义了基于 TCP/IP 的双向通信,消息头里有 Session ID,一条 TCP 连接上可以逻辑复用多个会话。E4(SECS-I)是早期的串口方案,字节间有帧间隔要求,传输速率低,现在主要出现在改造项目。拿到的试用版 2022.7.14,大概率主推 HSMS 模块,但你要确认它是否还保留 SECS-I 驱动。这里有个常见做法:把 SDK 自带的设备能力文档打开,搜「SECS-I」或「RS-232」,如果支持,文档里会给串口参数结构体;如果只有 HSMS 的说明,那老设备接入就得自己写一个协议转换网关。我一般会在这个阶段直接问厂商销售要「支持协议矩阵」,比翻代码目录省时间。
HSMS 还有一个容易被忽略的细节:链路分 Active 和 Passive 两种角色,Active 侧负责发起 TCP 连接,Passive 侧监听端口。设备端实际是哪一侧,取决于产线里 Host 软件的角色分配。试用版默认配置通常写着 Active,但真实车间里设备可能是 Passive。这个角色配反的后果是:TCP 连接从未建立,日志里只有反复重试。评估时先把这个字段放在配置检查表的第一位。
2.2 E30 GEM 状态模型:SDK 里那张状态图就是设备行为契约
E30(GEM)定义了设备对外的标准行为,核心是一张状态机:POWER ON、NOT READY、READY、COMMUNICATING,以及可选的 PAUSED。设备只有机台就绪且进入 COMMUNICATING 状态后,才能处理生产相关的消息,比如 S1F3(请求设备信息)、S2F41(远程命令)。SDK 里的 GEM 模块会在收到消息时先校验当前状态,状态不合法直接拒绝。很多试用者在虚拟设备模式下遇到「发出了消息对方不回」,翻日志发现消息被 GEM 状态机挡掉了,就是这个原因。
这里要特别留意:GEM 的有些消息是「状态敏感」的,有些不是。比如 S1F13(Establish Communication Request)是握手消息,状态机允许在多个阶段响应;而 S2F41 这类远程命令,设备必须处于可执行命令的状态。SDK 文档里一般会给一张「消息 × 状态」的矩阵表,试用期第一周就应该把这张表截下来,联调时对照排查。
2.3 E5 SECS-II 与 SML:消息头的 W bit 就是同步与异步的开关
SECS-II 消息由 Stream 和 Function 组成,比如 S1F13,意思是 Stream 1 Function 13。消息头里有几个关键位:Device ID、Session ID、W bit、Message ID。W bit 是最容易踩坑的字段——它表示「这条消息是否必须得到应答」。W bit 为 1,对方必须在超时时间内回复;为 0,则是单向通知。SML 是一种可读的 SECS-II 消息描述格式,调试工具里常以它来展示消息内容。
SML 示意:
S1F13 W <List> <ASCⅡ MDLN> <ASCⅡ SOFTREV> </List>.这段表示:发送 S1F13,W bit 置位,携带设备型号和软件版本两个字符串字段,结尾用句点表示消息结束。配置时注意 ASCII 数据项在 SML 里的写法,有的实现写成 ASCⅡ,有的写成 A,解析器如果不兼容,消息会以 S9F3(Unrecognized Stream Type)之类错误被对方回绝。联调阶段建议先把 SDK 自带的日志工具打开,让它同时输出十六进制原始报文和 SML 解析结果,两边对照看。
3. 跑通试用版的最小联调:虚拟设备模式下的 HSMS 会话
试用版评估的目标不是跑官方示例,而是迅速建立一个「可控的对端环境」:设备侧用虚拟设备模拟器,Host 侧用 SDK,两边在同一台机器或两台局域网机器上对跑。这样你既能验证 SDK 的消息收发,又能通过制造异常来测试 SDK 的容错能力。
3.1 安装后的第一件事:核对许可证裁掉了哪几个模块
解压安装包之后不要急着写代码,先看许可证和模块清单。试用版常见做法是功能全开但限制连接数或运行天数,但也有部分 SDK 在试用版里把配方管理或报警模块做了裁剪。操作路径一般是:打开安装目录下的 license 文件或授权诊断工具,查看「Feature 列表」里每一项的状态。重点关注 GEM 核心、HSMS、SECS-II 编解码这三项,只要缺一个,最小联调就跑不通。
我习惯建立一个检查表,记录许可证里每个 Feature 的状态、试用截止日期、是否有连接数限制。曾遇到某次试用,License 显示有效,但报警事件接口在运行时返回 0x8007 错误码,翻文档才发现试用版把 E30 的 Event 模块裁了——这种问题看代码看不出来,必须验证运行时行为。另一件要做的事:把解压目录下的 samples 逐个编译,即使不运行,也要确认哪些例子能编译通过、哪些因缺模块被排除,这能侧面摸清许可范围。
3.2 用一份 HSMS 配置启动 SDK:参数先照抄再逐个改
最小联调的第一步是配置 HSMS 连接。假设你拿到的是 C++ 版 SDK,典型初始化代码如下,接口命名以你的实际 SDK 为准:
// 从配置文件读取 HSMS 参数,实际项目里建议用 JSON 或 XML 管理 HsmsConfig cfg; cfg.mode = HsmsMode::Active; // 主动连接 cfg.peerIp = "192.168.1.50"; // 虚拟设备的 IP cfg.peerPort = 5000; // 虚拟设备监听的端口 cfg.deviceId = 0; // 设备 ID,必须与虚拟设备侧一致 cfg.deviceIdMask = 0; // 掩码为 0 表示精确匹配 cfg.t3 = 45; // 事务回复超时,单位秒 cfg.t6 = 5; // 控制消息超时,单位秒 // 创建连接并启动 HsmsConnection conn(cfg); conn.Connect();这段代码做的事:以 Active 角色主动连上虚拟设备的 TCP 端口,设置好设备 ID 和超时参数,然后建立连接。参数里的deviceIdMask值得解释:有些产线里一台 Host 对应多台设备,用掩码来忽略设备 ID 的某些位,评估阶段建议设 0,不做模糊匹配,否则两个设备 ID 不同也能通信,出了问题难排查。启动之后观察日志里是否出现「Link Established」或等价的关键字,没有的话先检查 IP 和端口能不能 ping 通。
3.3 发送第一条 S1F13 消息:从 Host 到设备端的往返验证
连接建立后,发送握手消息 S1F13,这是设备通信的起点。虚拟设备会回应 S1F14 表示接受连接。这一步能同时验证消息编解码、W bit 处理、超时机制三条链路。
// 构造并发送 S1F13,W bit 置位表示需要对方应答 SecsMessage msg; msg.SetStream(1); msg.SetFunction(13); msg.SetWBit(true); // 必须应答,否则对方不回也无人告知 // 按 GEM 规范依次添加 MDLN 和 SOFTREV 两个字符串项 msg.AddItem(SecsItemType::ASCII, "VIRTUAL_MODEL"); msg.AddItem(SecsItemType::ASCII, "1.0"); // 发送并等待 S1F14 auto reply = conn.Send(msg, cfg.t3); if (reply.GetFunction() == 14) { // S1F14 到达,通信建立 log("handshake ok"); } else { log("unexpected reply: S%dF%d", reply.GetStream(), reply.GetFunction()); }这段逻辑有三个要点:一是 W bit 必须置位,否则虚拟设备会认为这是无需应答的通知,reply 变量拿不到结果;二是消息项的顺序不能乱,GEM 规定 S1F13 先是设备型号后是软件版本,反了设备侧会以 S9F4(Unrecognized Data ID)拒绝;三是超时参数用t3而不是写死,因为不同设备的 S1F13 响应时间差异很大,老设备可能需要 15 秒以上。如果这一步通过,说明 SDK 的 HSMS 通信、SECS-II 编解码、W bit 事务机制基本可用,可以进入下一步——参数边界测试。
4. 试用期必须调明白的参数:设备 ID、超时与连接角色的边界
正式集成时,参数错误引发的故障往往让人误判为 SDK 不稳定。试用阶段就应该把关键参数推到边界,摸清 SDK 的行为。以下参数的取值参考 SEMI E5/E30/E37 的常见建议值,具体默认值以你的 SDK 文档为准。
| 参数 | 常见默认值 | 作用域 | 评估时重点观察 |
|---|---|---|---|
| Device ID | 0 | 消息头地址 | 两侧不一致时消息是否被静默丢弃 |
| T3(Reply Timeout) | 45 秒 | 事务应答等待 | 设备慢应答时是否可调大且不丢事务 |
| T5(Connect Separation) | 48 秒 | 连接重试间隔 | 重连太频繁是否被 SDK 自身限制 |
| T6(Control Timeout) | 5 秒 | 控制消息应答 | 网络抖动时是否误报超时 |
| T7(Not Selected Timeout) | 10 秒 | 未选定时长 | Link Test 间隔与稳定性 |
| T8(Inter-Character Timeout) | 5 秒 | 数据包字符间隔 | 高延迟链路下是否频繁断链 |
4.1 设备 ID 与掩码:消息被静默丢弃的头号原因
设备 ID 是每条 SECS-II 消息头里的地址字段,范围 0 到 32767。Host 发给设备 A 的消息,设备 B 收到后如果发现设备 ID 不匹配,且掩码不做模糊匹配,这条消息就会被丢弃,而且不是所有设备都会回错误帧——很多设备选择「静默丢弃」,这对排错是灾难。试用阶段故意把 Host 侧设备 ID 改成 1、虚拟设备侧保持 0,然后发 S1F13,观察 SDK 是否能在日志中提示「设备 ID mismatch」。这一条就能判断 SDK 的日志诊断能力是否够格。
测试掩码时注意:掩码是按位运算的,不是简单的「忽略某一段」。比如 Mask = 0xFFF0 表示忽略设备 ID 的低 4 位。有的 SDK 文档把这部分藏在「Session Management」章节里,试用时如果发现改掩码不生效,先确认 SDK 版本是否支持掩码配置,有些试用版为了简化故意禁掉了这个字段。
4.2 T3/T5/T6/T7/T8:五个超时参数各管一段,不能照抄
T3 管事务层,从发出消息到收到应答的最大等待时间。设备处理慢的场景(比如配方上传)要把 T3 调大到 60 秒甚至 120 秒,但调太大会让单条消息失败的影响范围变大。T6 管控制层,专门针对 S1F13/S1F14 这类握手和控制消息,默认 5 秒在实际局域网里够用,但如果 Host 和设备不在同一网段、中间跨交换机,建议先从 10 秒开始测。T5 是两次连接尝试之间的最小间隔,默认 48 秒,意味着设备反复掉线重连时最快 48 秒才尝试一次,有的产线希望能更快恢复,会把 T5 调小——但要确认 SDK 是否真的遵守这个间隔,有的实现只是把参数存起来,内部重试逻辑根本没走它。
T7 管设备在 Not Selected 状态下的超时,T8 管数据包内两个字节之间的最大间隔。T8 在实际串口转以太网场景里最容易出问题:串口服务器把字节流分包,字节间间隔超过 T8,SDK 就认为消息不完整,直接丢弃。评估方式:用虚拟设备模拟器把一条 S1F13 消息分成两次发送,间隔分别设 3 秒和 6 秒(T8=5 秒),看 SDK 是否能把两次收到的半包拼成完整消息处理。
4.3 Active / Passive:连接角色选错,调试日志里全是重连
连接角色是 HSMS 配置里最直观也最易出错的一项。Active 角色主动发起 TCP 连接,Passive 角色监听端口等待连接。实际产线里,Host 软件和设备哪一侧做 Active,通常在项目早期就定了。试用阶段如果你用 SDK 做 Host,虚拟设备是 Passive,那 SDK 必须是 Active;反过来,如果你把 SDK 配成了设备模拟器,要让 Host 来连,SDK 就得是 Passive。判断依据很简单:看启动日志里是「Waiting for connection」还是「Connecting to peer」。
这个参数的坑在于:部分 SDK 的 Active 模式做了额外的 IP 白名单校验,Peer IP 不在列表里就拒绝连接。表现为:TCP 端口能通,应用层连接一直建不起来。翻协议栈源码才发现是白名单问题。试用期测试时优先把白名单清空,或者确认 SDK 有没有「trust all」开关。
5. 试用阶段最容易翻车的五个问题:现象、原因、解决
5.1 现象:TCP 已连接但所有 SML 请求都超时
物理连接已经建立了,但发 S1F13 等任何消息都收不到应答,日志里全是 T3 Timeout。原因通常有两个:一是设备侧没收到消息,检查设备日志确认收到的字节数是否和 Host 发送的一致;二是设备收到了但应答被 Host 侧的防火墙或网卡过滤。先用原始字节对比排查,如果设备收到的字节数是对的,就把排查重点放在消息格式上——特别是 SML 里 W bit 没置位导致设备认为无需应答。
解决:先在配置里把 T3 临时调大到 90 秒,排除正常慢应答的干扰。然后打开 SDK 的 hex dump 日志,把发送和接收的原始报文比对,字节一致就查设备侧解析,不一致就查防火墙和中间链路。
5.2 现象:虚拟设备回 S9 错误帧,消息被拒绝
S9 系列错误帧是设备侧在无法解析消息时给出的反馈,比如 S9F3 表示 Stream 类型无法识别,S9F4 表示数据项错误。遇到这个问题说明消息本身有内容,但格式不合法。最常见两种:字符串长度和 SECS 规范不一致,或者消息项顺序反了。之前在 2.3 节写的 S1F13 里 MDLN 和 SOFTREV 的先后顺序,就是典型场景。
解决:从 SDK 自带的 examples 目录找到正确消息定义,对照 SML 一行行检查。有些设备对 ASCII 项要求固定长度,不足补空格,超长直接拒绝。这种问题不是 SDK 的 bug,是消息结构实现细节,把设备厂商的 SECS 规范文档打开逐项比对。
5.3 现象:换了一台 PC 后同一套配置连不上
在测试机上跑得好好的,换到另一台机器同一份配置,TCP 连接就是建不起来。原因大概率是测试机的 HSMS 端口被系统防火墙或杀毒软件拦了。SECS/GEM 的端口通常是一段高位端口,如果之前那台机器恰好有程序占了端口,SDK 会报 bind failed,换了机器端口空了反而能连上,但另一台机器防御软件把外来连接拦了。
解决:确认端口没有冲突,把 SDK 进程加入防火墙白名单。另外检查连接角色配置的 IP 是不是写死了旧机器的地址,换了环境把它改成动态获取,先用 loopback 地址跑通再改回实际 IP。
5.4 现象:License 显示有效却调用不了报警接口
代码编译通过,License 诊断也显示有效,但调用 GEM 报警相关接口报错。原因和我们在 3.1 节说的类似——试用版功能裁剪不一定在 License 文件里明示,而是通过运行时错误码体现。报警、配方、事件这三个模块是 SDK 厂商最常做成收费项的部分。
解决:拿错误码去查 SDK 的错误码表,如果表里标注了「License Required」,直接找厂商申请评估许可。这个坑不必花时间绕,模块缺失不是配置问题,是商务问题,趁早确认免得影响试用期进度。
5.5 现象:高压测时偶发 T3 超时但小流量完全不发
用脚本连续发大量消息时偶发 T3 超时,但单条消息测试从来不超时。原因有两类:一是消息队列阻塞,SDK 单线程处理应答,消息积压导致应答超时;二是虚拟设备侧的模拟器本身处理能力有限。先分辨是哪一侧:在虚拟设备上加时间戳日志,看应答发出时间是否超过 T3;如果设备即时回复但 Host 侧没收到,就是 SDK 收包线程或网络缓冲问题。
解决:如果确认是 SDK 侧队列阻塞,查阅 SDK 是否有并发处理开关或线程数配置。评估时记录「在什么并发度下开始出现超时」——这个数字会直接影响后续选型结论,很多项目在方案阶段说不清吞吐需求,试用期正好补上这个数据。
6. 把两周试用期变成一次评估:照着这份清单验证再决定
试用阶段的收尾不是写「可以跑通」,而是输出一份对采购和架构都有用的评估结论。我的习惯是在最后几天按以下清单逐项确认:协议覆盖是否含 E5/E30/E37 三层的完整实现;HSMS 的 Active/Passive 是否可运行时切换;T3/T5/T6/T7/T8 超时参数是否真的生效,而不只是存进了配置文件;设备 ID 掩码是否支持按位配置;S9 错误帧能否透传到应用层回调;断线重连后 GEM 状态能否正确恢复,还是需要手动重建整个会话;License 的试运行期限从哪天开始、是否有连接数限制,避免演示当天才发现限制。把这六项写成一页表格,每项标注测试方法和结果,这份材料比任何销售文档都有说服力。
评估期间记得保留每个测试场景的原始日志。我此前踩过这样的坑:试用第一周只截了成功的截图,出错场景没存档,等到第二周想复现问题,才发现虚拟设备的配置早就改掉了。后来每次操作都带上日期、参数文件、hex dump 日志压缩包归档,这个习惯让选型会的争论少了一大半。SDK 选型的核心是边界行为,不是 demo 效果,日志就是边界行为唯一可信的记录。希望这份清单能帮你在同样的时间里得到更扎实的结论。
本文还有配套的精品资源,点击获取