Skip to content
MoomarcPublic

About

SECS/GEM Simulator in C#. This project was created to test semiconductor equipment communication, specifically for testing SECS message communication.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

QoderSecs

自用的 SECS/GEM 模拟器,Windows 桌面版,界面只有中文。可以做 Host 去测真实机台的参数,也可以做 Equipment 来测 CIM 系统。

传输层现状:

  • HSMS-SS(TCP):主要模式,也是默认模式,完整可用,日常在用的就是这条。
  • SECS-I(串行块传输):串口、会话层和界面入口都已接上,界面上能选;块格式、ENQ/EOT/ACK/NAK 握手、多块拼消息、T1/T2/T4 都有自动化测试。只做点对点;控制块(SELECT、ENABLE 那一类)和多点共线没做。真串口上的时序还要接对端实测。

QoderSecs 主界面:左边消息库,中间消息编辑(结构 / SML 两个页签),右边通信记录和详情

功能

连接

  • 传输方式可选 HSMS 或 SECS I,默认 HSMS;选 SECS I 时参数区换成串口参数。
  • Role(Host / Equipment)和 Active / Passive 是两个独立设置。
  • HSMS 可填 IP、Port、Dev ID 和 T3/T5/T6/T7/T8;SECS I 可填串口号、波特率、数据位、校验、停止位、流控和 T1/T2/T4,两端参数要一致。改动自动落盘,连接期间锁定。
  • 一个进程跑一条连接,要两条就开两个实例。

消息库

  • 导入导出 SecsExpress 的 .sxml;也可以把 .sxml / .xml 直接拖到左栏,库里已有消息时先确认再整体替换。
  • 以原始 XML 为权威数据,只局部改写编辑过的节点;DataDictionary、Maps、未知元素和属性、注释、消息顺序都保留。
  • 消息行的 SxFy 后面带 W 位记号:W 表示需要回复,- 表示不需要。
  • 搜索支持消息名、S10F3、10 3;消息按 SxFy 升序排列。
  • 消息名必须非空且不能重名;SxFy 可以重复——三条 S2F41 分别叫 START、STOP、PP_SELECT 是正常用法。
  • 消息头第二行的「描述」框编辑 Description,占满整行,按回车或点到空白处就保存;左栏鼠标停在消息上会显示描述,描述为空则不弹。
  • 条目可新建、复制、删除。复制出来的除名字外全部照抄,名字取「原名 Copy」,紧跟原条之后;删除前弹确认,并报出有几条自动回复指向它——删完这些引用一并置空。不做撤销。

结构编辑

  • 树状编辑 L、A、B、Boolean、I1/I2/I4/I8、U1/U2/U4/U8、F4/F8。
  • 数值和 Boolean 支持数组,<I2> 0 0 这种一个元素多个值可以直接编辑也能发出去;值框里多个值用空格分隔,存进 SXML 就是同一个 <Value> 里空格分开,和 SecsExpress 导出的写法一致。A、J、B 的 [个数] 是字节数,正文按一段对待。
  • B 类值可以照日志里的写法带 0x,提交时自动去掉(0x00 0X1F 2A → 00 1F 2A);填 -1 到 -127 之间的负数时按二补码换成两位十六进制(-45 → D3),超出这个范围照旧算不合法。这些转换只在提交时做,打字过程中不动输入。
  • 加子项、加同级、删除都有菜单和快捷键;双击那一行或按 F2 就地在树里改名称和值,边敲边校验,按回车、点到别的行或点到空白处都收框并保存。
  • 节点可以复制粘贴,也可以拖动:结构页里拖动是搬动,字典页里拖进别的条目放下去的是副本、原来那一条不动(条目互不隶属),顶层条目之间拖动是排队。值不合法时标红并禁止发送。
  • SML 页签可预览整条消息,也可以粘贴一条 SML 覆盖当前消息的头和结构。

数据字典

  • 结构页把任意节点「存为条目」,字典页当素材库用。
  • 菜单:新增数据(选类型)、删除条目、复制、粘贴;条目内部可以就地改名称和值、加子项、删某一层,操作和结构页同一套。
  • 条目之间互不隶属;条目和消息之间是复制关系,改哪一边都不影响对方。
  • 从字典拖不进消息,跨段只能复制粘贴。

收发与配对

  • W-bit 请求的 Secondary 严格按 SystemBytes 配对,不按 SxFy 或到达时间猜。
  • T3 超时明确显示;超时后才到的回复标成迟到回复;没有人等待的 Secondary 明确报出来。
  • 等回复期间可以点「取消等待」,发送按键立刻放开;点「断开」同样会叫停在途的等待。取消掉的只是「等」这件事——消息已经发出去了,对方后来真回了会记成迟到回复。

自动回复

  • 唯一来源是库里那条 SxFy 上配的 AutoReply 字段,值是另一条消息的 Name。
  • 收到带 W 的 Primary 时把它的结构发出去,W 位强制为 0;没配、找不到或发不出去就不回复,并记录未自动回复。
  • 默认不开启,不内置任何规则,不按 SxF(y+1) 推导。
  • 那一栏的候选写成「SxF · 名字」,字段标题带上本条的 SxF 和 W 位;只支持指向一条消息,当前选中是哪条看下拉框自己的高亮,候选上不再附加配对标记。程序始终按名字精确回。
  • 引用按名字存,所以目标被改名或删除时指着它的 AutoReply 一并置空,候选栏里也不再出现旧名字;状态栏会写明置空了哪几条。

通信记录与日志

  • 记录方向、SxFy、名称、SystemBytes、状态和耗时,请求与回复的配对关系直接可见;两个区域各自智能滚动。
  • 内存里保留最近 5000 条,超出的最早的被丢掉,标题上说明丢了几条。
  • 磁盘上 sml.log 是完整 SML,detail.log 是连接事件、协议头、SystemBytes、耗时、异常和回复来源。
  • 每个配置保留最近 20 个会话日志目录。

大消息

  • 不设 4KB 那类应用层上限;列表只长期持有轻量元数据并开启虚拟化,大 SML 默认折叠。
  • 1MB 和 10MB 的 B 数据双向收发验证过,界面不冻结。
  • 单个值超过 256K 字符时,树行和输入框都不展开正文,只报大小(B 按字节数算)。要换正文就把整段复制到剪贴板后点「用剪贴板替换…」,或者直接把文本拖进那一栏;正文绕开输入框整段写进去。普通尺寸的值照旧就地编辑。
  • 值输入框高度固定、不自动换行,长正文不会把中间栏撑开。
  • 文本框的显示上限(预览 256KB、详情一次 512KB)只是显示限制,超出部分指向 sml.log。

数据位置

  • 都在 exe 旁的 QoderSecsData/:settings.json、common-commands.sxml 和 logs/<配置 Id>/<时间_进程号>/。
  • 日志目录带进程号,多个实例不互相覆盖;参数文件共用一份,谁后保存谁生效。

项目结构

QoderSecs.sln
src/
├─ QoderSecs.Core/    协议、消息库、自动回复、配置和日志(不引用 WPF)
└─ QoderSecs.App/     WPF 界面与 ViewModel
tests/
└─ QoderSecs.Tests/   单元测试、契约测试和 HSMS 回环集成测试
release/             单文件发布产物,唯一发布落点(不进版本库)

Host 和 Equipment 是同一套代码,角色只是配置里的一个字段。

上手

发布产物是单个 QoderSecs.App.exe,Releases 里可以直接下载。目标机需要 .NET 8 Windows Desktop Runtime(x64,框架依赖,exe 里不含运行时)。自己构建:

dotnet publish src/QoderSecs.App/QoderSecs.App.csproj \
  --configuration Release \
  --runtime win-x64 \
  --self-contained false \
  -p:PublishSingleFile=true

发布产物固定落在仓库根的 release\(PublishDir 写在 csproj 里),不要再 -o 到 artifacts\ 或 bin\...\publish。src\...\bin\Release\ 只是编译缓存,不是可分发版本;发布前先关掉正在运行的实例。

第一次启动时,程序会在 QoderSecsData/ 里解出一份 common-commands.sxml,settings.json 和 logs/ 也在同一个目录里,所以 exe 所在目录必须可写。解出来的样本只是普通文件,改它、删它、换成自己的都不受影响。启动后消息库是空的,样本不自动加载,要用的自己导入或拖进左栏。

common-commands.sxml 里是 29 条 GEM 常用命令的骨架:结构留着、变量名按标准填(SVID、RPTID、CEID、CEED、RCMD、PPID、TID、MAP_XY、WAFER_MAP 这些),数值一律空着,编号和取值按你手上那台机填。消息名不再带 SxFy_ 前缀,SxFy 照旧单独存;每条都带中文 Description,左栏悬停就能看到。上下线(S1F15–S1F18)和日期时间(S2F31、S2F32)这几条也在里面。S12 上下图那两条(S12F9、S12F16)同样只给形状,图正文粘进去就能发。S10F3 的 TID 和 TEXT 在样本里留空,发之前先填,TID 一般写 00。数据字典不在样本里预置,要用在「数据字典」页自己加。

本机测一对 HSMS 连接:开两个 exe 实例,一个填 Active、一个填 Passive,地址用 127.0.0.1,先点 Passive 那边再点 Active。程序只提供 127.0.0.1 的默认参数,不含任何真实设备信息。

本机测一对 SECS I 连接:需要先有一对虚拟串口(例如 com0com,装好后在设备管理器里能看到成对的两个 COM 号)。两个实例都选 SECS I,分别填这一对的两个 COM 号,波特率、数据位、校验、停止位、流控保持一样,先开 Passive 再开 Active。虚拟串口能验块格式、握手、会话和日志,验不了真实线缆下的 T1/T2/T4 时序。

偶数 F 的消息(S12F16、S1F2 这类)在 SECS 里是应答,必须作为某条 W 请求的回复、沿用那条请求的 SystemBytes。把它当普通消息手动发出去时,对端一般按「无人等待的应答」丢掉;要测回复方向,让对面发请求、这边用 AutoReply 回。

没做

SECS-I 的控制块(SELECT、ENABLE 那一类)和多点共线;完整 GEM 数据模型和状态机;条件自动回复、脚本、变量和流程编排;内置自动回复规则和按 SxF(y+1) 推导;多候选自动回复选择;手动回复;独立 hex 面板;单进程多连接;撤销。

开发

dotnet build QoderSecs.sln --configuration Release
dotnet test  QoderSecs.sln --configuration Release --no-build

回环测试在 127.0.0.1 上起一对 Active / Passive 实例互连,覆盖 SystemBytes 配对、T3 超时、迟到回复、自动回复、终端显示(S10F3/S10F4)和断开清理。SECS-I 的自动化测试跑在内存双向管道上,覆盖块格式、握手、多块拼消息和会话收发;真正走串口的那一段要虚拟串口或两台机器,自动化测试替不了。

依赖:Secs4Net 3.1.0、Secs4Net.Sml 3.1.0(协议)、System.IO.Ports 8.0.0(串口)、MSTest 4.0.2(只在测试里)。C# / .NET 8,WPF + MVVM。

这个项目推荐用 AI Agent 来写、来读:核心逻辑不碰 WPF、测试一条命令跑完、模块职责单一,Agent 拿到一句话需求就能定位到该改的地方。

致谢

  • SecsExpress —— 日常测试中一直在用的 SECS/GEM 模拟器。本项目的消息库格式、命令组织和使用习惯都重点参考了它。
  • Secs4Net(MIT)—— SECS/GEM 协议实现。

许可证

MIT,见 LICENSE。

About

SECS/GEM Simulator in C#. This project was created to test semiconductor equipment communication, specifically for testing SECS message communication.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages