一、概念

SECS/GEMI 标准(制造设备通信和控制的通用模型)指的是一组用于半导体行业“设备与设备”之间或“设备与工厂主机系统”之间通信的国际标准协议,由国际半导体协议SEMI发起并维护。SECS基于其他较低级别的协议,如下:
1、SECS-II与SECS-I、HSMS的关系:
协议名称  | 用途  | 
SECS-I  | 定义 RS-232 通信的标准(报文)  | 
HSMS  | 定义 TCP/IP 通讯的标准(报文)  | 
SECS-II  | 定义交换消息的标准  | 

2、SECS/GEMHSMS协议报文分析

注:req:请求;rsp:回应。
报文详细解析见:;以下是博文备份。
(1)数据长度
占4个字节,每个字节都是存储的16进制的数据。
(2)报文头信息


(3)数据信息


3、SECS指令(S:Stream编号,F:功能编号)
SECS/GEM协议协议使用“SECS指令”进行通讯;发送者发送奇数,响应者响应偶数,如:“发送者发送S1F1,响应者响应S1F2”。
(1)Stream编号含义
Stream编号  | 代表的含义  | Stream编号  | 代表的含义  | 
1  | 设备状态  | 2  | 设备控制与诊断I  | 
3  | 原料状态  | 4  | 原料控制  | 
5  | 意外处理  | 6  | 数据采集  | 
7  | 加工程序控制  | 8  | 控制程序传输  | 
9  | 系统错误  | 10  | 终端服务  | 
11  | 主机文件服务  | 12  | 晶元定位  | 
13  | 数据集传输  | 14  | 对象服务  | 
15  | 配方管理  | 16  | 加工管理  | 
17  | 设备控制与诊断II  | 18  | 子系统控制与数据  | 
(2)常用指令
① 原文

② 中文翻译(
注:① send翻译的不好,有些感觉是“切换控制命令的意思”,有些是“请求的意思”,等我确认后再更新翻译;
② 该文档不是最新的文档,最新文档内容还多;我会把手里新版指令截图放在文章末尾。
发送者发送的指令  | 代表的含义  | 发送者发送的指令  | 代表的含义  | 
S1F1  | 询问是否可连接(使用S1F2应答是否可连接)  | S7F1  | 进程程序加载 查询  | 
S1F3  | 请求设备状态  | S7F3  | 发送 加工程序  | 
S1F5  | 请求Formatted(格式化)状态  | S7F5  | 请求 加工程序  | 
S1F7  | 请求Fixed()状态   | S7F7  | 请求 加工程序ID  | 
S1F9  | 请求 原料传输状态  | S7F9  | 请求 原料或工艺路线  | 
S1F11  | 请求 变量名称列表  | S7F11  | 发送 原料或工艺路线  | 
S1F13  | 请求建立通信  | S7F13  | 发送 原料或工艺路线入口  | 
S1F15  | 请求离线  | S7F15  | 发送 工艺路线Mode  | 
S1F17  | 请求在线  | S7F17  | 删除 加工程序  | 
S1F19  | 获取属性  | S7F19  | 请求 当前设备的加工程序的资料  | 
S1F23  | 查询 可用事件列表(新版本内容)  |    | |
S2F1  | 查询 Service程序负载  | S7F21  | 获取 设备加工程序能力  | 
S2F3  | 请求 发送Service程序  | S7F23  | 发送 格式化加工程序的命令  | 
S2F5  | 请求 Service程序加载  | S7F25  | 请求 格式化加工程序  | 
S2F7  | 请求 Service程序运行  | S7F27  | 发送 加工程序验证  | 
S2F9  | 请求 Service程序运行结果  | S7F29  | 查询 加工程序验证结果  | 
S2F11  | 获取 Service程序的资料  | S7F31  | 发送 加工程序验证请求  | 
S2F13  | 请求设备常量Constant  | S7F33  | 请求 可用的加工程序  | 
S2F15  | 发送新设备常量Constant  | S7F35  | 请求 Mid$的加工程序  | 
S2F17  | 请求 数据和时间  | S8F1  | 请求 启动程序  | 
S2F19  | 请求 重置或初始化  | S8F3  | 请求 执行程序  | 
S2F21  | 请求 远程控制  | S9F1  | 无法识别的设备Id  | 
S2F23  | 请求 初始化Trace(跟踪)  | S9F3  | 无法识别的Stream类型  | 
S2F25  | 请求 回路诊断  | S9F5  | 无法识别的Function类型  | 
S2F27  | 启动处理请求  | S9F7  | 非法数据  | 
S2F29  | 请求 设备常量名称列表  | S9F9  | 事务计时器超时  | 
S2F31  | 请求 日期和时间设置  | S9F11  | 数据太长  | 
S2F33  | 定义报告  | S9F13  | 对话超时  | 
S2F35  | 给 事件设定 事件组  | S10F1  | 请求 终端  | 
S2F37  | 订阅/退订事件  | S10F3  | 终端单个显示  | 
S2F39  | 多块(Multi-block)查询  | S10F5  | 终端Multi-block(多个)显示  | 
S2F41  | 发送 Host主机命令  | S10F7  | 不允许Multi-block(多块)  | 
S2F43  | 重置后台Streams和Functions  | S10F9  | 广播 Map设置的数据  | 
S2F45  | 定义 可变的限制属性  | S12F1  | 发送 Map设置的数据  | 
S2F47  | 请求 可变的限制属性  | S12F3  | 请求 Map设置的数据  | 
S2F49  | 请求 创建数据报告  | S12F5  | 查询 Map传输  | 
S2F51  | 请求 删除数据报告  | S12F7  | Map数据发送类型1  | 
S2F53  | 请求 创建Trace(跟踪)  | S12F9  | Map数据发送类型2  | 
S2F55  | 请求 删除Trace(跟踪)  | S12F11  | Map数据发送类型3  | 
S2F57  | 请求 收集 Link (连接)事件  | S12F13  | Map数据请求类型1  | 
S2F59  | 请求 收集 UnLink (断开连接)事件  | S12F15  | Map数据请求类型2  | 
S2F61  | 请求 重置 Trace(跟踪)  | S12F17  | Map数据请求类型3  | 
S2F63  | 请求 强制远程控制  | S12F19  | Map错误报告  | 
S3F1  | 请求 原料状态  | S13F1  | 发送 数据集发送  | 
S3F3  | 请求 完成时间  | S13F3  | 请求 打开数据集  | 
S3F5  | 发现原料 通知  | S13F5  | 请求 读取数据集  | 
S3F7  | 原料丢失 通知  | S13F7  | 关闭 数据集发送  | 
S3F9  | 原料ID EquateSend  | S13F9  | 重置 数据集发送  | 
S3F11  | 请求 原料ID  | S13F11  | 查询 数据集多块  | 
S3F13  | 发送 原料ID  | S13F13  | 发送 表格数据  | 
S4F1  | 准备发送原料  | S13F15  | 请求 表格数据  | 
S4F3  | 发送原料  | S14F1  | 请求 获取Attr  | 
S4F5  | 握手完成  | S14F3  | 请求 设置Attr  | 
S4F7  | 未准备好发送  | S14F5  | 请求 获取类型(GetType)  | 
S4F9  | 卡在发送端   | S14F7  | GetType 的数据  | 
S4F11  | 卡在接收端  | S14F9  | 请求 创建 Object  | 
S4F13  | 发送超时  | S14F11  | 请求 删除 Object  | 
S4F15  | 接收到的原料  | S14F13  | 请求 附加对象  | 
S4F17  | 请求接收  | S14F15  | 请求 附加的Object  | 
S4F19  | 创建 Transfer Job(转移)  | S14F17  | 请求 监督对象  | 
S4F21  | 控制 Transfer Job(转移)  | S15F1  | 查询 Multi-Block(多块)配方管理  | 
S4F23  | Transfer Job(转移)报警  | S15F3  | 请求 操作 配方的命名空间  | 
S4F25  | 多块(Multi-block)查询  | S15F5  | 请求 重命名 配方的命名空间  | 
S4F27  | 切换(Handoff )就绪  | S15F7  | 请求 配方空间(RecipeSpace)  | 
S4F29  | 切换(Handoff )命令  | S15F9  | 请求 配方状态  | 
S4F31  | 切换(Handoff )命令完成  | S15F11  | 请求 重命名 配方的命名空间  | 
S4F33  | 切换(Handoff )已验证  | S15F13  | 请求 创建配方  | 
S4F35  | 切换(Handoff )取消就绪  | S15F15  | 请求 存储配方  | 
S4F37  | 切换(Handoff )取消就绪确认  | S15F17  | 请求 检索配方  | 
S4F39  | 切换(Handoff )停止  | S15F19  | 请求 重命名配方  | 
S4F41  | 切换(Handoff )停止确认  | S15F21  | 请求 操作配方  | 
S5F1  | 发送 报警报告  | S15F23  | 请求 配方描述符  | 
S5F3  | 启用或禁用 报警  | S15F25  | 更新 配方参数范围  | 
S5F5  | 请求 报警列表  | S15F27  | 请求 下载配方  | 
S5F7  | 请求 已启用的报警列表  | S15F29  | 请求 验证配方  | 
S5F9  | 发送 异常报警  | S15F31  | 请求 卸载配方  | 
S5F11  | 清除 异常报警  | S15F33  | 请求 选择配方  | 
S5F13  | 请求 异常恢复  | S15F35  | 请求 删除配方  | 
S5F15  | 异常恢复 完成通知  | S15F37  | 请求 批准 DRNS分割行为  | 
S5F17  | 中止 异常恢复 请求  | S15F39  | 请求 分割 DRNS记录器  | 
S6F1  | 发送 Trace(跟踪)数据  | S15F41  | 请求 修改 DRNS记录器  | 
S6F3  | 发送 离散型变量数据  | S15F43  | 请求 获取DRNS变更  | 
S6F5  | 查询 “发送的多块(Multi-block)数据”  | S15F45  | 请求 批准DRNS变更  | 
S6F7  | 请求“数据传输”  | S15F47  | 请求 重建DRNS管理器  | 
S6F9  | 发送“Formatted(格式化)变量”  | S16F1  | 查询 多块(Multi-block)加工程序数据  | 
S6F11  | 发送 事件报告(设备上传数据)  | S16F3  | 请求 创建加工程序  | 
S6F13  | 发送 注释事件报告  | S16F5  | 请求 控制加工程序  | 
S6F15  | 请求 事件报告  | S16F7  | 加工程序 警告通知  | 
S6F17  | 请求 注释事件报告  | S16F9  | 加工程序 事件通知  | 
S6F19  | 请求 特定报告  | S17F1  | 请求 创建数据报告  | 
S6F21  | 请求 带注释的个人报告请求  | S17F3  | 请求 删除数据报告  | 
S6F23  | 请求 后台数据  | S17F5  | 请求 创建Trace(跟踪)  | 
S6F25  | 发送 通知报告  | S17F7  | 请求 删除Trace(跟踪)  | 
S6F27  | 发送 Trace(跟踪)报告  | S17F9  | 请求 收集 Link(链接)事件  | 
S6F29  | 请求 Trace(跟踪)报告  | S17F11  | 请求 收集 UnLink(断开连接)事件  | 
(3)TimeOut
   | T1  | T2  | T3  | T4  | RTY  | 
SEMI标准(秒)  | 0.5  | 10  | 45  | 45  | 3(次)  | 
含义  |    | 握手超时  | Primary信息发送后等待回复超时  |    | 超时后可以重试的次数  | 
范围(秒)  | 0.1~10  | 0.2~25  | 1~120  | 1~120  | 0~31(次)  | 
4、SECS/GEM协议调试软件
① 仿真软件1(本实例演示):SEComSimulator(美国AIM Systems公司的基于C#开发的SECS标准协议模拟器;咸鱼搜索 执笔小白)
② 仿真软件2:SECS-Simulator(其他公司开的Java版;备份下载地址:PCtoLCD2002完美版.zip)
(1)软件中出现的关键字如下:
- Host/Local:主机模式与本地模式
 - Remote:远程模式(RCMD)
 - Passive/Active:服务器与客户端
 - EQP:设备
 - Device ID:设备标识
 - VID:设备变量ID
 - SVID:设备状态ID(key-value,如:1000代表‘一号轮子的转速’)
 
// 1 举例:如定义1000代表轮子1的转速;1001代表轮子2的转速;
// 1.1 主机请求写法(给我变量1000(轮子1的转速)和1001的值(轮子2的转速)):
S1F3 W
L<2,
   <U4,1 1000>
   <U4,1 1001>
 >.
// 1.2 设备回复写法(轮子1为800转速;轮子2为600转速):
S1F4
L <2,
    <U4,1,800>
    <U4,1,600>
 >.- RPTID:报告编号
 - CEID:事件编号(事件为 设备主动给主机推送数据;一个事件中可以包含多个报告)
 
// 1 举例:如有一个事件(ID为3000)需要通知主机,这个事件(ID3000)中有一个报告(ID2000),报告2000中有一个变量(1000))
// 1.1 设备发送写法(解释如下):
S6F11 W
<L,3  // 长度3
    <U4,1,0>    // 是当事件需要多次发送时,需要的唯一标识
    <U4,1,3000>  // 事件(CEID)
    <L,1         // 事件中的报告List(RPTID )
        <L,2             // 报告List的长度
           <U4,1,2000>    // 报告ID
           <L,1            // 报告ID的长度
               <U4,1,120>  // 变量ID(SVID)的值
           >
        >
    >
 >.
// 1.2 主机回复写法(我收到了)
S6F12 
<B,1,0>- ECID:设备常量
 - PPID:配方编号(配方为一组变量,可以一次请求一组数据)
 - DATAID:数据ID
 - 设置或清除报警ALCD /报警编号ALID / 报警文本ALTX
 - Send Primary Message:发送主要消息
 - Send Reply Message:发送回复消息
 - Send Control Message:发送控制消息
 - MDLN:设备模型类型
 - SOFTRE:软件修订版本
 - 设备常数(EC)/状态变量(SV) /数据变量(DV)
 
(2)使用SEComSimulator作为服务器时的配置


(3)使用SEComSimulator作为客户端时的配置


(4)开始连接

(5)连接后的效果

二、C# 示例
1、界面样式


2、代码
略










