好的,我們正式進入:
第二講:深入 SECS4NET 項目結構——主機程序是怎么搭起來的?
關鍵詞:項目結構、類圖、通信類、事件處理、連接生命周期、異步機制
本講目的
我們從源碼入手,一步步搞懂:
- SECS4NET 主機(Host)是如何設計通信邏輯的
- 有哪些關鍵類,類之間的關系是什么
- 通信的生命周期怎么管理
- 怎么實現“接收消息”和“主動發送”的功能
- 如何集成到你自己的 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 主機端程序》
那一講會更實戰,我們會一步步搭一個“小型主機”,來收發真正的事件和指令。
你來決定節奏!