概览 - Snet Docs

概述

什么是 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 个接口 -- IOnIOffIReadIWriteISubscribeIGetStatusIEventIGetParamICreateInstanceILogIWAIGetObjectILanguageIDisposable
  • IMq 中的 12 个接口 -- IOnIOffIProducerIConsumerIGetStatusIEventIGetParamICreateInstanceILogILanguageIDisposableIAsyncDisposable
  • 数据模型 -- OperateResultAddressAddressDetailsAddressValueEventDataResult
  • 枚举 -- 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.ModbusSnet.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/AsyncOnInfoEvent/AsyncOnLanguageEvent/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(模拟)