Secs/Gem第三讲 (基于secs4net项目的ChatGpt先容)

[复制链接]
发表于 2025-9-24 19:28:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
第三讲:从零构建一个 SECS/GEM Host 主机端步调

关键词:最小化主机步调、创建毗连、发送报文、吸取事故、完整通讯流程模拟

本讲目的

你将把握怎样 独立搭建一个“最小可用”的主机端,也就是:

  • 不依赖 Sample 项目
  • 用你自己的控制逻辑
  • 能连上装备、发指令、收事故
  • 能“跑通一条完整业务链”:从建链 -> 发指令 -> 收事故

一、创建项目 & 引入依赖

在 Visual Studio 2022 新建一个 Console App(.NET 6/7/8 都可)
引入 NuGet 包
  1. Install-Package SECS4NET
复制代码
或在 .csproj 里添加:
  1. <PackageReference Include="SECS4NET" Version="x.x.x" />
复制代码

二、构建主机通讯焦点逻辑

1. 创建毗连
  1. using SECS4NET;
  2. var gem = new SecsGemBuilder()
  3.     .UseHsms()
  4.     .ConnectMode(HSMSConnectMode.Active)   // 主机模式
  5.     .Host("192.168.1.100")                 // 目标设备 IP
  6.     .Port(5000)                            // 目标端口
  7.     .DeviceId(0)
  8.     .Build();
  9. await gem.ConnectAsync();
  10. Console.WriteLine("连接已建立!");
复制代码

2. 吸取报文(事故监听)
  1. gem.MessageReceived += OnSecsMessageReceived;
  2. void OnSecsMessageReceived(object sender, SecsMessage e)
  3. {
  4.     Console.WriteLine($"收到:S{e.Stream}F{e.Function}");
  5.     if (e.Stream == 6 && e.Function == 11)
  6.     {
  7.         var ceid = e.SecsItem[0].GetValue<ushort>();
  8.         Console.WriteLine($"事件触发:CEID = {ceid}");
  9.     }
  10. }
复制代码

3. 发送 S1F13:创建通讯(可选)
  1. var msg = new SecsMessage(1, 13, true);
  2. var reply = await gem.SendAsync(msg);
  3. Console.WriteLine("建链回应:" + reply.Stream + "/" + reply.Function);
复制代码
4. 发送 S2F41:远程下令(最实用)
  1. var remoteCommand = new SecsMessage(2, 41, true,
  2.     Item.L(
  3.         Item.A("START_LOT"),
  4.         Item.L(Item.A("Lot123"), Item.A("Recipe_XYZ"))
  5.     )
  6. );
  7. var reply = await gem.SendAsync(remoteCommand);
  8. Console.WriteLine($"远程命令回应:S{reply.Stream}F{reply.Function}");
复制代码

5. 注册事故(可选但关键)

假设你知道装备有哪些 CEID 和 RPTID,可以注册:
  1. var enableEvent = new SecsMessage(2, 33, true,
  2.     Item.L(
  3.         Item.U2(1),            // CEID = 1
  4.         Item.L(Item.U2(100))   // RPTID = 100
  5.     )
  6. );
  7. await gem.SendAsync(enableEvent);
复制代码
然后再界说 RPTID 对应哪些 VIDs:
  1. var defineReport = new SecsMessage(2, 35, true,
  2.     Item.L(
  3.         Item.U2(100),             // RPTID
  4.         Item.L(Item.U2(3001))     // VID
  5.     )
  6. );
  7. await gem.SendAsync(defineReport);
复制代码

三、完整运行结果预期

你写完这套主机端后,在和装备毗连时应该能做到:
动作预期结果毗连装备控制台输出 “毗连已创建”装备触发事故控制台打印 S6F11 + CEID主机发下令控制台打印 S2F42 复兴注册事故后续装备才会上报 S6F11报文调试可以加上报文打印,观察内容
四、保举封装方式(进阶思绪)

假如你要把它嵌入你将来的工具或 EAP 子模块,发起如许封装:
  1. public class SecsHostService
  2. {
  3.     private readonly SecsGem _gem;
  4.     public SecsHostService(string ip, int port)
  5.     {
  6.         _gem = new SecsGemBuilder()
  7.             .UseHsms()
  8.             .ConnectMode(HSMSConnectMode.Active)
  9.             .Host(ip)
  10.             .Port(port)
  11.             .DeviceId(0)
  12.             .Build();
  13.         _gem.MessageReceived += OnMessage;
  14.     }
  15.     public Task ConnectAsync() => _gem.ConnectAsync();
  16.     private void OnMessage(object sender, SecsMessage e)
  17.     {
  18.         // 在这里写统一逻辑,比如触发事件、写日志日志、发送通知
  19.     }
  20.     public Task SendRemoteCommand(string cmd, params string[] args)
  21.     {
  22.         var msg = new SecsMessage(2, 41, true,
  23.             Item.L(
  24.                 Item.A(cmd),
  25.                 Item.L(args.Select(Item.A).ToArray())
  26.             )
  27.         );
  28.         return _gem.SendAsync(msg);
  29.     }
  30. }
复制代码
如许你以后只必要 new SecsHostService(),就能封装整个主机控制逻辑。

第三讲 · 小结

你已经把握了怎样:

  • 完整搭建一个主机端最小步调;
  • 与装备创建通讯、注册事故、收发指令;
  • 监听 S6F11 上报、剖析 CEID 内容;
  • 把逻辑封装成类,集成进自己的体系或工具。

下一讲会带你进入一个口试中常常被问的地区:
第四讲:SECS 报文结构到底长什么样?怎么读懂一条复杂的 SML?
我们会讲 Item 的层级结构、SML 报文格式、VID 变量的剖析逻辑,真正走到“看得懂、改得动”的水平。
只需你一句“继承”,咱们马上出发。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表