概述
什么是 Snet?
Snet 是一个面向 .NET 的工业物联网连接框架。它将与 PLC、传感器、机器人和消息中间件通信的复杂性抽象为单一、一致的编程模型。
关键设计决策
| 决策 | 理由 |
|---|---|
| 异步优先 | 每个 I/O 方法都是异步的,支持 CancellationToken |
| 单例模型 | CoreUnify<O, D> 集中管理实例,最多 255 个并发对象 |
| 统一返回类型 | OperateResult 为每次调用封装状态、消息、运行时间和数据 |
| 事件驱动 | 3 对事件(同步 + 异步),用于数据、信息和语言传播 |
| 富地址模型 | Address -> AddressDetails -> AddressValue 管道,支持类型安全解析 |
三层架构
+--------------------------------------------------+
| 插件层 |
| Modbus | Siemens | Mitsubishi | Omron | MQTT... |
+--------------------------------------------------+
| 核心层 |
| DaqAbstract | MqAbstract | CommunicationAbstract |
| CoreUnify | Channel | Cache | WebAPI | Events |
+--------------------------------------------------+
| 模型层 |
| IDaq | IMq | ICommunication | OperateResult |
| Address | EventDataResult | LanguageType |
+--------------------------------------------------+
第一层:模型层 (Snet.Model)
纯契约和数据结构。无实现,无 I/O。此层定义了:
- IDaq 中的 15 个接口 --
IOn、IOff、IRead、IWrite、ISubscribe、IGetStatus、IEvent、IGetParam、ICreateInstance、ILog、IWA、IGetObject、ILanguage、IDisposable - IMq 中的 12 个接口 --
IOn、IOff、IProducer、IConsumer、IGetStatus、IEvent、IGetParam、ICreateInstance、ILog、ILanguage、IDisposable、IAsyncDisposable - 数据模型 --
OperateResult、Address、AddressDetails、AddressValue、EventDataResult - 枚举 --
LanguageType(zh/en)、QualityType(-1 None 到 4 ParseError)、DataFormat(ABCD/CDAB/BADC/DCBA)
第二层:核心层 (Snet.Core)
实现接口的抽象基类。协议作者扩展这些基类:
CoreUnify<O, D>-- 单例管理、事件、日志、语言、参数反射DaqAbstract<O, D>-- DAQ 管道,包含 8 个抽象方法和 6 个内置 WebAPI 端点MqAbstract<O, D>-- 消息中间件基类CommunicationAbstract<O, D>-- 传输层基类- 通道、缓存、虚拟地址、字节转换、反射工具
第三层:插件层 (Snet.Modbus、Snet.Siemens 等)
具体协议实现。每个插件:
- 继承
DaqAbstract(用于 DAQ 协议)或MqAbstract(用于消息传递) - 实现抽象的异步方法
- 提供协议特定的
Data.Basics配置类 - 定义用于自动分配的
ProtocolType枚举
CoreUnify<O, D>
每个 Snet 操作类最终都继承自 CoreUnify<O, D>:
| 类型参数 | 含义 |
|---|---|
O |
操作类本身(例如 ModbusOperate) |
D |
数据/基础配置类(例如 ModbusData.Basics) |
CoreUnify 提供的能力:
- 单例生命周期 --
InstanceAsync()/Instance(),使用ConcurrentDictionary<D, O>存储 - 6 个事件 --
OnDataEvent/Async、OnInfoEvent/Async、OnLanguageEvent/Async - 时间跟踪 --
BegOperateAsync()/EndOperateAsync(),自动计算RunTime(毫秒) - 日志记录 -- 基于 Serilog,可配置输出和自定义通知回调
- 多语言 --
LanguageType.zh/LanguageType.en,通过SetLanguageAsync()切换 - 参数反射 --
GetParamAsync()返回类型化的参数元数据
OperateResult
每个 Snet 方法都返回 OperateResult:
public class OperateResult
{
public bool Status { get; set; } // 成功或失败
public string Message { get; set; } // 人类可读的消息
public int RunTime { get; set; } // 执行时间(毫秒)
public object? ResultData { get; set; } // 类型化的有效载荷
}
工厂方法:CreateSuccessResult("msg")、CreateSuccessResult<T>("msg", data)、CreateFailureResult("msg")。
支持的协议(35+)
DAQ:Siemens、Modbus、Mitsubishi、Omron、Allen-Bradley、OPC UA/DA、Delta、Keyence、Panasonic、Beckhoff、GE、Yaskawa、Inovance、Invt、MegMeet、Cimon、Fanuc、Fatek、Fuji、LSis、RKC、Toyota、Turck、Vigor、WeCon、XinJE、Yamatake、Yokogawa、YuDian、OrientalMotor、Kossi、PQDIF
中间件:MQTT、Kafka、RabbitMQ、NetMQ(ZeroMQ)、Netty
特殊:DB(数据库)、TEP(扩展)、Freedom Protocol、Sim(模拟)
