电力规约 - Snet Docs

PQDIF 协议驱动

包: Snet.PQDIF | 类: PQDIFOperate | 类型数量: 10

通过电力通讯规约(DLT698 / DLT645 / CJT188 / DTSU6606)提供与电表等设备的连接。

安装

dotnet add package Snet.PQDIF

快速入门

using Snet.PQDIF;

var op = await PQDIFOperate.InstanceAsync(new PQDIFData.Basics
{
    IpAddress = "127.0.0.1",
    Port = 6688
});

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

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

await op.DisposeAsync();

配置参数

参数 类型 默认值 说明
IpAddress string 127.0.0.1 服务器 IP 地址(IP 正则校验——非文件路径)
Port int 6688 通信端口
ConnectTimeOut int 1000 连接超时(毫秒)
ReceiveTimeOut int 1000 接收超时(毫秒)
Station int 1 站号(Modbus-RTU 电表)
StationStr string "1" 字符串站号(DLT698/DLT645/CJT188)
EnableCodeFE bool false 启用 0xFE 前缀字节(DLT645)
UseSecurityResquest bool true 使用安全加密请求(DLT698)
CA int 0 CA(安全上下文)值(DLT698)
DataFormat enum CDAB 数据转换字节序
AddressStartWithZero bool true 地址从零开始
IsStringReverse bool false 反转字符串字节
Crc16CheckEnable bool true 校验 CRC16(DLT645/DTSU6606)
StationCheckMatch bool true 校验响应站号
CheckDataId bool true 校验响应数据标识(DLT645/CJT188)
Password string 00000000 操作员密码(DLT645)
OpCode string 00000000 操作码(DLT645)
InstrumentType int 25 电表仪表类型(DLT698)
ProtocolType enum DLT698TcpNet 协议类型

支持类型

类型 说明
DLT698TcpNet DLT698 TCP 网络
DLT698 DLT698 串口
DLT698OverTcp DLT698 over TCP
DTSU6606Serial DTSU6606 串口
DLT645 DLT645 串口
DLT645OverTcp DLT645 over TCP
DLT645With1997 DLT645 1997 版本
DLT645With1997OverTcp DLT645 1997 版本 over TCP
CJT188 CJT188 串口
CJT188OverTcp CJT188 over TCP

用于电表抄读的电力通讯规约:DLT698、DLT645、CJT188 和 DTSU6606。

地址格式

抄表协议 — 地址即协议数据标识(DLT645 数据标识 / DLT698 / CJT188 / DTSU6606)。

区域 地址格式 示例
DLT645 数据标识 8 位十六进制(地址 + 数据标识) 02010100, 02010200
DLT645-1997 数据标识 4 位十六进制(2 字节数据标识) 0201
DLT698 (OAD) 8 位十六进制(4 字节 OAD) 02010100
CJT188 6 位十六进制(3 字节数据标识) 020101
DTSU6606 十进制 Modbus-RTU 寄存器号 1000, 102
注意

02010100 这种 8 位形式仅适用于 DLT698(4 字节 OAD)——CJT188 用 3 字节标识、DTSU6606 是十进制 Modbus-RTU 寄存器号。地址透传底层电表协议 — 无 Snet 层地址模型。数据标识表见 DLT645 / CJT188 标准。

支持的数据类型

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

数据类型 支持 说明
Bool ⚠️ 部分 DLT698 / DLT698OverTcp / DLT698TcpNet 与 Modbus-RTU 的 DTSU6606 支持;DLT645 / CJT188 无 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。PQDIFOperate 使用标签/符号寻址,未注册在自动组包注册表中,因此 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("读数", "02010100", DataType.Float)
});
await op.SubscribeAsync(subAddr);

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

支持操作

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

参见