台达 - Snet Docs

Delta 协议驱动

包: Snet.Delta | 类: DeltaOperate | 类型: 5

提供通过串行或以太网上的 Delta 专用协议连接台达 PLC(DVP、AS 系列)的能力。

安装

dotnet add package Snet.Delta

快速开始

using Snet.Delta;

var op = await DeltaOperate.InstanceAsync(new DeltaData.Basics
{
    IpAddress = "192.168.1.100",
    Port = 502
});

var address = new Address(new List<AddressDetails>
{
    new("读数", "D100", DataType.Int16),
    new("读数2", "D102", DataType.Int16)
});
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("读数", "D100", DataType.Int16)
});
await op.SubscribeAsync(subAddr);

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

await op.DisposeAsync();

配置

参数 类型 默认值 描述
IpAddress string 127.0.0.1 PLC IP 地址
Port int 6688 通信端口
ConnectTimeOut int 1000 连接超时(毫秒)
ReceiveTimeOut int 1000 接收超时(毫秒)
ProtocolType enum DeltaTcpNet 协议类型(默认 DeltaTcpNet)

支持的协议类型

类型 描述
DeltaTcpNet Delta 专用协议通过以太网 TCP(DVP/AS 系列)
DeltaSerial Delta 专用协议通过串行 RS-232/485
DeltaSerialOverTcp 通过 TCP 桥接的 Delta 串行协议
DeltaSerialAscii Delta ASCII 串行协议
DeltaSerialAsciiOverTcp 通过 TCP 桥接的 Delta ASCII 串行协议

地址格式

DVP 寻址 — DeltaDvpHelper 发送前将各地址转换为 Modbus 偏移:D → n+4096(n ≥ 4096 → n−4096+36864);位 M → n+2048(n ≥ 1536 → n−1536+45056);位 X → 八进制(n)+1024 并带 x=2; 功能码;位 Y → 八进制(n)+1280;T/C → n+1536 / n+3584(C ≥ 200 → n−200+3784)。

区域 地址格式 示例
数据寄存器 D{编号} D100, D4096
辅助继电器(位) M{编号} M0, M100, M1536
步进继电器 S{编号} S100, S5
输入 / 输出 X{编号} / Y{编号} (八进制) X17, Y2
定时器 / 计数器 T{编号} / C{编号} T50, C200
站号前缀(任意区域) s={站号};{地址} s=2;D100
注意

X/Y 为八进制;M 跨 1536、D 跨 4096 自动拆分读取。AS300 系列(DeltaSeries.AS)使用不同寻址。

支持的数据类型

所有读取按 AddressDetails.DataType 分发 — 别名(Short = Int16Float = SingleInt = Int32 等)共用同一分支。

数据类型 支持 说明
Bool 位读取 — 线圈 / 字内位
Int16 / Short, UInt16 / Ushort 16 位整数
Int32 / Int, UInt32 / Uint 32 位整数
Int64 / Long, UInt64 / Ulong 64 位整数
Float / Single, Double 32 / 64 位浮点
String / Char length + 编码读取
ByteArray + 全部 10 种 *Array length 的数组读取
Byte ReadAsync 中有 case 但无底层读取 — "不支持该类型读取"
注意

NoneDateDateTimeTimeReadAsync 中没有分支 — 不支持。

地址自动组包与解包

每个数采驱动都实现 IPacker。Delta 是 Modbus 变体——DeltaDvpHelper 将地址转换为 Modbus 偏移,PackerHandler 把所有协议类型映射到 Modbus 族,因此 PackerAsync 可将分散地址合并为最小批量读取。引擎细节:地址自动组包

订阅

先绑定数据事件,再通过 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("读数", "D100", DataType.Int16)
});
await op.SubscribeAsync(subAddr);

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

支持的操作

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

参见