马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
第三讲:从零构建一个 SECS/GEM Host 主机端步调
关键词:最小化主机步调、创建毗连、发送报文、吸取事故、完整通讯流程模拟
本讲目的
你将把握怎样 独立搭建一个“最小可用”的主机端,也就是:
- 不依赖 Sample 项目
- 用你自己的控制逻辑
- 能连上装备、发指令、收事故
- 能“跑通一条完整业务链”:从建链 -> 发指令 -> 收事故
一、创建项目 & 引入依赖
在 Visual Studio 2022 新建一个 Console App(.NET 6/7/8 都可)
引入 NuGet 包
或在 .csproj 里添加:- <PackageReference Include="SECS4NET" Version="x.x.x" />
复制代码 二、构建主机通讯焦点逻辑
1. 创建毗连
- using SECS4NET;
- var gem = new SecsGemBuilder()
- .UseHsms()
- .ConnectMode(HSMSConnectMode.Active) // 主机模式
- .Host("192.168.1.100") // 目标设备 IP
- .Port(5000) // 目标端口
- .DeviceId(0)
- .Build();
- await gem.ConnectAsync();
- Console.WriteLine("连接已建立!");
复制代码 2. 吸取报文(事故监听)
- gem.MessageReceived += OnSecsMessageReceived;
- void OnSecsMessageReceived(object sender, SecsMessage e)
- {
- Console.WriteLine($"收到:S{e.Stream}F{e.Function}");
- if (e.Stream == 6 && e.Function == 11)
- {
- var ceid = e.SecsItem[0].GetValue<ushort>();
- Console.WriteLine($"事件触发:CEID = {ceid}");
- }
- }
复制代码 3. 发送 S1F13:创建通讯(可选)
- var msg = new SecsMessage(1, 13, true);
- var reply = await gem.SendAsync(msg);
- Console.WriteLine("建链回应:" + reply.Stream + "/" + reply.Function);
复制代码 4. 发送 S2F41:远程下令(最实用)
- var remoteCommand = new SecsMessage(2, 41, true,
- Item.L(
- Item.A("START_LOT"),
- Item.L(Item.A("Lot123"), Item.A("Recipe_XYZ"))
- )
- );
- var reply = await gem.SendAsync(remoteCommand);
- Console.WriteLine($"远程命令回应:S{reply.Stream}F{reply.Function}");
复制代码 5. 注册事故(可选但关键)
假设你知道装备有哪些 CEID 和 RPTID,可以注册:- var enableEvent = new SecsMessage(2, 33, true,
- Item.L(
- Item.U2(1), // CEID = 1
- Item.L(Item.U2(100)) // RPTID = 100
- )
- );
- await gem.SendAsync(enableEvent);
复制代码 然后再界说 RPTID 对应哪些 VIDs:- var defineReport = new SecsMessage(2, 35, true,
- Item.L(
- Item.U2(100), // RPTID
- Item.L(Item.U2(3001)) // VID
- )
- );
- await gem.SendAsync(defineReport);
复制代码 三、完整运行结果预期
你写完这套主机端后,在和装备毗连时应该能做到:
动作预期结果毗连装备控制台输出 “毗连已创建”装备触发事故控制台打印 S6F11 + CEID主机发下令控制台打印 S2F42 复兴注册事故后续装备才会上报 S6F11报文调试可以加上报文打印,观察内容 四、保举封装方式(进阶思绪)
假如你要把它嵌入你将来的工具或 EAP 子模块,发起如许封装:- public class SecsHostService
- {
- private readonly SecsGem _gem;
- public SecsHostService(string ip, int port)
- {
- _gem = new SecsGemBuilder()
- .UseHsms()
- .ConnectMode(HSMSConnectMode.Active)
- .Host(ip)
- .Port(port)
- .DeviceId(0)
- .Build();
- _gem.MessageReceived += OnMessage;
- }
- public Task ConnectAsync() => _gem.ConnectAsync();
- private void OnMessage(object sender, SecsMessage e)
- {
- // 在这里写统一逻辑,比如触发事件、写日志
、发送通知 - }
- public Task SendRemoteCommand(string cmd, params string[] args)
- {
- var msg = new SecsMessage(2, 41, true,
- Item.L(
- Item.A(cmd),
- Item.L(args.Select(Item.A).ToArray())
- )
- );
- return _gem.SendAsync(msg);
- }
- }
复制代码 如许你以后只必要 new SecsHostService(),就能封装整个主机控制逻辑。
第三讲 · 小结
你已经把握了怎样:
- 完整搭建一个主机端最小步调;
- 与装备创建通讯、注册事故、收发指令;
- 监听 S6F11 上报、剖析 CEID 内容;
- 把逻辑封装成类,集成进自己的体系或工具。
下一讲会带你进入一个口试中常常被问的地区:
第四讲:SECS 报文结构到底长什么样?怎么读懂一条复杂的 SML?
我们会讲 Item 的层级结构、SML 报文格式、VID 变量的剖析逻辑,真正走到“看得懂、改得动”的水平。
只需你一句“继承”,咱们马上出发。
|