Secs/Gem第二讲 (基于secs4net项目的ChatGpt介绍)

好的,我们正式进入:


第二讲:深入 SECS4NET 项目结构——主机程序是怎么搭起来的?

关键词:项目结构、类图、通信类、事件处理、连接生命周期、异步机制


本讲目的

我们从源码入手,一步步搞懂:

  1. SECS4NET 主机(Host)是如何设计通信逻辑的
  2. 有哪些关键类,类之间的关系是什么
  3. 通信的生命周期怎么管理
  4. 怎么实现“接收消息”和“主动发送”的功能
  5. 如何集成到你自己的 EAP 或测试程序中

你将不再只是“调 Sample”,而是可以掌控它的主干脉络,甚至模仿它写出你自己的通信程序。


一、SECS4NET 项目的基本结构

这个项目结构很清晰,大致可以分成三大块:

1. 核心库部分

主要是以下几个类和命名空间:

类名 / 接口 功能描述
SecsGem 主控类,负责建立连接、发送接收消息,是你最常用的接口
SecsMessage 表示一条 SECS 报文
SecsItem 表示报文内部的数据结构(Item Tree)
SecsGemBuilder 构建 SecsGem 的工厂类,负责配置通信参数
HSMSConnectMode 枚举,指明是主机模式还是设备模式

这些类都在 Sec4net 命名空间中,是整个通信流程的核心。


2. 样例程序(SampleHost)

这是个完整的 WPF Demo,它通过 UI 来驱动 Host 端的连接、发命令、注册事件等。

你可以从 SampleHost 入手,理解 SECS4NET 是如何实际运作的:

  • 按钮绑定命令(Command)
  • App.xaml.cs 中初始化 Host
  • 有个 GemService 类作为核心逻辑封装

3. 工具与日志

比如:

  • MessageLogViewModel.cs:将 SECS 报文日志格式化输出
  • App.xaml:注册依赖注入,绑定服务层
  • Config 配置项:定义设备地址、端口、模式等参数

二、核心类分析:SecsGem

这是你最常打交道的类,我们来详细拆解一下它的几个核心接口和机制。


1. 初始化过程

var gem = new SecsGemBuilder()
    .UseHsms()
    .ConnectMode(HSMSConnectMode.Active) // 主机模式
    .DeviceId(0)
    .Host("127.0.0.1")  // 设备 IP
    .Port(5000)         // 设备端口
    .Build();

解释知识点:

  • .UseHsms() 表示使用 HSMS 协议(TCP 通信)
  • .ConnectMode() 设为 Active 就是主机,Passive 就是设备
  • .DeviceId() 是主机的设备编号
  • .Host().Port() 指的是连接目标设备的地址和端口
  • .Build() 返回一个 SecsGem 实例

2. 启动连接

await gem.ConnectAsync();

连接过程其实包括 TCP 建立、SECS 建链(S1F13/S1F14)、状态机启动等。

3. 监听接收到的报文

gem.MessageReceived += OnSecsMessageReceived;

你只要写一个回调函数:

private void OnSecsMessageReceived(object sender, SecsMessage e)
{
    if (e.Stream == 6 && e.Function == 11)
    {
        var ceid = e.SecsItem[0].GetValue<ushort>();
        Console.WriteLine($"收到事件:CEID = {ceid}");
    }
}

报文进来后你可以按 SML 结构解析,把报文打印出来或入库。


4. 发送消息

发送很简单,你只需要构造一个 SecsMessage,比如:

var msg = new SecsMessage(2, 41, true,
    Item.L(
        Item.A("START_PROCESS"),
        Item.L(Item.A("Lot123"), Item.A("Recipe1"))
    )
);
await gem.SendAsync(msg);

这里 2 是 Stream,41 是 Function,true 表示需要对方回应(W bit)。


5. 异步机制

整个 SECS4NET 框架基于 async/await 实现异步通信,这样你就不会阻塞主线程。

比如你在 WPF 程序中接收报文、发送命令,UI 不会卡顿。


6. 生命周期管理

在 SampleHost 项目中,一般是在 App.xaml.cs 启动时初始化 Gem 服务:

GemService.Instance.Init();

关闭时调用 DisconnectAsync(),并释放资源。


总结一句话:

SecsGem 就是你跟设备之间的“翻译官”,你通过它说话(Send),也通过它接收设备的回应(MessageReceived)。

你只需要:

  • 创建实例;
  • 连上设备;
  • 发出命令;
  • 处理回应。

这个封装非常适合你这种以业务逻辑为主的开发者。


我们先到这里告一段落。总结如下:


第二讲 · 小结

你已经掌握了:

  • SECS4NET 项目的整体结构;
  • 如何用 SecsGem 建立连接;
  • 如何发出报文;
  • 如何接收报文;
  • 如何用异步方式处理通信逻辑;
  • 如何把它嵌入你自己的程序框架中。

如果你觉得节奏 OK,就可以告诉我:“继续”,我们就进入《第三讲:如何从零构建一个 Host 主机端程序》
那一讲会更实战,我们会一步步搭一个“小型主机”,来收发真正的事件和指令。

你来决定节奏!

你可能感兴趣的:(Secs/Gem第二讲 (基于secs4net项目的ChatGpt介绍))