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 主机端程序》
那一讲会更实战,我们会一步步搭一个“小型主机”,来收发真正的事件和指令。

你来决定节奏!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值