c#-SECS/GEM协议入门

做光伏,半导体非标设备的小伙伴肯定对SECS/GEM协议有所耳闻,不同于普通串口、TCP自定义协议,SECS/GEM不是简单的数据收发协议,而是一套半导体工厂标准化的设备通信+设备行为规范体系。作为对接机台与工厂MES、EAP系统的上位机开发人员,彻底搞懂这套协议,是半导体上位机开发的核心能力,本着学习了解写下这篇博客,望各位指正

一、先搞懂:SECS/GEM 到底是什么?

很多人会混淆SECS、GEM、HSMS三者的关系,这是入门最大的误区。我们可以用一句话精准概括:SECS/GEM = HSMS传输层 + SECS-II报文语法 + GEM设备行为规范 ,三者缺一不可,共同构成半导体设备通信标准体系。注:SEMI是一个标准体系,覆盖了半导体制作的方方面面,最主要的就是E系列,在整个SEMI体系中,**E系列(Equipment Automation)**是设备与工厂信息系统对接的基石。从最底层的物理通信(串口/网口),到消息格式、设备行为模型、批次管理,E系列标准定义了"设备自动化"的完整协议栈。

核心概念拆解

  • ECS-II(SEMI E5):应用层报文协议。定义了所有通信消息的格式、数据类型、流(Stream)和功能(Function)编码,是上位机和设备对话的"语言语法",规定了谁发消息、消息格式是什么、应答规则是什么。

  • E5还定义了消息体的数据类型系统,包括:

    数据类型 代号 说明
    List L 有序列表,可嵌套
    Binary B 二进制数据
    Boolean BOOLEAN 布尔值
    ASCII A ASCII字符串
    Signed Integer I1/I2/I4/I8 有符号整数(1/2/4/8字节)
    Unsigned Integer U1/U2/U4/U8 无符号整数
    Float F4/F8 浮点数(4/8字节)
  • HSMS(SEMI E37):高速消息服务,是SECS的底层传输协议。基于TCP/IP以太网通信,替代了老旧的SECS-I串口通信,是目前工业现场主流的传输方式,负责保证数据可靠收发、重连、心跳、消息分片。

  • GEM(SEMI E30) :通用设备模型,也是整套协议的核心灵魂。它不是通信协议,而是设备行为标准。规定了设备的状态机、事件上报、告警机制、远程控制、数据采集规则,统一了所有半导体设备的交互逻辑,让不同厂商的设备能适配同一套工厂上位机系统。现在已经在原有的基础上更新到GEM300

二、协议分层架构

第一层:传输层(HSMS)

在开发中无需手动使用 Socket、TcpClient 裸写底层通信,我选择的方案是SECS4NET开源库。该库已经完整封装了HSMS底层逻辑,内置连接管理、标准心跳保活、断线自动重连、消息帧收发、粘包拆包、消息分片重组等能力。开发者无需关注底层TCP通信细节,只需要配置参数、启动服务,即可直接实现设备与上位机的可靠通信,极大降低底层开发出错概率。

第二层:报文解析层(SECS-II)

对HSMS传输的二进制数据进行编解码。SECS-II有严格的报文结构:消息头+消息体,支持多种数据类型(U1/U4、I1/I4、ASCII、List等)。C#开发核心工作就是字节数组与SECS报文对象的互转

第三层:业务逻辑层(GEM)

整套协议的业务核心,定义交互规则。

比如:设备端和Host通过S1F1来确定是否在线,EQ/HOST 发出S1F1,HOST/EQ回复S1F2;EQ通过S5F1主动上报报警信息,

需要注意,作为设备端(EQ),很少主动对Host发送指令,我总结了下,设备端主动发起常用的有

| 基础通信类 |||
| 指令 | 消息名称 | 是否需要回复 |
| S1F1 | 确认设备是否在线 | 需要Host回复S1F2 |
| S1F13 | 建立通信需求 | 需要Host回复S1F14 |
| 报警管理 |||
| S5F1 | 设备主动上报报警 | 需要Host回复S5F2 |
| 事件上报 |||
| S6F1 | 设备发送Trace采样数据 | 需要Host回复S6F2 |

S6F11 设备发送事件报告 需要Host回复S6F12

我会在结尾Po上最新的SF指令和描述,需要的可以作为参考

三、上位机开发高频核心流(Stream)与指令

SECS协议定义了数十个Stream,作为C#上位机开发,90%的业务场景只需要掌握6大核心Stream,无需全盘记忆,精准适配开发需求。

1. S1 设备状态与控制握手(基础必备)

设备通信基础握手、状态查询,是设备上线的第一步交互。

  • S1F1 / S1F2:设备在线握手/应答,设备上电后主动向上位机发起上线通知,是通信建立的核心指令

  • S1F3 / S1F4:设备状态查询/应答,上位机主动获取设备当前运行、空闲、故障等状态

2. S2 设备远程控制(核心业务)

上位机对设备的远程操作、参数配置、任务调度。

  • S2F13 / S2F14:设备参数读取与应答

  • S2F15 / S2F16:设备参数写入与应答

  • S2F41 / S2F42:远程命令下发与应答,实现设备启动、停止、暂停等核心控制

3. S5 告警管理(设备异常监控)

设备故障、异常告警的上报与确认,是上位机监控的关键功能。

  • S5F1 / S5F2:告警事件上报与应答,设备触发异常时主动推送消息

  • S5F3 / S5F4:告警列表查询,上位机可主动拉取设备所有未处理告警

4. S6 数据事件上报(生产数据采集)

设备生产过程数据、自定义事件上报,用于生产追溯、数据统计。

5. S10 终端交互

设备弹窗消息、人工交互提示上报,适配现场人工操作场景。

四、踩坑场景

  • 坑1:忽略SECS4NET应答匹配机制:很多新手手动管理消息请求应答,实则SECS4NET原生通过TransactionId精准匹配请求与应答消息。如果手动篡改、重复使用事务ID,会导致消息错乱、应答丢失,必须遵循库的事务ID自增、匹配规则。

  • 坑2:不熟悉SECS4NET数据类型封装:库对SECS所有原生数据类型做了封装,若混用C#原生类型替代库内置数据实体,会导致报文格式不标准、设备解析报错。比如List嵌套报文,必须使用SECS4NET专属的List结构构建,不可用C#普通List。

  • 坑3:未遵循GEM状态机规则:很多新手只做数据收发,不维护设备状态,导致下发指令被设备拒收,排查问题耗时很久。

  • 坑4:未正确配置SECS4NET心跳参数:库默认心跳参数不一定适配现场设备,心跳间隔、超时时间配置不当,会出现频繁断连、误判离线问题,必须根据设备手册自定义适配HSMS心跳参数。

  • 坑5: 所有SECS消息的是否应答、是否需要回复 ,并非自定义功能,严格对应 SECS-II 协议标准中的 Reply Flag(应答标记位),这是唯一控制状态。

    Reply Flag 取值规则ReplyFlag = 1:Need Reply(需要回复),标准强制应答消息,设备/Host必须返回对应F功能应答包
    ReplyFlag = 0:No Reply(无需回复),单向上报消息,无需任何应答

五、附录

|------------|--------------------------------------------|-----|-------|-------------------------------|
| S/F | 消息名称 | 方向 | Reply | 描述 |
| S1F1 | Are You There (R) | H↔E | Yes | 确认设备在线 |
| S1F2 | On Line Data | H↔E | No | S1F1 回复,返回设备 MDLN 和 SOFTREV |
| S1F3 | Selected Equipment Status Request (SSR) | H→E | Yes | 查询指定状态变量(SV)的当前值 |
| S1F4 | Selected Equipment Status Data (SSD) | E→H | No | 返回请求的状态变量值 |
| S1F11 | Status Variable Namelist Request (SVNR) | H→E | Yes | 查询 SV 的名称和单位定义 |
| S1F12 | Status Variable Namelist Reply (SVNRR) | E→H | No | 返回 SV 名称列表 |
| S1F13 | Establish Communications Request (CR) | H↔E | Yes | 建立通信请求 |
| S1F14 | Establish Communications Acknowledge (CRA) | H↔E | No | 通信建立确认回复 |
| S1F15 | Request OFF-LINE (ROFL) | H→E | Yes | Host 请求设备下线 |
| S1F16 | OFF-LINE Acknowledge (OFLA) | E→H | No | 设备确认下线请求 |
| S1F17 | Request ON-LINE (RONL) | H→E | Yes | Host 请求设备上线 |
| S1F18 | ON-LINE Acknowledge (ONLA) | E→H | No | 设备确认上线请求 |
| S2F13 | Equipment Constant Request (ECR) | H→E | Yes | 查询设备常量(EC)的当前值 |
| S2F14 | Equipment Constant Data (ECD) | E→H | No | 返回设备常量值 |
| S2F15 | New Equipment Constant Send (ECS) | H→E | Yes | 设置设备常量(EC)新值 |
| S2F16 | New Equipment Constant Ack (ECA) | E→H | No | 设备常量设置确认 |
| S2F17 | Date and Time Request (DTR) | H→E | Yes | 查询设备日期时间 |
| S2F18 | Date and Time Data (DTD) | E→H | No | 返回设备日期时间 |
| S2F29 | Equipment Constant Namelist Request (ECNR) | H→E | Yes | 查询 EC 的名称、范围定义 |
| S2F30 | Equipment Constant Namelist (ECN) | E→H | No | 返回 EC 名称定义 |
| S2F31 | Date and Time Set Request (DTS) | H→E | Yes | 设置设备日期时间 |
| S2F32 | Date and Time Set Acknowledge | E→H | No | 时间设置确认 |
| S2F33 | Define Report (DR) | H→E | Yes | 定义报告(RPTID→DVID/VID 映射) |
| S2F34 | Define Report Acknowledge (DRA) | E→H | No | 报告定义确认 |
| S2F35 | Link Event Report (LER) | H→E | Yes | 关联事件与报告(CEID→RPTID 映射) |
| S2F36 | Link Event Report Acknowledge (LERA) | E→H | No | 事件关联确认 |
| S2F37 | Enable/Disable Event Report (EDER) | H→E | Yes | 启用/禁用事件报告 |
| S2F38 | Enable/Disable Event Report Ack (EDEA) | E→H | No | 事件启用/禁用确认 |
| S2F41 | Host Command Send (HCS) | H→E | Yes | Host 发送远程命令(Remote Command) |
| S2F42 | Host Command Acknowledge (HCA) | E→H | No | 远程命令执行确认 |
| S2F43 | Reset Spooling Streams and Functions | H→E | Yes | 重置 Spooling 配置 |
| S2F44 | Reset Spooling Ack | E→H | No | Spooling 重置确认 |
| S3F17 | Carrier Action Request (CAR) | H→E | Yes | 请求载具相关动作 (GEM300) |
| S3F18 | Carrier Action Acknowledge | E→H | No | 载具动作确认 |
| S5F1 | Alarm Report Send (ARS) | E→H | Yes | 设备主动上报报警 |
| S5F2 | Alarm Report Acknowledge (ARA) | H→E | No | Host 确认收到报警 |
| S5F3 | Enable/Disable Alarm Send (EAS) | H→E | Yes | 启用/禁用指定报警上报 |
| S5F4 | Enable/Disable Alarm Ack (EAA) | E→H | No | 报警启用/禁用确认 |
| S5F5 | List Alarms Request (LAR) | H→E | Yes | 查询报警列表 |
| S5F6 | List Alarm Data (LAD) | E→H | No | 返回报警列表数据 |
| S6F1 | Trace Data Send (TDS) | E→H | Yes | 设备发送 Trace 采样数据 |
| S6F2 | Trace Data Acknowledge | H→E | No | 确认收到 Trace 数据 |
| S6F11 | Event Report Send (ERS) | E→H | Yes | 设备发送事件报告(最核心的数据采集消息) |
| S6F12 | Event Report Acknowledge (ERA) | H→E | No | 确认收到事件报告 |
| S6F15 | Event Report Request (ERR) | H→E | Yes | Host 主动请求事件报告 |
| S6F16 | Event Report Data (ERD) | E→H | No | 返回请求的事件报告数据 |
| S6F19 | Individual Report Request | H→E | Yes | 请求单个报告数据 |
| S6F20 | Individual Report Data | E→H | No | 返回单个报告数据 |
| S7F1 | Process Program Load Inquire (PPLI) | H→E | Yes | Host 询问是否可下载配方 |
| S7F2 | Process Program Load Grant (PPLG) | E→H | No | 设备同意/拒绝配方下载 |
| S7F3 | Process Program Send (PPS) | H→E | Yes | Host 向设备发送配方数据 |
| S7F4 | Process Program Acknowledge (PPA) | E→H | No | 配方接收确认 |
| S7F5 | Process Program Request (PPR) | H→E | Yes | Host 请求上传设备配方 |
| S7F6 | Process Program Data (PPD) | E→H | No | 设备返回配方数据 |
| S7F17 | Delete Process Program Send (DPPS) | H→E | Yes | Host 请求删除设备上的配方 |
| S7F18 | Delete Process Program Ack | E→H | No | 配方删除确认 |
| S7F19 | Current EPPD Request | H→E | Yes | 查询设备当前所有配方列表 |
| S7F20 | Current EPPD Data | E→H | No | 返回配方 ID 列表 |
| S9F1 | Unrecognized Device ID (UDN) | E→H | No | 无法识别的设备 ID |
| S9F3 | Unrecognized Stream Type (USN) | E→H | No | 无法识别的 Stream |
| S9F5 | Unrecognized Function Type (UFN) | E→H | No | 无法识别的 Function |
| S9F7 | Illegal Data (IDN) | E→H | No | 非法数据格式 |
| S9F9 | Transaction Timer Timeout (TTN) | E→H | No | 事务超时(T3 超时) |
| S9F11 | Data Too Long (DLN) | E→H | No | 数据超长 |
| S9F13 | Conversation Timeout (CTN) | E→H | No | 多块消息会话超时 |
| S10F1 | Terminal Request (TR) | H→E | Yes | Host 向设备终端发送显示消息 |
| S10F2 | Terminal Request Acknowledge | E→H | No | 终端消息确认 |
| S10F3 | Terminal Display, Single (TDS) | H→E | Yes | Host 发送单行终端显示 |
| S10F4 | Terminal Display, Single Ack | E→H | No | 单行终端显示确认 |
| S10F5 | Terminal Display, Multi-Block (TDM) | H→E | Yes | Host 发送多行终端显示 |
| S10F6 | Terminal Display, Multi-Block Ack | E→H | No | 多行终端显示确认 |
| S10F9 | Broadcast (BC) | H→E | Yes | Host 广播消息到所有终端 |
| S10F10 | Broadcast Acknowledge | E→H | No | 广播确认 |
| S14F1 | GetAttr Request | H→E | Yes | 查询对象属性 (GEM300) |
| S14F2 | GetAttr Data | E→H | No | 返回对象属性值 |
| S14F9 | SetAttr Request | H→E | Yes | 设置对象属性 (GEM300) |
| S14F10 | SetAttr Data | E→H | No | 对象属性设置确认 |
| S15F3 | Recipe Namespace Action Req | H→E | Yes | 配方命名空间操作 (GEM300) |
| S15F4 | Recipe Namespace Action Ack | E→H | No | 配方操作确认 |
| S16F5 | Process Job Create Req (PJC) | H→E | Yes | 创建加工作业 (GEM300) |
| S16F6 | Process Job Create Ack | E→H | No | 加工作业创建确认 |
| S16F11 | Process Job Command Req | H→E | Yes | 加工作业控制命令 (START/STOP/ABORT 等) |
| S16F12 | Process Job Command Ack | E→H | No | 作业控制确认 |

相关推荐
jixunwulian1 小时前
AI边缘智能网关工业安全领域的边缘智能预警方案应用
网络·人工智能·安全
Co_Hui1 小时前
计算机网络
网络·计算机网络
头条娱圈1 小时前
杨洋现身开封 共赴《雨霖铃》武侠之约
网络
cui_ruicheng2 小时前
Linux网络编程(二):网络数据传输基本流程
linux·服务器·网络
TechWayfarer2 小时前
网络安全视角:利用IP定位API接口识别机房与基站流量(合规风控篇)
开发语言·网络·数据库·python·安全·网络安全
前端若水2 小时前
智能体开发与传统软件开发的核心区别
网络·人工智能·python·开源·log4j
tzy2332 小时前
Modbus:工业通信的“通用语言”
网络·串口·协议·modbus·rs-485·规约·iec 101
怀旧,2 小时前
【Linux网络编程】15. Reactor 反应堆模式
linux·网络·php
Kiyra2 小时前
【无标题】
网络