首页 > 编程语言 >DL/T645-2007 通信库(C#版本)

DL/T645-2007 通信库(C#版本)

时间:2024-09-13 09:14:10浏览次数:1  
标签:DL 01 C# dl645Master 00 T645 new byte

DL/T645-2007 通信库(C#版本)

目录

DL/T645-2007 介绍

DL/T 645-2007 是中国电力行业关于电子式电能表通信协议的标准。该标准规定了电子式电能表和主站之间的数据通信格式和规程,是电力系统中电子式电能表(尤其是低压电能表)与外部设备(如抄表系统、数据采集器等)进行数据交换的基础协议。

主要内容介绍:

  1. 适用范围:DL/T 645-2007 适用于单相和三相电子式电能表,定义了电能表与数据采集系统或终端设备之间的通信规程,涵盖了低压配电系统中的电能表通信。

  2. 通信接口:标准定义了电能表与主站设备之间的通信接口,一般采用 RS485 通信方式,并兼容光电隔离接口。数据的物理传输可以通过无线、红外或者电力线载波进行。

  3. 数据格式:标准规定了数据传输的基本帧格式,包括数据域的长度、功能码、地址码、校验码等字段的格式和含义。它采用的是以帧为单位的通信协议,通信帧包括了帧头、帧长、地址、控制码、数据域、校验码等部分。

  4. 通信规程

    • 帧结构:DL/T 645-2007 的通信帧结构由传输方向、地址域、控制码、数据长度、数据域和校验码等组成。
    • 控制码:控制码决定了通信的方向和命令类型,包括数据读写、校时、费率设置等功能。
    • 地址码:电能表的地址码唯一标识了每个电能表,通常采用设备的编号。
    • 数据域:该部分包含具体的数据内容,长度可变。数据域的具体内容根据不同的功能码有所不同。
  5. 功能:DL/T 645-2007 提供了丰富的功能,涵盖了电能表的数据采集、时间同步、事件记录等操作。例如:

    • 读电能数据:主站可以通过发送读取命令来获取电能表的实时电量数据。
    • 时钟同步:允许主站设备对电能表进行时间同步操作。
    • 参数设置:可以配置费率、通信参数等关键配置。
    • 事件记录:支持事件记录读取,如停电记录、过压或欠压事件等。
  6. 协议发展: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 标准的电能表。
  • 完整支持 DL/T645-2007 协议。
  • 同时与多个电能表通信。
  • 快速读取与写入数据,以表格形式展示,包含数据标识描述。
  • 支持读通信地址、写通信地址、广播校时、冻结命令、更改通信速率、修改密码、最大需量清零等。
  • 支持自定义命令。

接口展示

完整支持 DL/T645-2007 协议。

namespace DL645Master
{
    public interface IDL645Master
    {
        /// <summary>
        /// 读电能量
        /// </summary>
        string Read00(UInt32 di);

        /// <summary>
        /// 读最大需量及发生时间
        /// </summary>
        (string, string) Read01(UInt32 di);

        /// <summary>
        /// 读变量
        /// </summary>
        string Read02(UInt32 di);

        /// <summary>
        /// 读事件记录
        /// </summary>
        List<string> Read03(UInt32 di);

        /// <summary>
        /// 读参变量
        /// </summary>
        List<string> Read04(UInt32 di);

        /// <summary>
        /// 读冻结
        /// </summary>
        List<string> Read05(UInt32 di);

        /// <summary>
        /// 读负荷记录
        /// </summary>
        string Read06(UInt32 di);

        /// <summary>
        /// 写数据
        /// </summary>
        void Write(UInt32 di, byte[] bytes);

        /// <summary>
        /// 发送请求帧并读取应答帧
        /// </summary>
        byte[] CustomizeCommand(byte[] frame, bool readResponse = true);

        /// <summary>
        /// 读通信地址,返回:A5A4A3A2A1A0
        /// </summary>
        byte[] ReadAddress();

        /// <summary>
        /// 写通信地址
        /// <param name="address">A5A4A3A2A1A0</param>
        /// </summary>
        void WriteAddress(byte[] address);

        /// <summary>
        /// 广播校时
        /// <param name="dateTime">YYMMDDhhmmss,各占一个字节</param>
        /// </summary>
        void TimeCalibration(byte[] dateTime);

        /// <summary>
        /// 冻结命令
        /// </summary>
        /// <param name="address">A5A4A3A2A1A0</param>
        /// <param name="date">MMDDhhmm</param>
        void Freeze(byte[] address, byte[] date);

        /// <summary>
        /// 更改通信速率
        /// </summary>
        /// <param name="rate"></param>
        void ChangeCommunicationRate(CommunicationRate rate);

        /// <summary>
        /// 修改密码
        /// </summary>
        /// <param name="oldPassword">PAP0P1P2</param>
        /// <param name="newPassword">PAP0P1P2</param>
        void ChangePassword(byte[] oldPassword, byte[] newPassword);

        /// <summary>
        /// 最大需量清零
        /// </summary>
        void MaximumDemandReset();

        /// <summary>
        /// 电表清零
        /// </summary>
        void MeterReset();

        /// <summary>
        /// 事件清零
        /// <param name="di">DI3DI2DI1DI0</param>
        /// </summary>
        void EventReset(byte[] di);
    }
}

提供所有数据标识的完整定义,部分展示如下:

namespace DL645Master
{
    /// <summary>
    /// 表A.3 变量数据标识
    /// </summary>
    public static class DataIdentification02
    {
        public static readonly Dictionary<UInt32, Definition> 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});
            }
        }
    }
}

获取源代码

DL645MasterSimulator 调试软件使用本库进行开发,如需获取此库源代码,请联系:https://www.redisant.cn/dl645master/contact

标签:DL,01,C#,dl645Master,00,T645,new,byte
From: https://www.cnblogs.com/cj94/p/18411572

相关文章

  • PbootCMS模板禁止数字id方式访问栏目,如/1/
    在PbootCMS中,如果你希望禁止用户通过直接输入数字ID的方式访问栏目,比如通过URL /1/ 进行访问,可以采取以下几种策略来实现这一目标:1.修改URL规则1.1重写规则配置.htaccess文件:编辑网站根目录下的 .htaccess 文件,增加或修改URL重写规则,使得所有数字ID的访......
  • PbootCMS无缝sqlite数据库转mysql数据库
    将PbootCMS的SQLite数据库无缝转换为MySQL数据库,可以遵循以下步骤。请注意,这里所说的“无缝”转换是指尽可能减少数据丢失和格式错误,但仍然需要确保转换后的数据能够正常工作。以下是详细的转换步骤:1.导出SQLite数据库打开SQLiteStudio或类似工具:使用SQLiteStud......
  • PbootCMS模板自动清理runtime缓存
    runtime目录的作用runtime 目录位于PbootCMS的安装目录下,主要用于存储系统运行时产生的临时文件和缓存文件。这些文件包括但不限于:缓存文件日志文件临时文件随着时间的推移,runtime 目录中的文件会逐渐增多,占用大量磁盘空间。当文件过多时,会造成系统性能下降,甚至出现一......
  • PbootCMS网站备份及恢复(搬家同理)
    在网站运营过程中,备份是非常重要的,因为随时都可能遇到各种问题,如服务器故障、黑客攻击等,这些问题都可能导致网站数据的丢失。如果没有备份,这些数据将无法恢复,这对网站运营者来说是非常致命的。PbootCMS的备份与恢复方法1.备份方法进入后台管理:登录PbootCMS后台管理系统......
  • Pbootcms模板留言“提交成功”的提示语修改
    如果你想要修改PbootCMS模板中留言提交成功后的提示语,可以通过编辑相关控制器文件来实现。具体步骤如下:定位文件:找到 apps/home/controller/MessageController.php 文件。修改提示语:在该文件中找到处理留言提交成功的逻辑,并修改相应的提示语。具体步骤1.定位......
  • 未匹配到本域名()有效授权码,请到pbootcms官网获取
    对于新手第一次使用PbootCMS时,可能会遇到“未匹配到本域名()有效授权码”的提示。这是因为域名未授权导致的。即使是本地测试站也需要授权,除非是通过IP地址访问。以下是详细的填写授权码的步骤:步骤详解进入网站后台:在域名后面加上 admin.php 来访问后台,默认的后台入口......
  • pbootcms列表如何置顶文章,istop不生效怎么办?
    在PbootCMS中,如果你想让某些文章置顶显示,通常会使用 istop 字段来标记哪些文章应该被置顶。如果发现 istop 字段不生效,可以尝试以下几种方法来解决问题:方法一:检查模板标签确认你在模板文件中是否正确使用了置顶文章的标签。正确的标签应该是类似于下面这样的:phtml ......
  • C语言----使用链表实现的客户管理系统
    实现一个客户信息管理系统,功能包括添加客户、修改客户、删除客户、显示客户列表。学完了C语言和链表没事情干拿出来写一写,检测下学习成果#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructNode{intnum;charname[20];chargender;......
  • 解决PbootCMS上传文件大小限制
    你可以配置PHP和Web服务器以支持大文件上传。具体步骤如下:打开 php.ini 文件并配置基本参数:file_uploads=onupload_tmp_dir=/tmpupload_max_filesize=32Mpost_max_size=32M进一步配置其他参数:max_execution_time=600max_input_time=600memory_l......
  • PbootCMS英文站搜索页包屑中文修改
    通过修改 {pboot:position} 标签的参数,可以轻松地将面包屑中的中文文本修改为英文,并自定义分隔符和分割图标。具体步骤如下:打开模板文件:打开需要修改的模板文件,例如 search.php。找到面包屑标签:找到 {pboot:position} 标签。修改标签参数:修改分隔符:separato......