首页 > 编程语言 >C#解析DL/T645电力数据

C#解析DL/T645电力数据

时间:2024-07-09 16:30:51浏览次数:15  
标签:DL string C# Text value T645 int 地址 data

DL/T 645协议详细解析

DL/T 645是我国电力行业的标准,主要适用于电表与计算机之间的通讯。

帧格式

帧起始符 68H

标识一帧信息的开始,其值为 68H=01101000B

地址域 A0~A5

地址域由 6 个字节构成,每字节 2 位 BCD 码,地址长度可达12位十进制数。每块表具有唯一的通信地址,且与物理层信道无关。当使用的地址码长度不足 6 字节时,高位用“0”补足。通信地址999999999999H为广播地址,只针对特殊命令有效,如广播校时和广播冻结等。广播命令不要求从站应答。地址域支持缩位寻址,即从若干低位起,剩余高位补AAH作为通配符进行读表操作,从站应答帧的地址域返回实际通信地址。地址域传输时低字节在前,高字节在后

控制码 C

数据域长度 L

L 为数据域的字节数。读数据时 L≤200,写数据时 L≤50,L=0 表示无数据域。

数据域 DATA

数据域包括数据标识、密码、操作者代码、数据、帧序号等,其结构随控制码的功能而改变。传输时发送方按字节进行加 33H 处理,接收方按字节进行减 33H 处理。

校验码 CS

从第一个帧起始符开始到校验码之前的所有各字节的模 256 的和,即各字节二进制算术和,不计超过 256 的溢出值。

结束符 16H

645常用控制码与返回

控制码 含义 正常返回 异常返回
11 读数据 91 D1
1A 电表清零 9A DA
12 读后续数据 B2 D2
17 更改通讯速率 97 D7
16 冻结 96 D6
1B 事件清零(默认事件总清0) 9B DB
14 写数据 94 D4
1C 拉合闸 9C DC

示例解析:

当前指令是查询表地址777123000000的(当前)组合有功总电能

FEFEFEFE6877712300000068110433333333AD16

前置:fefefefe

起始符:68

地址域:777123000000

起始符:68

控制码:11

长度:04

数据域:33333333

校验码:ad

结束符:16

电表返回:

FEFEFEFE6877712300000068910833333333343333330D16

前置:fefefefe

起始符:68

地址域:777123000000

起始符:68

控制码返回:91 正常

长度:08

数据域:3333333334333333 其中数据表示为33333333 当前组合有功电能 值为 43333333 结果为:0.01

校验码:ad

结束符:16

.net简单封装一下解析

下面是主要的代码了

/// <summary>
/// 数据解析
/// </summary>
/// <param name="infos"></param>
public static Dlt645Analysis DL645Analysis(Span<byte> infos)
{
    Dlt645Analysis analysis = new Dlt645Analysis();
    Span<byte> data;
    //去除FE
    if (infos[0] == 254)
    {
        int codeIndexInfos = 1;
        data = infos.Slice(1);
        while (infos[codeIndexInfos] == 254)
        {
            data = data.Slice(1);
            codeIndexInfos++;
        }
    }
    else
    {
        data = infos;
    }
    string address = "";
    //解析地址域
    Span<byte> addressbyte = data.Slice(1, 6);
    foreach (var item in addressbyte)
    {
        address += item.ToString("x2");
    }
    analysis.Address = address;
    string type = data[8].ToString("x2").ToUpper();
    bool suncess = type switch
    {
        //读数据
        "91" => AnalysisRead(analysis, data, true),       
        _ => false
    };
    return analysis;
}
 

 

private void button1_Click(object sender, EventArgs e)
 {
     List<byte> list = new List<byte>();
     for (int i = 0; i < txt645.Text.Length; i = i + 2)
     {
         var value = txt645.Text.Substring(i, 2);
         list.Add((byte)(Convert.ToInt32(value, 16)));
     }
     var resultData = DL645Agreement.DL645Analysis(list.ToArray());
     if (!resultData.Sucess)
     {
         txtIsSucess.Text = "返回失败";
         return;
     }
     string infoType = resultData.Data.Substring(0, 8).ToUpper();//数据标识
     string infoData = resultData.Data.Substring(8);//数据值
     txtIsSucess.Text = "返回成功";
     txtLabel.Text = infoType;
     int length = Convert.ToInt32(txtLength.Text);
     int intLength = Convert.ToInt32(txtInt.Text);
     string[] spandata = new string[infoData.Length / 2];
     for (int i = 0, index = 0; i < infoData.Length; i = i + 2, index++)
     {
         spandata[index] = infoData.Substring(i, 2);
     }
     spandata = spandata.Reverse().ToArray();
     //数量
     int count = spandata.Length / (length / 2);
     string[] realinfo = new string[count];
     for (int i = 0; i < count; i++)
     {
         string value = "";
         for (int j = (length / 2) * i; j < (length / 2) * (i + 1); j++)
         {
             value += (Convert.ToInt32(spandata[j], 16) - 51).ToString("X2").PadLeft(2, '0');
         }
         if (length != intLength)
         {
             value = value.Insert(intLength, ".");
         }
         realinfo[i] = value;
     }
     txtAddress.Text = resultData.Address;
     txtData.Text = string.Join(",", realinfo);
 }

标签:DL,string,C#,Text,value,T645,int,地址,data
From: https://www.cnblogs.com/luomuwuh/p/18292223

相关文章

  • echarts折线图加一条目标值线
    文章目录一、echarts折线图加一条目标值线?二、使用步骤1.代码如下:2.示例图片总结一、echarts折线图加一条目标值线?在ECharts中添加一条目标值线(即一个固定值的水平线),可以使用markLine组件,以下是一个简单的例子,展示了如何在ECharts折线图中添加一条目标值线。......
  • uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据@getIndex点击事件获
    项目场景:uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据@getIndex点击事件获取点击的地区下标和地区名例如:问题描述官方给的文档有限,需要自己下载地图json数据然后自己渲染和编写鼠标悬浮显示内容以及获取点击地址名称,官方只给了@getIndex事件获取下......
  • 容器之docker compose
    DockerCompose是一个用于定义和运行多容器Docker应用的工具。通过一个YAML文件,您可以配置应用程序需要的所有服务,并使用单个命令来创建和启动这些服务。以下是对DockerCompose的详细介绍:核心概念服务(Services)服务是一个运行容器的抽象。每个服务都运行一个镜像,并且......
  • Jenkins 配置文件管理插件 Config File Provider
    我对Jenkins的使用,很早就脱离了创建普通job然后进行各种参数配置这样的使用方式,一直以来都在使用Pipeline多分支流水线基于Groovy脚本的方式来进行构建。程序化即是可通用化,将多个需要构建的工程统一标准进行抽象,形成统一的构建模型,然后编写groovy脚本形成Jenkinsfile来构......
  • CentOs去除桌面上边栏、隐藏桌面图标、修改桌面背景
    1:去除CentOs桌面上边栏:  修改/usr/share/gnome-shell/theme目录下gnome-classic.css                 修改/usr/share/gnome-shell/modes/目录下classic.json2:隐藏桌面图标:应用程序-》工具-》优化工具-》桌面,取消勾选的图标3:去除下边栏:cd /usr/......
  • 测试辅助工具(抓包工具)的使用5 之 Fiddler抓取手机包
    1.对PC(笔记本)参数进行配置(1)配置fiddler允许监听到https(fiddler默认只抓取http格式的)打开Fiddler菜单项Tools->TelerikFiddlerOptions->HTTPS,勾选CaptureHTTPSCONNECTs,点击Actions,勾选DecryptHTTPStrawic和Ignoreservercertificateerrors两项,点击OK(首次点击会......
  • Docker logs命令详解
    一、常用命令可以查看命令用法dockerlogs--help2.查看日志更多详情dockerlogs--detailsredis跟踪日志输出(–follow,-f)dockerlogs--followredisdockerlogs-fredis显示自时间戳以来的日志(–since)日期格式需要看下dockerlogs--help给出的样式d......
  • D661-4577C 液压系统阀门 穆格G45HOAA4VSX2HA
    穆格伺服阀(G45HOAA4VSX2HA)是一种电液比例阀,也被称为伺服阀。宁波秉圣现货供应MOOG-G45HOAA4VSX2HA-D661-4577C电液比例伺服阀。穆格伺服阀的工作原理是通过电磁线圈控制液压流体的流量和方向,从而实现对液压系统的精确控制。我仓库伺服阀现货型号如下:详情咨询可联系秉圣刘工......
  • Java socket 获取gps定位
    1.Javasocket获取gps定位的方法在Java中使用Socket来直接获取GPS定位信息并不直接可行,因为GPS数据通常不是通过Socket通信来获取的。GPS数据通常由设备(如智能手机、GPS接收器)上的GPS硬件模块生成,并通过操作系统或专门的GPS软件库来访问。然而,如果我们的目的是通过Socket从某个......
  • .net core部署linux下载文件 文件为中文下载
    在项目中,需要下载模板,某个文件夹下有excel文件或者word等 文件名为中文的时候在linux服务器下载不了  如果直接写路由的话在windows下是可以直接访问的,但是core部署在linux上所以会有些不同第一种:写一个接口使用流下载[httpget("download")]publicasyncTask<FileResult......