Aspdcs.Rtu.DLT645 1.3.3

dotnet add package Aspdcs.Rtu.DLT645 --version 1.3.3
                    
NuGet\Install-Package Aspdcs.Rtu.DLT645 -Version 1.3.3
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Aspdcs.Rtu.DLT645" Version="1.3.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Aspdcs.Rtu.DLT645" Version="1.3.3" />
                    
Directory.Packages.props
<PackageReference Include="Aspdcs.Rtu.DLT645" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Aspdcs.Rtu.DLT645 --version 1.3.3
                    
#r "nuget: Aspdcs.Rtu.DLT645, 1.3.3"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Aspdcs.Rtu.DLT645@1.3.3
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Aspdcs.Rtu.DLT645&version=1.3.3
                    
Install as a Cake Addin
#tool nuget:?package=Aspdcs.Rtu.DLT645&version=1.3.3
                    
Install as a Cake Tool

Aspdcs.Rtu.DLT645

NuGet License

生产就绪的 DLT645 电力仪表通信库,支持 DLT645-1997/2007 协议,兼容 .NET Standard 2.1+(建议 .NET 9+ 以获得高性能)

✨ 核心特性

  • 完整协议实现:数据域加解密 (±0x33)、BCD 解码、校验和验证
  • 零拷贝架构:基于 Span<byte> / Memory<byte> 性能优化
  • 智能响应:单播快速返回,广播自适应结束
  • 粘包处理:环形缓冲区 + 状态机,健壮可靠
  • 异步流式IAsyncEnumerable<T> 流式数据处理
  • 依赖注入:开箱即用的 DI 支持

快速开始

安装

dotnet add package Aspdcs.Rtu.DLT645

基础用法

using Aspdcs.Rtu.DLT645;
using Microsoft.Extensions.Logging;

// 创建日志工厂(可选)
var loggerFactory = LoggerFactory.Create(builder =>
    builder.AddConsole().SetMinimumLevel(LogLevel.Information));

// 1. 创建客户端(启用自动发现设备)
IDlt645Client client = ChannelOptions.CreateBuilder("MyChannel")
    .WithChannel("COM5")
    .WithLogger(loggerFactory)  // 可选:添加日志
    .WithAuto()                 // 可选:启用自动模式
    .Run();

// 或使用默认配置创建客户端
//var options = ChannelOptions.CreateDefaultBuilder()
//    .WithChannel("COM5")
//    .Build();

//var client = new Dlt645Client(options)
//    .ConnectAsync();

// 使用工厂创建客户端
//var factory = new Dlt645ClientFactory(loggerFactory);
//var client = factory.CreateDlt645Client();
//await client.ConnectAsync(options);

// 2. 广播发现设备地址
await foreach (var address in client.TryReadAddressAsync())
{
    Console.WriteLine($"发现设备地址: {address}");
}

// 3. 读取电能数据(默认读取正向有功总电能 0x00010000)
await foreach (var frame in client.ReadAsync("11-11-00-00-00-00"))
{
    Console.WriteLine($"接收数据: {frame}");
}

依赖注入

using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();
services.AddLogging(builder => builder.AddConsole());

// 注册 DLT645 客户端
services.AddDlt645Client(options =>
{
    options.Name = "Meter1";
    options.Channels.Add(new ComChannel("COM5", null));
    options.BaudRate = 2400;
    options.Parity = Parity.Even;
    options.Timeout = TimeSpan.FromSeconds(2);
});

var provider = services.BuildServiceProvider();
var client = provider.GetRequiredService<IDlt645Client>();

// 使用客户端读取数据
await foreach (var frame in client.ReadAsync("111100000000"))
{
    Console.WriteLine($"电表数据: {frame}");
}

批量读取

// 读取多个数据标识
var address = "111100000000";
var dataItems = new[]
{
    0x00010000,  // 正向有功总电能
    0x02010100,  // A 相电压
    0x02020100   // A 相电流
};

foreach (var dataId in dataItems)
{
    await foreach (var frame in client.ReadAsync(address, dataId))
    {
        Console.WriteLine($"数据标识 {dataId:X8}: {frame}");
    }
}

字符串地址格式

// 支持多种地址格式
var address1 = "11-11-00-00-00-00";  // 带分隔符
var address2 = "111100000000";        // 无分隔符(推荐)

// 读取指定数据标识
var dataId = 0x02010100;  // A 相电压
await foreach (var frame in client.ReadAsync(address1, dataId))
{
    Console.WriteLine($"A 相电压: {frame}");
}

// 读取多个数据标识
var dataItems = new[] { 0x00010000, 0x02010100, 0x02020100 };
foreach (var id in dataItems)
{
    await foreach (var frame in client.ReadAsync("111100000000", id))
    {
        Console.WriteLine($"数据标识 {id:X8}: {frame}");
    }
}

DLT645-1997 协议支持

using Aspdcs.Rtu.DLT645;
using Aspdcs.Rtu.DLT645.Extensions;

IDlt645Client client = ChannelOptions.CreateBuilder("MyChannel")
    .WithChannel("COM5")
    .WithAuto()
    .Run();

// 读取 1997 版电表总(正向有功)电量数据
await foreach (var frame in client.Read1997Async("111100000000"))
{
    Console.WriteLine($"1997 电量数据: {frame}");
}

// 根据控制码读取 1997 版电表日最大需量数据
await foreach (var frame in client.Read1997Async("111100000000", 0x11, 0x0001))
{
    Console.WriteLine($"日最大需量: {frame}");
}

协议支持

DLT645-1997

  • ✅ 读数据
  • ✅ 广播校时
  • ✅ 冻结数据读取
  • ⚠️ 写数据(部分支持) 2007 (主要)
功能 状态 说明
读数据 单地址/批量读取
读后续帧 分帧数据读取
广播读地址 自动设备发现
写数据 需密码和操作者代码
数据域加解密 ±0x33 自动处理
BCD 解码 支持小数位格式
厂家扩展 兼容非标准字段

生产就绪 ✅

  • ✅ 核心功能完备,可与真实电表通信
  • ✅ 零拷贝优化,性能提升 20-40%
  • ✅ 异步流式处理,资源高效
  • ⚠️ 需增加单元测试覆盖率

详细评估见 协议完成度文档

  • 写入功能需要更多测试和错误处理
  • 单元测试覆盖率较低
  • 多设备并发访问需要更多验证

示例项目

完整示性能特性

特性 说明 收益
零拷贝架构 Span<byte> / ArrayPool 性能提升 20-40%
智能响应 单播快速返回、广播自适应 响应速度提升 10x
异步流式 IAsyncEnumerable<T> 内存效率提升
粘包优化 环形缓冲区批量提取 CPU 效率提升

平台支持

平台 版本 说明
.NET Standard 2.1+ 兼容 .NET 3.0+,基础功能完整
.NET 6/7/8 推荐用于生产环境
.NET 9+ 推荐:零拷贝优化,性能最佳

串口库:RJCP.IO.Ports 3.0.4 / System.IO.Ports 4.7.0

示例项目

完整示例见 sample/Dlt645

路线图

  • 数据域 ±0x33 编解码
  • BCD 解码器
  • 智能响应结束机制
  • 零拷贝优化
  • 依赖注入支持
  • 单元测试覆盖率 >70%
  • 日期时间解码器
  • 性能基准测试
  • API 文档完善

MIT License - 见 LICENSE 文件

贡献

欢迎提交 Issue 和 Pull Request!

支持

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.3.3 186 12/24/2025
1.3.2 181 12/24/2025
1.3.1 184 12/23/2025
1.2.0 173 12/22/2025
1.1.0-rc.4 213 12/19/2025