- 作者:老汪软件技巧
- 发表时间:2024-09-14 04:00
- 浏览量:
DL/T645-2007 介绍
DL/T 645-2007 是中国电力行业关于电子式电能表通信协议的标准。该标准规定了电子式电能表和主站之间的数据通信格式和规程,是电力系统中电子式电能表(尤其是低压电能表)与外部设备(如抄表系统、数据采集器等)进行数据交换的基础协议。
主要内容介绍:
适用范围:DL/T 645-2007 适用于单相和三相电子式电能表,定义了电能表与数据采集系统或终端设备之间的通信规程,涵盖了低压配电系统中的电能表通信。
通信接口:标准定义了电能表与主站设备之间的通信接口,一般采用 RS485 通信方式,并兼容光电隔离接口。数据的物理传输可以通过无线、红外或者电力线载波进行。
数据格式:标准规定了数据传输的基本帧格式,包括数据域的长度、功能码、地址码、校验码等字段的格式和含义。它采用的是以帧为单位的通信协议,通信帧包括了帧头、帧长、地址、控制码、数据域、校验码等部分。
通信规程:
功能:DL/T 645-2007 提供了丰富的功能,涵盖了电能表的数据采集、时间同步、事件记录等操作。例如:
协议发展:DL/T 645-2007 是 DL/T 645 标准的改进版本,在此之前有 DL/T 645-1997。2007 版对数据格式、通信规程等方面进行了优化,提高了通信效率和兼容性。
应用场景:
DL/T 645-2007 广泛应用于电力系统中的远程抄表系统、负荷控制系统以及电能数据管理系统。它为各类电子式电能表与上位机(如抄表主站、数据采集器)之间的数据交互提供了标准化的接口和通信规程。
标准的意义:
DL/T 645-2007 通过统一的通信协议,解决了不同厂商电能表之间的互操作性问题,确保了电力系统内电子式电能表的通信标准化。这极大地提升了智能电网的自动化水平,降低了电能表数据采集的复杂度。
因此,DL/T 645-2007 是构建智能电网中数据采集与监控系统的重要标准之一,它促进了电力系统的智能化发展。
DL/T645-2007 通信库(C#版本)接口展示
完整支持 DL/T645-2007 协议。
namespace DL645Master
{
public interface IDL645Master
{
///
/// 读电能量
///
string Read00(UInt32 di);
///
/// 读最大需量及发生时间
///
(string, string) Read01(UInt32 di);
///
/// 读变量
///
string Read02(UInt32 di);
///
/// 读事件记录
///
List<string> Read03(UInt32 di);
///
/// 读参变量
///
List<string> Read04(UInt32 di);
///
/// 读冻结
///
List<string> Read05(UInt32 di);
///
/// 读负荷记录
///
string Read06(UInt32 di);
///
/// 写数据
///
void Write(UInt32 di, byte[] bytes);
///
/// 发送请求帧并读取应答帧
///
byte[] CustomizeCommand(byte[] frame, bool readResponse = true);
///
/// 读通信地址,返回:A5A4A3A2A1A0
///
byte[] ReadAddress();
///
/// 写通信地址
/// A5A4A3A2A1A0
///
void WriteAddress(byte[] address);
///
/// 广播校时
/// YYMMDDhhmmss,各占一个字节
///
void TimeCalibration(byte[] dateTime);
///
/// 冻结命令
///
/// A5A4A3A2A1A0
/// MMDDhhmm
void Freeze(byte[] address, byte[] date);
///
/// 更改通信速率
///
///
void ChangeCommunicationRate(CommunicationRate rate);
///
/// 修改密码
///
/// PAP0P1P2
/// PAP0P1P2
void ChangePassword(byte[] oldPassword, byte[] newPassword);
///
/// 最大需量清零
///
void MaximumDemandReset();
///
/// 电表清零
///
void MeterReset();
///
/// 事件清零
/// DI3DI2DI1DI0
///
void EventReset(byte[] di);
}
}
提供所有数据标识的完整定义,部分展示如下:
namespace DL645Master
{
///
/// 表A.3 变量数据标识
///
public static class DataIdentification02
{
public static readonly Dictionary Table = new Dictionary<uint, Definition>();
static DataIdentification02()
{
Table.Add(0x02_01_01_00, new Definition("XXX.X", "V", "A相电压"));
Table.Add(0x02_01_02_00, new Definition("XXX.X", "V", "B相电压"));
Table.Add(0x02_01_03_00, new Definition("XXX.X", "V", "C相电压"));
Table.Add(0x02_02_01_00, new Definition("XXX.XXX", "A", "A相电流"));
Table.Add(0x02_02_02_00, new Definition("XXX.XXX", "A", "B相电流"));
Table.Add(0x02_02_03_00, new Definition("XXX.XXX", "A", "C相电流"));
Table.Add(0x02_03_00_00, new Definition("XX.XXXX", "kW", "瞬时总有功功率"));
Table.Add(0x02_03_01_00, new Definition("XX.XXXX", "kW", "瞬时A相有功功率"));
Table.Add(0x02_03_02_00, new Definition("XX.XXXX", "kW", "瞬时B相有功功率"));
Table.Add(0x02_03_03_00, new Definition("XX.XXXX", "kW", "瞬时C相有功功率"));
Table.Add(0x02_04_00_00, new Definition("XX.XXXX", "kvar", "瞬时总无功功率"));
Table.Add(0x02_04_01_00, new Definition("XX.XXXX", "kvar", "瞬时A相无功功率"));
Table.Add(0x02_04_02_00, new Definition("XX.XXXX", "kvar", "瞬时B相无功功率"));
Table.Add(0x02_04_03_00, new Definition("XX.XXXX", "kvar", "瞬时C相无功功率"));
......
测试用例
using System.Collections.Generic;
using System.IO.Ports;
namespace DL645Master
{
public class DL645Test
{
public static void Main(string[] args)
{
SerialPort serialPort = new SerialPort("COM1");
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.Parity = Parity.Even;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.None;
serialPort.ReadTimeout = 3000;
serialPort.WriteTimeout = 3000;
serialPort.Open();
byte[] address = new byte[6] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
bool includeLeadingByte = true; //是否包含前导字节0xFE0xFE0xFE0xFE
byte[] user = null;
byte[] password = null;
Dl645Master dl645Master = Dl645Master.CreateMaster(serialPort, includeLeadingByte, address, user, password);
{
//读电能量
string value1 = dl645Master.Read00(0x00_00_00_00);
string value2 = dl645Master.Read00(0x00_01_00_00);
}
{
//读最大需量及发生时间
var (value1, format1) = dl645Master.Read01(0x01_01_00_00);
var (value2, format2) = dl645Master.Read01(0x01_02_00_00);
}
{
//读变量
string value1 = dl645Master.Read02(0x02_01_01_00);
string value2 = dl645Master.Read02(0x02_01_02_00);
}
{
//读事件记录
List<string> value1 = dl645Master.Read03(0x03_01_01_00);
List<string> value2 = dl645Master.Read03(0x03_01_02_00);
}
{
//读参变量
List<string> value1 = dl645Master.Read04(0x04_00_01_01);
List<string> value2 = dl645Master.Read04(0x04_00_01_02);
}
{
//读冻结
List<string> value1 = dl645Master.Read05(0x05_00_00_00);
List<string> value2 = dl645Master.Read05(0x05_00_01_00);
}
{
//读负荷记录
string value1 = dl645Master.Read06(0x06_00_00_00);
string value2 = dl645Master.Read06(0x06_00_00_01);
}
{
//读通信地址,返回:A5A4A3A2A1A0
byte[] slaveAddress = dl645Master.ReadAddress();
//写通讯地址
dl645Master.WriteAddress(slaveAddress);
//广播校时
dl645Master.TimeCalibration(new byte[] {24, 09, 13, 12, 33, 12});
//冻结命令
dl645Master.Freeze(slaveAddress, new byte[] {09, 13, 08, 34});
//更改通信速率
dl645Master.ChangeCommunicationRate(CommunicationRate.R4800);
//修改密码
dl645Master.ChangePassword(new byte[] {1, 2, 3, 4}, new byte[] {4, 3, 2, 1});
//最大需量清零
dl645Master.MaximumDemandReset();
//电表清零
dl645Master.MeterReset();
//事件清零
dl645Master.EventReset(new byte[] {0xff, 0xff, 0xff, 0xff});
}
}
}
}
获取源代码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:/