- Protocols - Tep - Snet Docs

TEP 协议驱动

包: Snet.TEP | 类: TepMasterOperate | 类型数量: 2(主/从角色)

通过 TEP(TCP 扩展插件)提供与第三方/非标数据采集软件的连接,是一种用于非标数据采集的可扩展 TCP 插件协议。

安装

dotnet add package Snet.TEP

快速入门

using Snet.TEP;

var op = await TepMasterOperate.InstanceAsync(new TepMasterData.Basics
{
    IpAddress = "192.168.1.100",
    Port = 6688
});

var address = new Address(new List<AddressDetails>
{
    new("读数", "snet.10001.D100", DataType.Float),
    new("读数2", "snet.10001.D101", DataType.Float)
});
var result = await op.ReadAsync(address);
if (result.Status)
{
    var data = result.GetSource<ConcurrentDictionary<string, AddressValue>>();
    foreach (var kv in data)
        Console.WriteLine($"{kv.Key} = {kv.Value.ResultValue}");
}
else
{
    Console.WriteLine($"读取失败: {result.Message}");
}

// 订阅之前 绑定数据事件
op.OnDataEventAsync += async (sender, e) =>
{
    if (e.Status)
    {
        var data = e.GetSource<ConcurrentDictionary<string, AddressValue>>();
        foreach (var kv in data)
            Console.WriteLine($"{kv.Key} = {kv.Value.ResultValue}");
    }
    else
    {
        Console.WriteLine($"{e.Message}");
    }
};

var subAddr = new Address(new List<AddressDetails>
{
    new("读数", "snet.10001.D100", DataType.Float)
});
await op.SubscribeAsync(subAddr);

// 后续:取消订阅
// await op.UnSubscribeAsync(subAddr);

await op.DisposeAsync();

配置参数

参数 类型 默认值 说明
SN string Guid.NewGuid().ToUpperNString() 唯一标识符
IpAddress string "127.0.0.1" 服务端监听 IP 地址(正则校验)
Port int 6688 服务端监听端口
MaxNumber int 1000 最大连接数
UserName string "shunnet" 用户名
Password string "shunnet" 密码
(继承自 SubscribeData.SCData HandleIntervalChangeOutAllOutTaskNumber

支持类型

类型 说明
TepMaster 主站(发起请求)
TepSlave 从站(响应请求)

TEP 采用主站/从站分离架构,分别使用 TepMasterOperateTepSlaveOperate 类。主站运行 TCP 服务端,可对"内部多个 TEP 客户端"进行多种数据类型读取写入,并支持数据订阅模式。

地址自动组包与解包

每个数采驱动都实现 IPacker。TepMasterOperate 使用标签/符号寻址,未注册在自动组包注册表中,因此 Packer 原样返回地址集合(透传)——见 IPacker 接口。支持字节偏移寻址的协议(如西门子 S7、Modbus、三菱 MC)可组包:地址自动组包

订阅

先绑定数据事件,再通过 SubscribeAsync 添加地址;数据通过 OnDataEventAsync 到达:

op.OnDataEventAsync += async (sender, e) =>
{
    if (e.Status)
    {
        var data = e.GetSource<ConcurrentDictionary<string, AddressValue>>();
        foreach (var kv in data)
            Console.WriteLine($"{kv.Key} = {kv.Value.ResultValue}");
    }
    else
    {
        Console.WriteLine($"订阅错误: {e.Message}");
    }
};

var subAddr = new Address(new List<AddressDetails>
{
    new("读数", "snet.10001.D100", DataType.Float)
});
await op.SubscribeAsync(subAddr);

// 后续:停止监视
// await op.UnSubscribeAsync(subAddr);

支持操作

操作 方法
连接 OnAsync()
断开 OffAsync()
读取 ReadAsync(address)
写入 WriteAsync(values)
订阅 SubscribeAsync(address)
组包 / 解包 PackerAsync(address, protocolTypeKey) / UnPackerAsync(data)

参见