详细解读电力DLT698.45-2017通信规约--正向有功总电能

news2024/11/23 16:48:49

建立连接请看这篇:详细解读DLT698.45-2017通信规约--预连接响应icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=MzA3NjAwMjQzMQ==&mid=2652026396&idx=1&sn=a0a17f005d23136c922a7c381ddb7e75&chksm=8481f30cb3f67a1a94e66db77e61fe73c22b1904fcdbb0144108e132b265e7b40073e59659a7&scene=21#wechat_redirect

DLT698-2017是面向对象的通信协议

说到面向对象你想到了什么?继承封装多态?

通信协议为什么要面向对象,咱们先回顾一下学校里老师教的,面向对象的好处:

-------易于理解,比较灵活,方便维护

-------可扩展、可重用

没错,面向对象编程确实易于理解,但是习惯了传统比较简洁的通信协议,面向对象的通信协议真的挺抽象不易于理解,封装好的对象还要转换成简洁的16进制字符串,这个过程挺痛苦。

这篇文章以集中器和主站通信为例,介绍怎么读取正向有功总电能

(怎么建立连接,去公众号看吧)

我们在用DLT645-2007规约的时候,想要读正向有功总电能直接根据对象标识(00010000)就可以了,非常简单快捷;但是在DLT698-2017里面,需要先找到 "电能量的接口类",然后根据类的定义读相关属性,每个属性根据索引ID来区分。

下面以电能量接口类为例,演示读取一个属性和多个属性

图片

GetRequestNormal 读取一个对象属性

先看完整请求报文

68 15 00 43 03 91 78 41 28 00 eb 64 05 01 00 00 10 04 00 00 0c cb 16

帧头:68 15 00 43 03 91 78 41 28 00 eb 64

68:起始符

15 00:长度21(不包含起始符和结束符)

43:控制域

    0100 0011

        01:传输方向位和启动标志位(客户机发起的请求)

        0:分帧标志(完整APDU)

        0:保留

        0:扰码标志(不加扰码)

        011:功能码(应用连接管理及数据交换服务)

03:服务器地址特征

    0000 0011

        00:地址类型(单地址)

        00:逻辑地址(0)

        0011:地址长度(4)

            (011不是3吗?仔细看文档0-15对应表示1-16)

91 78 41 28:服务器地址(28417891)

00:客户机地址

eb 64:帧头检验码

APDU部分:05 01 00 00 10 04 00 00

05:APDU的读请求

图片

01:然后找到GET-Request,请求读取一个对象属性

图片

然后,看GetRequestNormal的数据类型

图片

    00:PIID(优先级一般)

    00 10 04 00:OAD

图片

根据OAD的数据类型,其中对象标识OI占两个字节

图片

图片

    00 10:OI(电能量 总 正向有功 合相)

    04:属性标识及其特征

        0000 0100:

            0000:特征(0)

            0100:类属性,扩展精度总及费率电能量数组(4)

    00:属性内元素索引(整个属性全部内容)

00:无时间标签

0c cb:帧校验码

16:结束符

响应报文:

68 46 00 C3 03 91 78 41 28 00 06 2D 85 01 00 00 10 04 00 01 01 05 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 00 00 C3 52 16

忽略帧头,来看看APDU部分

85 01 00 00 10 04 00 01 01 05 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 00 00

85:十进制是133

图片

01:读取一个对象属性的响应

图片

图片

00:PIID(普通优先级,服务序号0)

00 10 04 00:OAD(和请求的一致)

01:读取结果(数据Data)

图片

01:数据类型 array

05:长度

15:数据类型(long64-unsigned,64位正整数,占8字节)

00 00 00 00 00 00 00 00:数值(0)

15 00 00 00 00 00 00 00 00:64位正整数,数值0

15 00 00 00 00 00 00 00 00:64位正整数,数值0

15 00 00 00 00 00 00 00 00:64位正整数,数值0

15 00 00 00 00 00 00 00 00:64位正整数,数值0

00:跟随上报信息域

00:时间标签域

GetRequestNormalList 读取若干个对象属性

我们要读电能量接口类中的五个属性

图片

先看完整请求报文

68 26 00 43 03 91 78 41 28 09 80 27 05 02 3e 05 00 10 01 00 00 10 02 00 00 10 03 00 00 10 04 00 00 10 05 00 00 14 be 16

帧头:68 26 00 43 03 91 78 41 28 09 80 27

68:起始符

26 00:长度38(不包含起始符和结束符)

43:控制域

    0100 0011

        01:传输方向位和启动标志位(客户机发起的请求)

        0:分帧标志(完整APDU)

        0:保留

        0:扰码标志(不加扰码)

        011:功能码(应用连接管理及数据交换服务)

03:服务器地址特征

    0000 0011

        00:地址类型(单地址)

        00:逻辑地址(0)

        0011:地址长度(4)   

91 78 41 28:服务器地址(28417891)

09:客户机地址

80 27:帧头检验码

APDU部分:

05 02 3e 05 00 10 01 00 00 10 02 00 00 10 03 00 00 10 04 00 00 10 05 00 00

05:读请求

02:读若干个对象属性

3e:PIID普通优先级,服务序号62

图片

05:Sequence Of 长度

00 10 01 00:正向有功总电能,对象属性1

00 10 02 00:正向有功总电能,对象属性2

00 10 03 00:正向有功总电能,对象属性3

00 10 04 00:正向有功总电能,对象属性4

00 10 05 00:正向有功总电能,对象属性5

00:无时间标签

帧尾

14 be:校验码 

16:结束符

响应报文

68 80 00 c3 03 91 78 41 28 09 6c 36 85 02 3e 05 00 10 01 00 01 09 02 00 10 00 10 02 00 01 01 05 06 00 00 00 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 00 00 10 03 00 01 59 fe 21 00 10 04 00 01 01 05 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 00 10 05 00 01 59 fc 21 00 00 d2 3f 16

帧头帧尾跳过,看APDU部分

85 02 3e 05 00 10 01 00 01 09 02 00 10 00 10 02 00 01 01 05 06 00 00 00 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 00 06 00 00 00 00 00 10 03 00 01 59 fe 21 00 10 04 00 01 01 05 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 00 10 05 00 01 59 fc 21 00 00

85:十进制是133,读取响应

02:读取若干个对象属性的响应

3e:PIID普通优先级,服务序号63

图片

从数据类型可看出,Sequence of a-ResultNormal,它的结果是由多个A-ResultNormal组成,意思就是每一个结果都是一个完整的A-ResultNormal;那我们再看一遍,表52

图片

05:长度(5)

第一个ResultNormal

    00 10 01 00:OAD正向有功总电能,对象属性1(逻辑名)

        01:读取结果(数据)

        09:类型9(octet-string,占1个字节)

        02:长度

        00 10:这两个字节是内容(逻辑名)

第二个ResultNormal

    00 10 02 00:正向有功总电能,对象属性2(总及费率电能量数组)

        01:读取结果(数据)

        01:数据类型 array

        05:长度

        06 00 00 00 00:类型6,数值0(总)

        06 00 00 00 00:类型6,数值0(费率1,尖)

        06 00 00 00 00:类型6,数值0(费率2,峰)

        06 00 00 00 00:类型6,数值0(费率3,平)

        06 00 00 00 00:类型6,数值0(费率4,谷)

第三个ResultNormal

    00 10 03 00:正向有功总电能,对象属性3(换算及单位)

        01:读取结果(数据)

        59:类型89(Scaler_Unit)

        FE:换算-2

        21:单位,看枚举定义表(kWh有功能量)

第四个ResultNormal

    00 10 04 00:正向有功总电能,对象属性4

        01:读取结果(数据)

        01:数据类型 array

        05:长度

        15 00 00 00 00 00 00 00 00:类型21,数值0

        15 00 00 00 00 00 00 00 00:类型21,数值0

        15 00 00 00 00 00 00 00 00:类型21,数值0

        15 00 00 00 00 00 00 00 00:类型21,数值0

        15 00 00 00 00 00 00 00 00:类型21,数值0

注意!属性4和属性2的区别,精度不同

第五个ResultNormal

    00 10 05 00:正向有功总电能,对象属性5

        01:读取结果(数据)

        59:类型89(Scaler_Unit)

        FC:换算-4

        21:单位,看枚举定义表(kWh有功能量)

00:无跟随上报信息域

00:无时间标签

那么,怎么通过集中器读电表数据呢

首先,读出集中器下面的所有电表地址(注意不是电表的地址,是电表配置在集中器的编号,比如0001)

然后可以根据对象标识 “6H 采集” 来读相关数据

参考文档中的实例:

主站召测集中器采集到的数据:召测5个电能表的2016-01-20 00:00:00日冻结正向有功电
能总及费率、日冻结反向有功电能总及费率


发送:05 03 04 60 12 03 00 05 07 E0 01 14 00 00 00 03 05 06 04 00 00 00 01 21 06 04 00 
00 00 01 22 06 04 00 00 00 01 23 06 04 00 00 00 01 24 06 04 00 00 00 01 25 05 00 40 01 02 00 
00 60 40 02 00 00 60 41 02 00 00 60 42 02 00 01 50 04 02 00 02 00 10 02 00 00 20 02 00 00


05 —— [5] GET-Request
03 —— [3] GetRequestRecord
04 —— PIID
60 12 03 00 —— OAD 
05 —— RSD,选择方法5
07 E0 01 14 00 00 00 —— 采集存储时间
03 —— 表计集合MS,一组用户地址 [3] SEQUENCE OF TSA
05 —— SEQUENCE OF TSA的个数=5
06 04 00 00 00 01 21 —— TSA1
06 04 00 00 00 01 22
06 04 00 00 00 01 23
06 04 00 00 00 01 24
06 04 00 00 00 01 25 —— TSA5
05 —— RCSD,SEQUENCE OF CSD个数=5
00 40 01 02 00 —— OAD1,通信地址
00 60 40 02 00 —— OAD2,采集启动时标
00 60 41 02 00 —— OAD3,采集成功时标
00 60 42 02 00 —— OAD4,采集存储时标
01 —— ROAD5
50 04 02 00 —— 日冻结
02 —— 关联对象属性描述符 SEQUENCE OF个数=2
00 10 02 00 —— 正向有功总及费率
00 20 02 00 —— 反向有功总及费率
00 —— 没有时间标签

这样的电力规约你受得了吗朋友们

有需求或交流讨论可加WX: xiaoyiyz

留个关注,更快接收消息推送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1293094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dtaidistance笔记:dtw_ndim (高维时间序列之间的DTW)

1 数据 第一个维度是sequence的index,每一行是多个元素(表示这一时刻的record) from dtaidistance.dtw_ndim import *s1 np.array([[0, 0],[0, 1],[2, 1],[0, 1],[0, 0]], dtypenp.double) s2 np.array([[0, 0],[2, 1],[0, 1],[0, .5],[0…

水果党flstudio用什么midi键盘?哪个版本的FL Studio更适合我

好消息!好消息!特大好消息! 水果党们!终于有属于自己的专用MIDI键盘啦! 万众期待的Novation FLKEY系列 正式出炉! 话有点多话,先分享一份干货,尽快下载 FL Studio 21 Win-安装包&…

搜索推荐技术-爱奇艺搜索引擎技术

一、爱奇艺的搜索引擎框架示意图 即通过召回系统,即基于文本匹配的matching system,得到大量视频资源的候选集,经过粗排和精排,最后返回给用户。重点在于召回模块和排序模块。 二、召回模块 召回模块比较重要的是基础相关性&am…

Unity Meta Quest 一体机开发(九):【手势追踪】通过录制抓取手势实现自定义抓取姿势

文章目录 📕教程说明📕录制前的准备📕第一种录制方法(Hand Grab Pose Tool 场景)⭐在运行模式中确认录制⭐保存录制的手势,将物体做成 Prefab⭐在编辑阶段调整抓取手势🔍Fingers Freedom&#x…

leetcode 622. 设计循环链表

这道题讲了两种方法,第一个代码是用数组实现的,第二个是用链表实现的,希望对你们有帮助 (最好在VS自己测试一遍,再放到 leetcode上哦) 下面的是主函数(作参考),静下心来…

第21章网络通信

Internet 提供了大量有用的信息,很少有人能在接触过Internet后拒绝它的诱惑。计算机网络实现了多台计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序借助于网络协议&#xff0c…

孩子都能学会的FPGA:第二十四课——用FPGA和格雷码实现异步FIFO

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门,作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿…

加载离线镜像包:在线镜像离线为tar包、tar离线镜像包加载并根据imageId打tag

第一步:在线环境压缩离线镜像: 需要两个文件,第一个是脚本文件image_offline_load.sh脚本,第二个是image_list.txt 按行 存放需要离线的镜像名称 ./image_offline_load.sh save image_list.txt output.tar第二步:在离…

Nginx 简单入门操作

前言:之前的文章有些过就不罗嗦了。 Nginx 基础内容 是什么? Nginx 是一个轻量级的 HTTP 服务器,采用事件驱动、异步非阻塞处理方式的服务器,它具有极好的 IO 性能,常用于 HTTP服务器(包含动静分离)、正向代理、反向代理、负载均衡 等等. Nginx 和 Node.js 在很多方…

Docker快速理解及简介

docker快速理解及简介 1.Docker为什么出现? 迁移一个项目时,运行文档、配置环境、运行环境、运行依赖包、操作系统发行版、内核等都需要重新安装配置,比较麻烦。 2.Docker是什么? Docker是基于Go语言实现的云开源项目。解决了运行…

Altium Designer实用系列(五)----整理并导出PCB的BOM表

一、引言 最近老师安排了一个小的任务,就是把我们项目的两个电路板BOM整合一下,要注明元器件的耐温、耐压、购买渠道等等内容。    一开始我觉得这工作内容太简单了,两分钟的事。但是当我实际开始干的时候,才发现,好…

【react】动态页面转换成html文件下载,解决样式问题

需求 今天遇到一个需求,挺恶心人的,将一个在线文档页面,可以导出成为html页面查看。 看到网上有使用fs模块,通过react的ReactDOMServer.renderToStaticMarkup将组件转成html字符串,输出文件了。 但是我尝试了&#x…

CodeSys学习笔记

文章目录 1.运动控制的两种方式1.1.SM3_CNC1.2.SM3_Robotics 2.两种运动控制方式的速度、加速度等参数的控制2.1.SM3_CNC2.2.SM3_Robotics 3.CNC的M指令的使用(实现)逻辑。4.SM3_Robotics中的坐标系5.SM3_Robotics如何实现插补并连续执行? 记…

【Linux】diff命令使用

diff命令 是一个用于比较两个文件或目录之间差异的命令。它可以显示两个文件之间的行级别差异,并以易于阅读的格式输出结果。 著者 由保罗艾格特、迈克海特尔、大卫海耶斯、理查德史泰尔曼和Len Tower撰写。 diff命令 -Linux手册页 语法 diff [选项] [文件1]…

设备间的指令通信

指令通信的概念 要进行设备和设备之间的交流就需要通过串口发送数据进行交流 而串口发送简单的数据只需要传输介质 但是要发送复杂的数据就需要介质和传输的规则了 三种应用场景 比如在上位机和mcu之间 通过上位机管理控制器 从而控制电池 单片机和单片机之间 用户输入数据到…

MySQl int(1)、int(20) 的区别到底在哪里

MySQl int(1)、int(20) 的区别到底在哪里 常思一二,便得自然… int(1)数据类型介绍 在MySQL中,INT(1) 是一种定义整数类型的数据字段,其中的数字表示显示宽度而不是存储范围。具体说,INT(1) 中的数字 1 表示显示宽度&#xff0…

VividTalk创新AI语音匹配图片技术:照片+语音=逼真说话视频!

VividTalk是一个由南京大学、阿里巴巴、字节跳动和南开大学共同开发的项目工具。它通过先进的音频到3D网格映射技术和网格到视频的转换技术,实现了高质量、逼真的音频驱动的说话头像视频生成。这一创新技术使得只需提供一张人物的静态照片和一段语音录音&#xff0c…

KeePass开源密码管理器

KeePass开源密码管理器 KeePass 是一款免费的开源密码管理器,KeePass 将密码存储为一个数据库,而这个数据库由一个主密码或密码文件锁住,也就是说我们只需要记住一个主密码,或使用一个密码文件,就可以解开这个数据库&a…

JavaSE基础50题:8. 获取一个数二进制序列中所有的偶数和奇数位,分别输出二进制序列。

概述 获取一个数二进制序列中所有的偶数和奇数位,分别输出二进制序列。 如:从右往左数 0111(如图) 偶数位:01 奇数位:11 代码 public static void main(String[] args) {Scanner scanner new Scanner(Sys…

动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数

一,最长回文串 1.题目 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1: 输入&…