转载:电网101、104规约解析(Java)_张二狗和苗翠花的博客-CSDN博客_iec101 java

1. 前言
最近在研究广东电网的101与104规约,也就是DL/T634.5101-2002和DL/T634.5104-2009。因为要做一个规约解析的软件(基于Android平台的),刚开始接触的也是一头雾水,因为没有接触过这方面的知识,所以就在网上搜索各种技术帖,大神经验什么的。

后来在网上找到了一个软件–IEC8705(报文翻译工具).exe,这个可以解析一些101(平衡式)的实例,效果图贴一下。

但有些还是解析不了,并且在网上也找不到他的源码,所以就很苦恼。也找到一些C++的源码,但是由于技术有限,我看不懂。下面就和大家来看看我写的这个简单的Java语言的规约解析。先贴一下效果图(我就在控制台简单演示一下,没有做可视化界面)。

GitHub地址:https://github.com/mujave/iec 欢迎star哦

2. Java版效果图
3. 规约详细解释
先看一下我总结的关于规约解析的几个图
101的规约总结

104规约总结

具体的104协议解释也可以参考 https://blog.csdn.net/wojiuguowei/article/details/79413142

4. 名词解释
这里所说的名词解释,并不是对一些名词的定义的解释,因为这不是我的专业领域,下面我主要针对报文所代表的名词在代码里怎样解释(解析)说一下。

控制域(平衡式)

在报文解析中,我就是按照图里面的取值方法对对应的字节进行取值,然后进行逻辑判断,将结果加到解析结果里面,由于后四位所代表的平衡链路功能码在这里是固定的,所以可以采取枚举或者反射(常量)的方式进行解析
地址域 (以104的信息体地址为例)
在规约中地址才用的低前高后(低位在前高位在后)的规则
例如:68 10 08 00 02 00 09 01 03 00 01 00 01 40 00 2B 02 00(黄色部分为信息体地址)

所以 这个信息体的地址为01 40 00 >> 0x004001=16385

3、时标CP56Time2a

 /*** 时标CP56Time2a解析** @param b 时标CP56Time2a(长度为7 的int数组)* @return 解析结果*/public static String TimeScale(int b[]) {StringBuilder result = new StringBuilder();int year = b[6] & 0x7F;int month = b[5] & 0x0F;int day = b[4] & 0x1F;int week = (b[4] & 0xE0) / 32;int hour = b[3] & 0x1F;int minute = b[2] & 0x3F;int second = (b[1] << 8) + b[0];result.append("时标CP56Time2a:20");result.append(year).append("-");result.append(String.format("%02d", month)).append("-");result.append(String.format("%02d", day)).append(",");result.append(hour).append(":").append(minute).append(":");result.append(second / 1000 + "." + second % 1000).append("\n");return result.toString();}

4、遥测量的解析
在101的遥测中定义到有三种类型的值,分别是归一化值,标度值,短浮点数,具体的定义大家可以参考“电力101/104规约中遥测量类型转换”,下面我说一下在Java中怎么解析这三种类型的值。直接上代码了。

public class Main {public static void main(String[] args) {Telemetry telemetry = new Telemetry();System.out.println(telemetry.Bytes2Float_NVA(0xa4, 0x6a));// 报文数据的为A4 6A(低位在前,高位在后) ,为0x6AA4System.out.println(telemetry.Bytes2Float_SVA(0xa4, 0x6a));// 报文数据的为A4 6A(低位在前,高位在后) ,为0x6AA4System.out.println(telemetry.Bytes2Float_IEEE754("3e0779a6"));//报文数据 A6 79 07 3E = 0x3e0779a6 = 0.1323(IEEE754 短浮点数)http://lostphp.com/hexconvert/}
}/*** 遥测量解析** @author zhangyu*/public class Telemetry {/*** 归一化值*/public static float Bytes2Float_NVA(int low, int high) {float fVal;int nva = (high << 8) + low;// 符号位1位,0为正数,1为负数,后面的为补码表示,// 正数的补码和原码相同不需要转换。对于负数,先取反码再加1得到补码的补码,就是原码了。int symbol = (high & 0x80);//符号位:0表示正数,1表示负数if (symbol == 0x80)fVal = -1 * (((nva ^ 0xffff) + 1) & 0x7fff);//  (nva ^ 0xffff) + 1 :补码的补码  ,取出后面的15位数据乘上-1得到值else fVal = nva;return fVal / 32767;//这里的32767值的是一个量纲,一般这个参数是主站和从站商定的}/*** 标度化值*/public static float Bytes2Float_SVA(int low, int high) {float fVal;int nva = (high << 8) + low;int symbol = (high & 0x80);//0表示正数,1表示负数if (symbol == 0x80)fVal = -1 * (((nva ^ 0xffff) + 1) & 0x7fff);else fVal = nva;return fVal;}/*** 短浮点数** @param data 从低位到高位按顺序* @return*/public static float Bytes2Float_IEEE754(String data) {return Float.intBitsToFloat(Integer.valueOf(data, 16));}
}

对于短浮点数的计算,在Java的文档里有这样的说明。

还有一些ASDU里的信息体的解析过程代码,有点多,就不一一贴出来了
代码已经发布到GitHub,需要的伙伴可以直接下载

5.104规约解析遇到的一些难题

  1. 报文类型的区分
    101报文区分定长和变长两种,而104规约都是变长的报文。但是对于104来说,其控制域决定了104报文分别属于三种类型(I帧S帧U帧)。所以在解析104到控制域的时候,是在解析104的第一个难题。我先说一下我自己的区分逻辑。

我是用控制域的第一字节去和3做位运算(因为和3做位运算就可以得到第一字节的D1/D0两位),从上面的图中我们可以看到,结果如果是1的话就是S格式,如果是3的话就是U格式,其他 的结果就是I格式的报文。
第二种方式是我在和一个网友交谈中得到的,他是运用奇数或者偶数来区分的,这里我列一个表格 ,这样的话如果第一个字节是偶数就是I帧,否则判断第三字节是0就是U帧。这样也可以区分报文的类型
但是我认为还是做位运算效率会更高,计算奇偶性还需要用到%这样的运算。

位运算的运用
在解析规约的时候,我一般都是运用的位运算(&),这样既可以提高程序的效率,也有助于理解。首先在规约的定义中有很多的一个字节中的不同位代表一个含义,这种时候就运用到了位运算,这样就可以直接将对应位的值提取出来,例如那可变结构限定词这个字节来举个例子。最高位的D7代表的是信息元素地址的连续性,其中0不连续1连续,所以我们只需要拿这个字节和128(0x80)做位运算就可以得到D7这一位,如果结果是10000000就说明是1连续。这个地方更直观一点的判断方法就是((B&0x80)>>7)==1?连续 : 不连续。

时标的解析

首先时标这里一共有7个字节,下面对这几个字节的含义以及解析方法做一下解释:

年(byte 7):这里只有后面的7位有效,但是第8位填充的是0,所以这一个字节直接转换形成int就可以了。
月(byte 6):同上
小时(byte 4):同上
分钟(byte 3):同上
日(byte 5[bit 1~5]):第五字节的后5位表示的是日,byte5 & 0x1F 就可以得到(0x1F = 0001 1111),例如第五字节是87(87 = 0x57 = 0101 0111),其中010指的是星期,10111指的是day。这里使用87 & 0x1F就可以得到23。使用87 & 0xE0就可以得到64,然后再用这个结果除以32就可以得到结果,如果说除以32不太理解的话,也可以用结果右移运算64>>5也可以得到结果 。
毫秒(byte 1 and byte 2):这个地方首先是低前高后的问题(这个为题不太明白的可以先翻一下下面的第四个问题),( byte 2 << 8 ) + byte 1 ,这个地方我用一个表格说明一下(例如第一字节是6E,第二字节是2A)。

低前高后的问题

这里讲一下低前高后的问题,拿这个104规约的信息对象地址举例。例如34 12 00这是原报文的字节,再具体解析的时候我们要把它转成0x001234=4660,其实这里和上面的毫秒的解析方式一样。、

————————————————
版权声明:本文为CSDN博主「张二狗和苗翠花」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ZhangYu971014/article/details/79841555

101、104规约解析相关推荐

  1. 时标CP56Time2a 时间格式转换 电网101、104规约解析(Java)

    电网101.104规约解析(Java) https://blog.csdn.net/ZhangYu971014/article/details/79841555?utm_medium=distribu ...

  2. 101/103/104规约应用典型问题例举【转】

    原文地址:http://hi.baidu.com/timse/blog/item/71cf1b46cefd49006b63e594.html 在近年的规约测试工作中,笔者曾遇到了一些应用方面的问题,这 ...

  3. 制作IEC101/104报文解析工具

    文章目录 准备 一.IEC101/104协议 二.制作解析工具步骤 1.建立协议族 2.建立协议 3.建立术语 4.建立报文块 5.建立报文解析规则 总结 准备 这里是基于<在线解析二进制报文& ...

  4. IEC104协议规约解析

    [转载自]<IEC104协议规约解析> 一.四遥信息体基地址范围 104调度规约有1997年和2002年两个版本,在流程上没有什么变化,02版只是在97版上扩展了遥测.遥信等信息体基体址, ...

  5. 104规约报文类型,和传送原因

    目录 104规约报文类型 在监控方向过程中信息 在控制方向的过程信息 传送原因 104规约报文类型 在监控方向过程中信息 遥信,遥测,SOE,KWH 1:单点信息 2:带短时标的单点信息 3:双点信息 ...

  6. IEC104 电力规约解析

    三遥:遥测.遥信.遥控 104规约是厂站与配网主站进行通讯的规约,以以太网为载体,服务模式是平衡传输. 基本架构与OSI模型对比如下图: 会话类型:发送/无应答(S1),发送/确认(S2),发送/响应 ...

  7. 电力信息采集的通用型通信规约解析系统研究与设计

    电力信息采集的通用型通信规约解析系统研究与设计 蒋湘涛 http://xueshu.baidu.com/s?wd=paperuri%3A%28a61890f7723743df132caf246fd0a ...

  8. java 104规约监听,获取数据,解析数据,电网104规约

    网上找了一大堆,终于找到可用的方法,特别记录一下 资源下载:打包加入jar包,可下载 一.引入包 <!-- 104协议 --> <dependency> <groupId ...

  9. java103 101 104 101_编写一个java程序将100,101,102,103,104,105这6个数以数组的形式写入到D:\\test.t...

    展开全部 你问的不明白,我在代码里给你写了,你自己看吧 import java.io.FileWriter; import java.io.IOException; import java.util. ...

  10. LeetCode简单题目(二叉树相关)(#100 #101 #104 #107 #108 #110 #111 #112)-8道

    leetcode题库中共有350道简单题目. 本文记录已解决的题目和代码. 本文中的序号是leetcode题目中的真实序号. 文章目录 100 相同的树 描述 代码 更好的解法 101 对称二叉树 描 ...

最新文章

  1. poj 1740 A New Stone Game 博弈
  2. 控制文件的多路复用技术
  3. Avahi DOS攻击broadcast-avahi-dos
  4. PLSQL_解析过程及硬解析和软解析的区别(案例)
  5. Coursera课程Python for everyone:chapter6
  6. asp.net与JAVASCRIPT函数的相互调用
  7. 真无线蓝牙耳机霸主之争:苹果AirPods和索尼WF-1000XM3怎么选?
  8. Web 能力分析工具 WCAT
  9. k8s apollo_AI增强的Apollo 16素材让您以4K登上月球
  10. 缺项级数的收敛域求解
  11. EasyUI的基本使用布局
  12. 共享一个免费2G全能空间
  13. 漫画:什么是架构师?
  14. 三大报再呼救市:A股估值到了崩溃边缘
  15. 洛谷P5149 会议座位
  16. python:分隔符
  17. tensorflow1运用模型断点续训、恢复图和进行预测
  18. 《打破思维的墙》读后感
  19. Qt:可视化UI设计
  20. Java斗地主界面实现_通过Java实现斗地主

热门文章

  1. 微信发红包-测试用例(全)
  2. WebEx Recorder 录屏软件
  3. 现代操作系统(原书第四版)课后题答案 —— 第二章 进程与线程
  4. Android串口调试工具ComAssistant下载
  5. svm图像分割matlab,python实现
  6. 2023南京审计大学计算机考研信息汇总
  7. 全网最全Selenium自动化测试相关资源汇总
  8. 使用 Electron 打印到 PDF
  9. HDU2030-汉字机内码
  10. 去哪儿APP设计总结