接口目录 - Snet Docs

Snet Framework 接口文档

最后更新: 2026-07-21 源码: Snet.Model/interface/ (26 个文件) 命名空间: Snet.Model.@interface


概览

Snet 框架定义了 26 个接口,分为两层:

层级 数量 角色
原子接口 21 单一职责契约(连接、发送、读取、写入、日志等)
复合接口 5 聚合契约,将原子接口组合为领域场景

Snet 中的每个具体驱动程序都通过五个复合接口之一进行操作。应用代码始终面向复合接口(如 IDaq)编程,而非原始驱动类型。


架构

                     IEvent (事件)
                    /    |    \
         ISubscribe  IConsumer  (所有复合接口)
                    \    |    /
                     
  ┌─────────────────── 原子接口层 ────────────────────┐
  │                                                      │
  │  IOn   IOff   ISend   ISendWait   ISendService       │
  │  ISendUdp   ISendWaitUdp   IRead   IWrite            │
  │  IGetStatus   IGetObject   IGetParam   ILog          │
  │  ILanguage   IWA   ICreateInstance   IRemove         │
  │                                                      │
  └──────────────┬──────────────┬──────────────┬─────────┘
                 │              │              │
  ┌──────────────▼──┐  ┌───────▼───────┐ ┌────▼──────────┐
  │ ICommunication  │  │ ICommService  │ │     IDaq      │
  │ (客户端通信)     │  │ (服务端通信)   │ │ (数据采集)     │
  │ 6 个驱动        │  │ 3 个驱动      │ │ 38+ 个驱动    │
  └─────────────────┘  └───────────────┘ └───────────────┘
                                                 │
                          ┌──────────────────────▼────────┐
                          │            IMq                │
                          │  (消息队列)                    │
                          │  5 个驱动                      │
                          └───────────────────────────────┘

  IOu : IDaq  ── OPC UA 扩展 (1 个驱动)

原子接口

以下展示所有方法签名。每个同步方法都有对应的 Async 变体,并带有可选的 CancellationToken


IOn

用途: 打开/连接通信通道。

public interface IOn
{
    OperateResult On();
    Task<OperateResult> OnAsync(CancellationToken token = default);
}
参数 描述
token 异步操作的取消令牌

示例:

IDaq plc = ...;
var result = plc.On();
if (result.IsSuccess)
    Console.WriteLine("PLC 已连接。");

IOff

用途: 关闭/断开连接。支持强制关闭标志,跳过状态验证。

public interface IOff
{
    OperateResult Off(bool hardClose = false);
    Task<OperateResult> OffAsync(bool hardClose = false, CancellationToken token = default);
}
参数 描述
hardClose true = 强制关闭,不验证内部状态
token 取消令牌

示例:

plc.Off(hardClose: true); // 立即强制断开

ISend

用途: 客户端发送原始字节数据。适用于 TCP 客户端、串口、WebSocket 客户端。

public interface ISend
{
    OperateResult Send(byte[] data);
    Task<OperateResult> SendAsync(byte[] data, CancellationToken token = default);
}

示例:

byte[] command = new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x01 };
ICommunication client = ...;
client.Send(command);

ISendWait

用途: 命令-应答模式。暂停后台数据监控,发送命令,捕获首次应答,然后恢复监控。

public interface ISendWait
{
    OperateResult SendWait(byte[] data, CancellationToken token);
    Task<OperateResult> SendWaitAsync(byte[] data, CancellationToken token);
}

行为: 关闭数据监控 -> 发送数据 -> 等待一次响应 -> 返回数据 -> 恢复数据监控。

示例:

var cts = new CancellationTokenSource(5000); // 5秒超时
OperateResult reply = client.SendWait(command, cts.Token);
byte[] responseData = reply.Content as byte[];

ISendService

用途: 服务端向已连接客户端发送数据。支持广播(null 地址)和单播(单个地址)。

public interface ISendService
{
    // 广播(address = null 时发送给全部客户端)
    OperateResult Send(byte[] data, string[]? address = null);
    Task<OperateResult> SendAsync(byte[] data, string[]? address = null, CancellationToken token = default);

    // 向单个地址单播
    OperateResult Send(byte[] data, string address);
    Task<OperateResult> SendAsync(byte[] data, string address, CancellationToken token = default);
}

示例:

ICommunicationService server = ...;
server.Send(data);                             // 群发所有客户端
server.Send(data, "192.168.1.100:502");        // 单播
server.Send(data, new[] { "addr1", "addr2" }); // 组播

ISendUdp

用途: UDP 专用发送,需要显式指定 IPEndPoint 目标。开启广播模式时,null 端点默认发送至 255.255.255.255

public interface ISendUdp
{
    OperateResult Send(byte[] data, IPEndPoint iPEndPoint);
    Task<OperateResult> SendAsync(byte[] data, IPEndPoint iPEndPoint, CancellationToken token = default);
}

示例:

var endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.200"), 8000);
udpClient.Send(data, endpoint);

ISendWaitUdp

用途: UDP 命令-应答。与 ISendWait 相同的请求-回复语义,但基于 UDP 协议并需要目标端点。

public interface ISendWaitUdp
{
    OperateResult SendWait(byte[] data, IPEndPoint iPEndPoint, CancellationToken token);
    Task<OperateResult> SendWaitAsync(byte[] data, IPEndPoint iPEndPoint, CancellationToken token);
}

IRead

用途: 从设备地址读取数据。使用 Address 对象指定读取目标。

public interface IRead
{
    OperateResult Read(Address address);
    Task<OperateResult> ReadAsync(Address address, CancellationToken token = default);
}

示例:

var addr = new Address("D100", "D105"); // 读取 D100-D105
OperateResult result = plc.Read(addr);

IWrite

用途: 向设备地址写入数值。三种重载组支持不同的详细级别。

public interface IWrite
{
    // 重载 1: 键值对
    OperateResult Write(ConcurrentDictionary<string, object> values);
    Task<OperateResult> WriteAsync(ConcurrentDictionary<string, object> values, CancellationToken token = default);

    // 重载 2: 键值 + 编码类型元组
    OperateResult Write(ConcurrentDictionary<string, (object value, EncodingType? encodingType)> values);
    Task<OperateResult> WriteAsync(ConcurrentDictionary<string, (object value, EncodingType? encodingType)> values, CancellationToken token = default);

    // 重载 3: 完整 WriteModel 对象
    OperateResult Write(ConcurrentDictionary<string, WriteModel> values);
    Task<OperateResult> WriteAsync(ConcurrentDictionary<string, WriteModel> values, CancellationToken token = default);
}

示例:

var values = new ConcurrentDictionary<string, object>
{
    ["D100"] = 12345,
    ["D102"] = 3.14f
};
plc.Write(values);

ISubscribe

用途: 订阅地址变更通知。继承 IEvent,订阅者通过事件处理器接收数据。

public interface ISubscribe : IEvent
{
    OperateResult Subscribe(Address address);
    Task<OperateResult> SubscribeAsync(Address address, CancellationToken token = default);

    OperateResult UnSubscribe(Address address);
    Task<OperateResult> UnSubscribeAsync(Address address, CancellationToken token = default);
}

示例:

plc.OnDataEvent += (s, e) => Console.WriteLine($"数据: {e.Data}");
plc.Subscribe(new Address("D100"));
// ... 稍后 ...
plc.UnSubscribe(new Address("D100"));

IGetStatus

用途: 查询当前连接或操作状态。

public interface IGetStatus
{
    OperateResult GetStatus();
    Task<OperateResult> GetStatusAsync(CancellationToken token = default);
}

IGetObject

用途: 暴露底层通信对象(如原始 Socket、SerialPort),用于高级场景。

public interface IGetObject
{
    OperateResult GetBaseObject();
    Task<OperateResult> GetBaseObjectAsync(CancellationToken token = default);
}

示例:

OperateResult obj = client.GetBaseObject();
Socket rawSocket = obj.Content as Socket;

IGetParam

用途: 获取配置参数、基础数据和自动分配参数信息。

public interface IGetParam
{
    // 基础数据(实例化时传入的对象)
    OperateResult GetBasicsData();
    Task<OperateResult> GetBasicsDataAsync(CancellationToken token = default);

    // 参数(getBasicsParam: true=原始, false=重组后)
    OperateResult GetParam(bool getBasicsParam = false);
    Task<OperateResult> GetParamAsync(bool getBasicsParam = false, CancellationToken token = default);

    // 获取自动分配标识的属性值所对应参数集合
    OperateResult GetAutoAllocatingParam();
    Task<OperateResult> GetAutoAllocatingParamAsync(CancellationToken token = default);

    // 检查是否存在自动分配参数
    OperateResult ExistsAutoAllocatingParam();
    Task<OperateResult> ExistsAutoAllocatingParamAsync(CancellationToken token = default);
}
方法 描述
GetBasicsData 返回实例化时传入的原始 Basics 对象
GetParam(bool) true = 原始基础数据副本;false = 重组后的副本
GetAutoAllocatingParam 标记了 [AutoAllocatingTag] 特性的参数集合
ExistsAutoAllocatingParam 当前数据中是否存在 [AutoAllocatingTag] 特性

ICreateInstance

用途: 单例工厂。通过泛型参数或 JSON 字符串创建或重新配置实例。

public interface ICreateInstance
{
    OperateResult CreateInstance<T>(T param);
    Task<OperateResult> CreateInstanceAsync<T>(T param, CancellationToken token = default);

    OperateResult CreateInstance(string json);
    Task<OperateResult> CreateInstanceAsync(string json, CancellationToken token = default);
}

示例:

// 通过泛型参数创建
var basics = new Basics { Host = "192.168.1.10", Port = 502 };
ModbusOperate.Current.CreateInstance(basics);

// 通过 JSON 创建
ModbusOperate.Current.CreateInstance("{\"Host\":\"192.168.1.10\",\"Port\":502}");

IProducer

用途: 消息队列 -- 向主题生产/发布消息。

public interface IProducer
{
    // 字符串内容(可选编码)
    OperateResult Produce(string topic, string content, Encoding? encoding = null);
    Task<OperateResult> ProduceAsync(string topic, string content, Encoding? encoding = null, CancellationToken token = default);

    // 字节数组内容
    OperateResult Produce(string topic, byte[] content);
    Task<OperateResult> ProduceAsync(string topic, byte[] content, CancellationToken token = default);
}

示例:

IMq mq = MqttClientOperate.Current;
mq.Produce("sensors/temp", "{\"value\": 25.6}");
mq.Produce("sensors/raw", new byte[] { 0x01, 0x02, 0x03 });

IConsumer

用途: 消息队列 -- 消费/订阅主题消息。继承 IEvent 以接收数据通知。

public interface IConsumer : IEvent
{
    OperateResult Consume(string topic);
    Task<OperateResult> ConsumeAsync(string topic, CancellationToken token = default);

    OperateResult UnConsume(string topic);
    Task<OperateResult> UnConsumeAsync(string topic, CancellationToken token = default);
}

示例:

mq.OnDataEvent += (s, e) => ProcessMessage(e.Data);
mq.Consume("sensors/temp");
// ... 稍后 ...
mq.UnConsume("sensors/temp");

ILog

用途: 配置日志行为 -- 文件输出、控制台输出、外部回调通知。

public interface ILog
{
    // 重载 1: logOut + consoleOut
    OperateResult LogOperateSet(bool logOut = true, bool? consoleOut = null);
    Task<OperateResult> LogOperateSetAsync(bool logOut = true, bool? consoleOut = null, CancellationToken token = default);

    // 重载 2: + Action 回调(同步通知)
    OperateResult LogOperateSet(bool logOut = true, bool? consoleOut = null, Action<object, LogEventLevel, string?, Exception?>? notice = null);
    Task<OperateResult> LogOperateSetAsync(bool logOut = true, bool? consoleOut = null, Action<object, LogEventLevel, string?, Exception?>? notice = null, CancellationToken token = default);

    // 重载 3: + Func 回调(异步通知,常用于日志入库)
    OperateResult LogOperateSet(bool logOut = true, bool? consoleOut = null, Func<object, LogEventLevel, string?, Exception?, Task>? noticeAsync = null);
    Task<OperateResult> LogOperateSetAsync(bool logOut = true, bool? consoleOut = null, Func<object, LogEventLevel, string?, Exception?, Task>? noticeAsync = null, CancellationToken token = default);

    // 重载 4: LogModel 批量配置
    OperateResult LogOperateSet(LogModel logModel);
    Task<OperateResult> LogOperateSetAsync(LogModel logModel, CancellationToken token = default);

    // 读取当前日志配置
    OperateResult LogOperateGet();
    Task<OperateResult> LogOperateGetAsync(CancellationToken token = default);
}
参数 描述
logOut true = 开启本地文件日志;false = 关闭
consoleOut true/false/null = 开启/关闭/使用内部默认值
notice / noticeAsync 外部回调函数,用于自定义日志处理(如日志入库)
logModel 批量配置的 LogModel 对象

注意事项:

  • logOutfalse 时,consoleOut 不生效。
  • 最高优先级执行,确保全局覆盖。
  • Func 重载常用于异步数据库写入。

示例:

// 文件日志开,控制台开,转发到数据库
plc.LogOperateSet(
    logOut: true,
    consoleOut: true,
    noticeAsync: async (src, level, msg, ex, t) => await db.InsertLogAsync(msg)
);

IWA

用途: WebApi -- 启动/停止/查询数采器内置的 HTTP REST 端点。

public interface IWA
{
    OperateResult WAOn(WAModel wAModel);
    Task<OperateResult> WAOnAsync(WAModel wAModel, CancellationToken token = default);

    OperateResult WAOff();
    Task<OperateResult> WAOffAsync(CancellationToken token = default);

    OperateResult WAStatus();
    Task<OperateResult> WAStatusAsync(CancellationToken token = default);

    OperateResult WARequestExample();
    Task<OperateResult> WARequestExampleAsync(CancellationToken token = default);
}

WAModel 配置 IP 地址、端口和跨域策略。

示例:

var waConfig = new WAModel { Host = "localhost", Port = 8080 };
plc.WAOn(waConfig);                        // 启动 HTTP API
var examples = plc.WARequestExample();      // 获取请求示例

ILanguage

用途: 多语言支持。获取/设置当前语言,通过键解析本地化字符串。

public interface ILanguage
{
    // 语言资源属性(设置为自定义资源文件)
    LanguageModel LanguageOperate { get; set; }

    // 根据关键字获取当前语言环境下的键值
    string? GetLanguageValue(string key, LanguageModel languageModel);
    Task<string?> GetLanguageValueAsync(string key, LanguageModel languageModel, CancellationToken token = default);

    // 获取当前使用的语言
    LanguageType GetLanguage();
    Task<LanguageType> GetLanguageAsync(CancellationToken token = default);

    // 设置语言
    bool SetLanguage(LanguageType language);
    Task<bool> SetLanguageAsync(LanguageType language, CancellationToken token = default);
}
成员 描述
LanguageOperate 指向语言资源的属性。分配自定义 LanguageModel 以使用外部本地化。
GetLanguageValue(key, model) 通过键解析字符串。model 对外部资源必传;对内部操作传 null
GetLanguage() / SetLanguage(type) 查询或切换当前语言

示例:

plc.SetLanguage(LanguageType.Chinese);
string label = plc.GetLanguageValue("connection.success", null);

IRemove

用途: 服务端 -- 按地址强制断开指定客户端。

public interface IRemove
{
    OperateResult Remove(string[] address);
    Task<OperateResult> RemoveAsync(string[] address, CancellationToken token = default);
}

示例:

server.Remove(new[] { "192.168.1.50:502", "192.168.1.51:502" });

IEvent

用途: 复合接口共享的事件声明。三组事件对(同步 + 异步),涵盖数据、信息和语言。

public interface IEvent
{
    event EventHandler<EventDataResult> OnDataEvent;
    event EventHandlerAsync<EventDataResult> OnDataEventAsync;

    event EventHandler<EventInfoResult> OnInfoEvent;
    event EventHandlerAsync<EventInfoResult> OnInfoEventAsync;

    event EventHandler<EventLanguageResult> OnLanguageEvent;
    event EventHandlerAsync<EventLanguageResult> OnLanguageEventAsync;
}
事件 负载 触发时机
OnDataEvent / OnDataEventAsync EventDataResult 数据接收、读取或消费时
OnInfoEvent / OnInfoEventAsync EventInfoResult 状态变更、信息性消息
OnLanguageEvent / OnLanguageEventAsync EventLanguageResult 运行时语言切换

复合接口

复合接口将原子接口组合为特定领域的契约。应用代码始终面向复合接口编程,而非具体驱动类。


ICommunication

用途: 客户端通信 -- TCP 客户端、串口、WebSocket 客户端、UDP 单播/组播/广播。

继承: IOn IOff ISend ISendWait IGetObject IGetStatus IEvent ICreateInstance ILog IGetParam ILanguage IDisposable IAsyncDisposable

public interface ICommunication : IOn, IOff, ISend, ISendWait,
    IGetObject, IGetStatus, IEvent, ICreateInstance, ILog,
    IGetParam, ILanguage, IDisposable, IAsyncDisposable { }

实现 (6 个驱动,通过 CommunicationAbstract<,>):

协议
TcpClientOperate TCP 客户端
SerialOperate 串口 (RS-232/485)
WsClientOperate WebSocket 客户端
UdpClientOperate UDP 单播客户端
UdpMulticastOperate UDP 组播
UdpBroadcastOperate UDP 广播

示例:

ICommunication client = TcpClientOperate.Current;
client.CreateInstance(new Basics { Host = "192.168.1.100", Port = 502 });
client.On();
client.Send(new byte[] { 0x01, 0x02 });
client.Off();

ICommunicationService

用途: 服务端通信 -- TCP 服务器、WebSocket 服务器、UDP 服务。

继承: IOn IOff ISendService IGetObject IGetStatus IRemove IEvent ICreateInstance ILog ILanguage IDisposable IAsyncDisposable

public interface ICommunicationService : IOn, IOff, ISendService,
    IGetObject, IGetStatus, IRemove, IEvent, ICreateInstance,
    ILog, ILanguage, IDisposable, IAsyncDisposable { }

ICommunication 的关键区别: 使用 ISendService(服务端发送)替代 ISend/ISendWait,并增加 IRemove 以断开客户端连接。

实现 (3 个驱动,通过 CommunicationServiceAbstract<,>):

协议
TcpServiceOperate TCP 服务器
WsServiceOperate WebSocket 服务器
UdpServiceOperate UDP 服务

示例:

ICommunicationService server = TcpServiceOperate.Current;
server.CreateInstance(new Basics { Host = "0.0.0.0", Port = 502 });
server.On();
server.Send(data);                 // 广播所有客户端
server.Send(data, "client1");      // 向单个客户端发送
server.Remove(new[] { "client1" }); // 踢出客户端

IDaq

用途: 数据采集 (DAQ) -- 所有 PLC、传感器和数据库驱动的通用接口。

继承: IOn IOff IRead IWrite ISubscribe IGetStatus IEvent IGetParam ICreateInstance ILog IWA IGetObject ILanguage IDisposable IAsyncDisposable

public interface IDaq : IOn, IOff, IRead, IWrite, ISubscribe,
    IGetStatus, IEvent, IGetParam, ICreateInstance, ILog,
    IWA, IGetObject, ILanguage, IDisposable, IAsyncDisposable { }

实现 (38+ 个驱动,通过 DaqAbstract<,>):

类别 驱动
PLC 西门子、三菱、欧姆龙、AllenBradley、倍福、基恩士、台达、汇川、松下、Fatek、富士、GE、LSis、Modbus、Vigor、信捷、威纶、Cimon、横河、安川、Yamatake、丰田、Fanuc、Turck、Freedom、英威腾、Kossi、MegMeet、RKC、东方马达、宇电
OPC OpcDaClientOperate, OpcDaHttpOperate
数据库 DBOperate
测试 PerformanceTestingOperate, SimOperate
协议 PQDIF
TEP TepMasterOperate

示例:

IDaq plc = SiemensOperate.Current;
plc.CreateInstance(new Basics { Host = "192.168.1.10" });
plc.On();
OperateResult result = plc.Read(new Address("DB1.DBD0", "DB1.DBD4"));
plc.Off();

IMq

用途: 消息队列 -- 通过 MQTT、Kafka、RabbitMQ、NetMQ、Netty 进行发布/订阅消息。

继承: IOn IOff IProducer IConsumer IGetStatus IEvent IGetParam ICreateInstance ILog ILanguage IDisposable IAsyncDisposable

public interface IMq : IOn, IOff, IProducer, IConsumer,
    IGetStatus, IEvent, IGetParam, ICreateInstance, ILog,
    ILanguage, IDisposable, IAsyncDisposable { }

实现 (5 个驱动,通过 MqAbstract<,>):

中间件
MqttClientOperate MQTT
KafkaOperate Apache Kafka
RabbitMQOperate RabbitMQ
NetMQOperate NetMQ (.NET 版 ZeroMQ)
NettyClientOperate Netty

示例:

IMq mq = MqttClientOperate.Current;
mq.CreateInstance(new Basics { Host = "broker.emqx.io", Port = 1883 });
mq.On();
mq.Consume("device/+/data");
mq.OnDataEvent += (s, e) => Console.WriteLine(e.Data);
mq.Produce("device/status", "online");

IOu : IDaq

用途: OPC UA 扩展。在完整的 IDaq 基础上增加 OPC UA 专属操作。

继承: IDaq(及其传递包含的所有接口)

public interface IOu : IDaq
{
    // 获取当前服务 NodeId
    object? GetNodeID();

    // 浏览指定节点下的子节点
    Task<object> GetAllNode(object nodeId);

    // 获取树节点的图标类型
    Task<string> GetNodeIconType(object target, object sourceId);

    // 详细批量读取节点数据
    object DetailedReadAllNodeData(object nodeIds);

    // 获取访问级别字符串
    string GetAccessLevel(object value);

    // 将 OPC UA BuiltInType 转换为 Snet DataType 枚举
    DataType TypeConvert(object builtInType);

    // 获取指定节点的 BuiltInType
    object GetNodeValueType(object nodeId);
}
方法 返回值 描述
GetNodeID() object? (NodeId) 服务的根节点 NodeId
GetAllNode(nodeId) Task<object> (ReferenceDescriptionCollection) 浏览节点的子节点
GetNodeIconType(target, sourceId) Task<string> 树视图图标标识
DetailedReadAllNodeData(nodeIds) object (DataValue[]) 批量读取完整元数据
GetAccessLevel(value) string 可读的访问级别
TypeConvert(builtInType) DataType 将 OPC BuiltInType 映射为框架 DataType
GetNodeValueType(nodeId) object (BuiltInType) 解析节点的类型

实现 (1 个驱动):

协议
OpcUaClientOperate OPC UA 客户端

注意: OpcUaClientOperate 继承 DaqAbstract<,> 并额外实现 IOu,使其拥有标准 DAQ 功能加上 OPC UA 专属方法。

示例:

IOu opcua = OpcUaClientOperate.Current;
opcua.On();
object? rootNode = opcua.GetNodeID();
object children = await opcua.GetAllNode(rootNode);
DataType dt = opcua.TypeConvert(someBuiltInType);

注意事项: 当点位过多时,可能存在读取不到的情况。


实现映射表

Snet.Model/interface/                          Snet.Core/abstract/
┌──────────────────────────┐                   ┌─────────────────────────────┐
│ ICommunication (接口)     │─────────────────>│ CommunicationAbstract<O,D>   │
│ ICommunicationService     │─────────────────>│ CommunicationServiceAbstract │
│ IDaq                      │─────────────────>│ DaqAbstract<O,D>            │
│ IMq                       │─────────────────>│ MqAbstract<O,D>             │
│ IOu : IDaq                │─────────────────>│ (OpcUaClientOperate)        │
└──────────────────────────┘                   └──────────┬──────────────────┘
                                                          │
                                     ┌────────────────────┼────────────────────────┐
                                     │                    │                         │
                              Snet.Core/            Snet.* (38 个驱动)       Snet.(MQ 驱动)
                          ┌──────────────┐     ┌─────────────────────┐     ┌──────────────────┐
                          │ TcpClient    │     │ SiemensOperate      │     │ MqttClientOperate│
                          │ Serial       │     │ MitsubishiOperate   │     │ KafkaOperate     │
                          │ WsClient     │     │ OmronOperate        │     │ RabbitMQOperate  │
                          │ UdpClient    │     │ ... 34 个以上 ...    │     │ NetMQOperate     │
                          │ UdpMulticast │     │ DBOperate           │     │ NettyClientOperate│
                          │ UdpBroadcast │     └─────────────────────┘     └──────────────────┘
                          │ TcpService   │
                          │ WsService    │
                          │ UdpService   │
                          └──────────────┘

速查表

原子接口 -> 复合接口映射

原子接口 ICommunication ICommunicationService IDaq IMq
IOn X X X X
IOff X X X X
ISend X
ISendWait X
ISendService X
ISendUdp
ISendWaitUdp
IRead X
IWrite X
ISubscribe X
IGetStatus X X X X
IGetObject X X X
IGetParam X X X
ICreateInstance X X X X
IProducer X
IConsumer X
ILog X X X X
IWA X
ILanguage X X X X
IRemove X
IEvent X X X X

设计原则

  1. ISP (接口隔离): 原子接口精确地只有一项职责。
  2. 复合复用: 复合接口是纯聚合 -- 不添加新方法(IOu 除外,它扩展了 IDaq)。
  3. 单例访问: 所有驱动通过 .Current 静态属性访问。
  4. 异步优先: 每个同步方法都有带 CancellationToken 的异步对应方法。
  5. 统一结果: 每个操作都返回 OperateResult,以确保一致的错误处理。

相关文档