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 对象 |
注意事项:
- 当
logOut为false时,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 |
设计原则
- ISP (接口隔离): 原子接口精确地只有一项职责。
- 复合复用: 复合接口是纯聚合 -- 不添加新方法(
IOu除外,它扩展了IDaq)。 - 单例访问: 所有驱动通过
.Current静态属性访问。 - 异步优先: 每个同步方法都有带
CancellationToken的异步对应方法。 - 统一结果: 每个操作都返回
OperateResult,以确保一致的错误处理。
相关文档
- DaqAbstract 基类 | MqAbstract 基类 | CommunicationAbstract 基类 | CommunicationServiceAbstract 基类
- OperateResult | Address 模型 | 数据模型 | WAModel | LogModel
- 协议驱动概览 — 36+ DAQ 驱动 | 通信传输 — 6 个通信驱动 | 中间件概览 — 5 个 MQ 驱动
