工信部网站备案查询步骤,html网页表格制作,网站域名过户,wordpress的PC端和移动端注#xff1a;本文为 “ IEC104 协议” 相关合辑。 未整理去重#xff0c;如有内容异常请看原文。 图片清晰度限于引文原状。 IEC 104 电力规约详细解读 (一) - 报文结构、报文分类、ASDU
张二狗和苗翠花已于 2024-04-23 08:08:13 修改
协议一般规则#xff1a; 平衡方式传…注本文为 “ IEC104 协议” 相关合辑。未整理去重如有内容异常请看原文。图片清晰度限于引文原状。IEC 104 电力规约详细解读 (一) - 报文结构、报文分类、ASDU张二狗和苗翠花已于 2024-04-23 08:08:13 修改协议一般规则平衡方式传输也就是说每一个过程的会话没有规定谁从头发起双方均可一般情况下配电主站作为 TCP 的客户端配电终端作为 TCP 的服务器TCP 的默认端口号是 2404一、报文结构APCI 应用规约控制信息ASDU 应用服务数据单元 (和 101 协议里定义一致)APDU 应用规约数据单元。启动字符 68H 定义了数据流中的起点APDU 的长度域定义了 APDU 体的长度它包括 APCI 的四个控制域八位位组和 ASDU。第一个被计数的八位位组是控制域的第一个八位位组最后一个被计数的八位位组是 ASDU 的最后一个八位位组。ASDU 的最大长度限制在 249 以内因为 APDU 域的最大长度是 253APDU 最大值 255 减去启动和长度八位位组控制域的长度是 4 个八位位组。控制域定义了确保报文不丢失和重复传送的控制信息也就是发送序列号和接收序列号报文传输启动 / 停止以及传输连接的监视等。控制域的计数器机制是根据 ITU-T X.25 标准中推荐的 2.3.2.2.1 至 2.3.2.2.5 来定义的二、报文分类APCI2.1 S 格式 (Numbered supervisory functions, 编号的监视功能格式)S 帧格式报文不用来传送信息只用来确认对方的发送序列号。比如双方可以按频率发送比如接收 8 帧 I 帧回答一帧 S 帧也可以要求接收 1 帧 I 帧就应答 1 帧 S 帧当然也可以不要求S 帧内容示例参考例 1。因为 S 帧回复确认的序列号在 byte3、byte4 两个字节并且 byte3 的 bit1 位置固定是 0所以在使用 S 帧回复确认时只需在接收报文的发送序列号 2 就可以参考例 2。举例 168 04 01 00 0A 00 (接收序列号 5) 举例 2 RECV: 68 FA 6C 67 84 00 0D 1E 03 00 01 00 E8 ... 省略 ... 6C 67 低前高后转换成 0x676C 再右移一位就是 0x33B6 最终发送序列号 10 进制也就是 13238 SEND: 68 04 01 00 6E 67 接受序列号 接收报文的发送序列号 1 13239 0x33B7 左移一位 0x676E 再低前高后转换 就是 6E 67 综上得出其实就是在接收来的报文的发送序列号的 byte1 的 bit2 位置上 1也就成了对应 10 进制上 22.2 U 格式 (Unnumbered control function, 不编号的控制功能格式)在同一时刻TESTFR, STOPDT 或 STARTDT 中只有一个功能可以被激活。所以 U 帧格式的控制欲第一个字节就只有 6 种情况分别是 0x83TESTER 确认0x43TESTER 命令0x23STOPDT 确认0x13STOPDT 命令0x0BSTART 确认0x07START 命令举例68 04 07 00 00 00 START 命令U 帧和 S 帧是没有 ASDU 的所以这两种类型的报文长度也就是 6 字节2.3 I 格式 (Information Transmit Format, 编号的信息传输格式)遥信、遥测、遥控、遥调、总召、对时等都需要使用 I 格式传送。举例后面几篇文章详细说三、I 格式帧的 ASDUASDU应用服务数据单元协议原文格式最好去 101 协议去看看会比较详细。104 和 101 是一样的类型标识符1 byte。解析来区分属于哪个过程。比如 0x01 单点遥信、0x0D 段浮点遥测可变结构限定词1byte。bit0-bit6 信息对象的个数 bit7: SQ 信息对象地址是否连续1 代表连续也就是信息对象 2 的地址就是信息对象 1 的地址 1信息对象 2 无需再给出它的地址0 代表不连续每个信息对象都必须给出自己的地址传送原因2byte。ASDU 公共地址。一般是一个变电站一个地址信息对象信息对象地址。也就是点表对应的点位遥测信息也就是测量点标号信息元素集。对应的值按照不同的类型标识去解析时标。CP56Time2a 格式 7byte限定词。按照报文类型确定有无限定词。总召唤限定词、复位进行限定词、初始化原因、品质描述词、设置命令限定词IEC 104 电力规约详细解读 (二) - 总召唤张二狗和苗翠花 已于 2024-04-23 08:09:51 修改1 功能简述总召唤功能是在初始化以后进行或者是定期进行总召唤以刷新主站的数据库。总召唤时请求子站传送所有的过程的变量实际值。定期进行总召唤的周期的是一个系统参数可以是 15 分钟或者更长的时间。总召唤的内容包括子站的遥信、遥测等信息。这些信息一般在上报的时候会用 SQ1 的地址连续的报文进行上报当然也可以不连续视情况而定。2 通信过程先由主站向子站发送总召唤命令帧子站收到后如果否定子站会送否定确认传输结束如果确认则子站回送总召唤确认帧子站连续地向主站传送数据。包括但不仅限于不带品质描述词的遥测帧、单点遥信帧、远动终端帧子站信息传送完毕后发送总召唤结束帧总召唤过程结束注意事项为了让通信双方同步实时数据库由于中断原因引起的重建链路后的第一次总召唤过程不允许被打断对于非中断原因如手动总召唤引起的总召唤回答可以被高优先级数据打断回答总召唤应该使用 SQ1 压缩格式传输3 报文结构4 报文实例解读这一部分的实例是主站的视角去看也就是说 SEND 就是主站发送子站接收RECV 就是子站发送主站接收。SEND: 68 0E 00 00 00 00 64 01 06 00 01 00 00 00 00 14启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组00 00 00 00 第一个字节的 bit0 为 0第三个字节的 bit0 为 0所以是 I 格式帧发送序列号 0接收序列号 0类型标识64H CON100: 总召唤命令可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因06 00 -0006H Cause6: 激活ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址00 00 00 000000H第一个信息元素的值召唤限定词14H 固定 20RECV: 68 0E 00 00 02 00 64 01 07 00 01 00 00 00 00 14启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组00 00 02 00 第一个字节的 bit0 为 0第三个字节的 bit0 为 0所以是 I 格式帧发送序列号 0接收序列号 1类型标识64H CON100: 总召唤命令可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因07 00 -0007H Cause7: 激活确认ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址00 00 00 000000H第一个信息元素的值召唤限定词14HRECV: 68 1A 02 00 02 00 03 04 14 00 01 00 01 00 00 01 02 00 00 02 03 00 00 01 04 00 00 02启动字符68HAPDU 长度1AH 26 个字节控制域四个八位组 02 00 02 00 第一个字节的 bit0 为 0第三个字节的 bit0 为 0所以是 I 格式帧发送序列号 1接收序列号 1类型标识03H CON3: 双点遥信可变结构限定词04H SQ0 地址不连续 信息元素个数 4传送原因14 00 -0014H Cause20: 响应站召唤ASDU 公共地址01 00 -0001H 通常为 RTU 地址第一个信息元素的地址01 00 00 000001H第一个信息元素的值01H 分位第二个信息元素的地址02 00 00 000002H第二个信息元素的值02H 合位第三个信息元素的地址03 00 00 000003H第三个信息元素的值01H 分位第四个信息元素的地址04 00 00 000004H第四个信息元素的值02H 合位具体双点遥信的报文结构后面在遥信的章节详细说RECV: 68 2A 04 00 02 00 0D 04 14 00 01 00 01 40 00 00 78 DB 3F 00 02 40 00 00 D8 90 42 00 03 40 00 00 F4 92 42 00 04 40 00 60 50 9A 3F 00启动字符68HAPDU 长度2AH 42 个字节控制域四个八位组 04 00 02 00 第一个字节的 bit0 为 0第三个字节的 bit0 为 0所以是 I 格式帧发送序列号 2接收序列号 1类型标识0DH CON13: 测量值短浮点数可变结构限定词04H SQ0 地址不连续 信息元素个数 4传送原因14 00 -0014H Cause20: 响应站召唤ASDU 公共地址01 00 -0001H 通常为 RTU 地址第一个信息元素的地址01 40 00 004001H 16385 (在 2002 版的协议中规定遥测点位地址范围是 0x4001 ~ 0x5000)第一个信息元素的值00 78 DB 3F //Float.intBitsToFloat(0x3fdb7800) 1.715第一个信息元素的品质描述词00H第二个信息元素的地址02 40 00 004002H第二个信息元素的值00 D8 90 42 //Float.intBitsToFloat(0x4290d800) 72.422第二个信息元素的品质描述词00H第三个信息元素的地址03 40 00 004003H第三个信息元素的值00 F4 92 42 //Float.intBitsToFloat(0x4292f400) 73.477第三个信息元素的品质描述词00H第四个信息元素的地址04 40 00 004004H第四个信息元素的值60 50 9A 3F //Float.intBitsToFloat(0x3f9a5060) 1.206第四个信息元素的品质描述词00H具体短浮点遥测的报文结构后面在遥侧的章节详细说RECV: 68 0E 06 00 02 00 64 01 0A 00 01 00 00 00 00 14启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组 06 00 02 00 第一个字节的 bit0 为 0第三个字节的 bit0 为 0所以是 I 格式帧发送序列号 3接收序列号 1类型标识64H CON100: 总召唤命令可变结构限定词01H SQ0 地址不连续 信息元素个数 1 单个传送原因0A 00 -000AH Cause10: 激活终止ASDU 公共地址01 00 -0001H 通常为 RTU 地址第一个信息元素的地址00 00 00第一个信息元素的值召唤限定词14H 固定 20IEC 104 电力规约详细解读 (三) - 遥信张二狗和苗翠花已于 2024-04-23 08:11:38 修改1. 功能简述遥信、即状态量是为了将断路器、隔离开关、中央信号等位置信号上送到监控后台的信息。遥信信息包括反应电网运行拓扑方式的位置信息。如断路器状态、隔离开关状态反应一次二次设备工作状况的运行信息如变压器本体冷却器全停断路器弹簧未储能等反应电网异常和一次二次设备异常的事故信息、预告信息等。如差动保护出口切换继电器同时失磁等硬遥信和软遥信硬遥信测控装置端子排对应的遥信即有电缆接线的如断路器、隔离开关信号等。软遥信除硬遥信之外的遥信主要是一些保护事件如过流段以及自动化嵌入的应用功能模块产生的运行信息。如五防闭锁提示信息等。全遥信和变位遥信全遥信如果没有遥信状态发生变化测控装置每隔一定周期定时向监控后台发送本站所有遥信状态信息变位遥信当某遥信状态发生改变测控装置立即向监控后台插入发送变位遥信的信息。后台收到变遥信报文后与遥信历史库比较后发现不一致于是提示该遥信状态发生改变单点遥信、双点遥信单点遥信就是用一位表示一个遥信量比如断路器位置只采用一个常开辅助接点值为 1 或 0用 1 表示合位0 表示分位双点遥信就是用两位表示一个遥信量需采集动合 / 动断两个辅助接点位置。当动合点值等于 1且动断点值等于 0即值为 10则认为断路器在合位当动合点值等于 0且动断点值等于 1即值为 01则认为断路器在分位当两个位置都为 1 或都为 0则都被认为位置不确定2. 通信过程3. 报文结构遥信报文结构总结起来可以分为三种信息对象序列SQ0不带时标的单 / 双点信息遥信报文格式信息对象序列SQ0带长时标的单 / 双点信息遥信报文格式单个信息中信息元素序列SQ1不带时标的单 / 双点信息遥信报文格式按照 DL/T 634.5104-2009 规定带长时标的单 / 双点信息遥信报文并不存在信息元素序列SQ1的情况遥信报文的类型标识符 TI 分为 01H单点信息03H双点遥信; 传输原因 COT 分为 03H突发05H被请求14H响应站召唤; 遥信对象的地址范围在 2022 版协议中规定为 1H~4000H4. 报文实例解读例 1 SQ0, 不带时标的单点遥信68 0E F8 AD 12 05 01 01 03 00 01 00 A6 01 00 01启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组F8 AD 12 05 第一个字节的 bit0 为 0第三个字节的 bit0 为 0所以是 I 格式帧发送序列号 22268接收序列号 649类型标识01H CON1: 单点信息可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因03 00 -0003H Cause3: 突发ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址A6 01 00 0001A6H 第 422 点第一个信息元素的值01 合位例 2 SQ0, 不带时标的双点遥信68 0E 04 00 02 00 03 01 03 00 01 00 01 00 00 02启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组04 00 02 00 第一个字节的 bit0 为 0第三个字节的 bit0 为 0所以是 I 格式帧发送序列号 2接收序列号 1类型标识03H CON3: 双点信息可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因03 00 -0003H Cause3: 突发ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址01 00 00 000001H 第 1 点第一个信息元素的值02 合位例 3 SQ1, 不带时标的双点遥信68 10 02 00 02 00 03 83 14 00 01 00 01 01 00 02 02 01启动字符68HAPDU 长度10H 16 个字节控制域四个八位组02 00 02 00 第一个字节的 bit0 为 0第三个字节的 bit0 为 0所以是 I 格式帧发送序列号 1接收序列号 1类型标识03H CON3: 双点信息可变结构限定词83H SQ1 地址连续 信息元素个数 3传送原因14 00 -0014H Cause20: 响应站召唤ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址01 01 00 000101H 第 257 点第一个信息元素的值02 合位 第 257 点第二个信息元素的值02 合位 第 258 点第三个信息元素的值01 分位 第 259 点IEC 104 电力规约详细解读 (四) - 遥测张二狗和苗翠花已于 2024-04-23 08:12:46 修改1. 功能简述遥测顾名思义就是测量值由从站上报到主站有标度化归一化短浮点三种类型再根据是否带有品质描述、是否带试标划分为更细的类型。通常推荐使用短浮点数方式上送。遥测信息对象地址范围为 4001H~5000H.2. 通信过程3. 报文结构归一化值。2 字节最高位 D15 为符号位 0 正数 1 负数D14~D0 为数据位取值范围 0-32767短浮点数4 字节IEEE STD745 标准定义不再赘述如果你是用 Java 开发可以直接调用 Float.intBitsToFloat(int)标度化值。4. 报文实例解读RECV: 68 12 0E 00 10 00 0D 01 03 00 01 00 02 40 00 00 78 DB 3F 00启动字符68HAPDU 长度12H 18 个字节控制域四个八位组0E 00 10 00 第一个字节的 bit0 为 0第三个字节的 bit0 为 0所以是 I 格式帧发送序列号 7接收序列号 8类型标识0DH CON13: 带品质描述词的短浮点数可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因03 00 -0003H Cause3: 突发ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址02 40 00 004002H 第 16836 点第一个信息元素的值00 78 DB 3F //Float.intBitsToFloat(0x3fdb7800) 1.715第一个信息元素的品质描述词00 未溢出 / 未被闭锁 / 未被取代 / 当前值 / 有效IEC 104 电力规约详细解读 (五) - 遥控张二狗和苗翠花已于 2024-07-17 11:47:35 修改1. 功能简述遥控命令用来实现对一个可操作设备状态的改变。在配电自动化中包括单点命令和双点命令。通常单点命令用于控制单点信息对象双点命令用于控制双点信息对象。2. 通信过程主站下发遥控选择命令子站进行遥控选择返校若成功则回答遥控选择成功报文若失败则回答失败报文。主站下发取消遥控命令或者遥控执行命令行。字站予以确认。子站皆以报文的镜像确认。3. 报文结构4. 报文实例解读SEND:68 0E 06 00 0A 00 2D 01 06 00 01 00 02 60 00 81启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组06 00 0A 00类型标识2DH CON45: 单点遥控可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因06 00 -0006H Cause6: 激活ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址02 60 00 006002H 点号 24578第一个信息元素的值81H 遥控选择 控合RECV:68 0E 0A 00 06 00 2D 01 07 00 01 00 02 60 00 81启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组0A 00 06 00类型标识2DH CON45: 单点遥控可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因07 00 -0007H Cause7: 激活确认ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址02 60 00 006002H 点号 24578第一个信息元素的值81H 遥控选择 控合SEND:68 0E 08 00 0C 00 2D 01 06 00 01 00 02 60 00 01启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组08 00 0C 00类型标识2DH CON45: 单点遥控可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因06 00 -0006H Cause6: 激活ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址02 60 00 006002H 点号 24578第一个信息元素的值01H 遥控执行 控合RECV:68 0E 0C 00 08 00 2D 01 07 00 01 00 02 60 00 01启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组08 00 0C 00类型标识2DH CON45: 单点遥控可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因07 00 -0006H Cause7: 激活确认ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址02 60 00 006002H 点号 24578第一个信息元素的值01H 遥控执行 控合RECV:68 0E 0E 00 08 00 2D 01 0A 00 01 00 02 60 00 01启动字符68HAPDU 长度0EH 14 个字节控制域四个八位组0E 00 08 00类型标识2DH CON45: 单点遥控可变结构限定词01H SQ0 地址不连续 信息元素个数 1, 单个传送原因0A 00 -000AH Cause10: 激活结束ASDU 公共地址01 00 0001H 通常为 RTU 地址第一个信息元素的地址02 60 00 006002H 点号 24578第一个信息元素的值01H 遥控执行 控合IEC 104 电力规约详细解读 (六) - Java 解析开发要点张二狗和苗翠花已于 2024-04-22 19:38:52 修改1. 前言最近在研究广东电网的 101 与 104 规约也就是 DL/T634.5101-2002 和 DL/T634.5104-2009。因为要做一个规约解析的软件基于 Android 平台的刚开始接触的也是一头雾水因为没有接触过这方面的知识所以就在网上搜索各种技术帖大神经验什么的。后来在网上找到了一个软件–IEC8705 (报文翻译工具).exe这个可以解析一些 101平衡式的实例效果图贴一下。但有些还是解析不了并且在网上也找不到他的源码所以就很苦恼。也找到一些 C 的源码但是由于技术有限我看不懂。下面就和大家来看看我写的这个简单的 Java 语言的规约解析。先贴一下效果图我就在控制台简单演示一下没有做可视化界面。GitHub 地址https://github.com/mujave/iec2. Java 版效果图3. 规约详细解释先看一下我总结的关于规约解析的几个图101 的规约总结104 规约总结具体的 104 协议解释也可以参考 https://blog.csdn.net/wojiuguowei/article/details/794131424. 名词解释这里所说的名词解释并不是对一些名词的定义的解释因为这不是我的专业领域下面我主要针对报文所代表的名词在代码里怎样解释解析说一下。控制域平衡式在报文解析中我就是按照图里面的取值方法对对应的字节进行取值然后进行逻辑判断将结果加到解析结果里面由于后四位所代表的平衡链路功能码在这里是固定的所以可以采取枚举或者反射常量) 的方式进行解析地址域以 104 的信息体地址为例在规约中地址才用的低前高后低位在前高位在后的规则例如68 10 08 00 02 00 09 01 03 00 01 00 01 40 00 2B 02 00黄色部分为信息体地址所以 这个信息体的地址为 01 40 00 0x00400116385时标 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(); }遥测量的解析在 101 的遥测中定义到有三种类型的值分别是归一化值标度值短浮点数具体的定义大家可以参考 “电力 101/104 规约中遥测量类型转换”下面我说一下在 Java 中怎么解析这三种类型的值。直接上代码了。publicclassMain{publicstaticvoidmain(String[]args){TelemetrytelemetrynewTelemetry();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 */publicclassTelemetry{/** * 归一化值 */publicstaticfloatBytes2Float_NVA(intlow,inthigh){floatfVal;intnva(high8)low;// 符号位1位0为正数1为负数后面的为补码表示// 正数的补码和原码相同不需要转换。对于负数,先取反码再加1得到补码的补码就是原码了。intsymbol(high0x80);//符号位0表示正数1表示负数if(symbol0x80)fVal-1*(((nva^0xffff)1)0x7fff);// (nva ^ 0xffff) 1 :补码的补码 取出后面的15位数据乘上-1得到值elsefValnva;returnfVal/32767;//这里的32767值的是一个量纲一般这个参数是主站和从站商定的}/** * 标度化值 */publicstaticfloatBytes2Float_SVA(intlow,inthigh){floatfVal;intnva(high8)low;intsymbol(high0x80);//0表示正数1表示负数if(symbol0x80)fVal-1*(((nva^0xffff)1)0x7fff);elsefValnva;returnfVal;}/** * 短浮点数 * * param data 从低位到高位按顺序 * return */publicstaticfloatBytes2Float_IEEE754(Stringdata){returnFloat.intBitsToFloat(Integer.valueOf(data,16));}}对于短浮点数的计算在 Java 的文档里有这样的说明。还有一些 ASDU 里的信息体的解析过程代码有点多就不一一贴出来了代码已经发布到 GitHub需要的伙伴可以直接下载5.104 规约解析遇到的一些难题报文类型的区分101 报文区分定长和变长两种而 104 规约都是变长的报文。但是对于 104 来说其控制域决定了 104 报文分别属于三种类型I 帧 S 帧 U 帧。所以在解析 104 到控制域的时候是在解析 104 的第一个难题。我先说一下我自己的区分逻辑。我是用控制域的第一字节去和 3 做位运算因为和 3 做位运算就可以得到第一字节的 D1/D0 两位从上面的图中我们可以看到结果如果是 1 的话就是 S 格式如果是 3 的话就是 U 格式其他 的结果就是 I 格式的报文。第二种方式是我在和一个网友交谈中得到的他是运用奇数或者偶数来区分的这里我列一个表格 这样的话如果第一个字节是偶数就是 I 帧否则判断第三字节是 0 就是 U 帧。这样也可以区分报文的类型但是我认为还是做位运算效率会更高计算奇偶性还需要用到 % 这样的运算。类型第一字节第二字节第三字节第四字节S 帧奇10偶—I 帧偶—偶—U 帧奇000位运算的运用在解析规约的时候我一般都是运用的位运算 ()这样既可以提高程序的效率也有助于理解。首先在规约的定义中有很多的一个字节中的不同位代表一个含义这种时候就运用到了位运算这样就可以直接将对应位的值提取出来例如那可变结构限定词这个字节来举个例子。最高位的 D7 代表的是信息元素地址的连续性其中 0 不连续 1 连续所以我们只需要拿这个字节和 128 (0x80) 做位运算就可以得到 D7 这一位如果结果是 10000000 就说明是 1 连续。这个地方更直观一点的判断方法就是 ((B0x80)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 不太理解的话也可以用结果右移运算 645 也可以得到结果 。毫秒 (byte 1 and byte 2): 这个地方首先是低前高后的问题 (这个为题不太明白的可以先翻一下下面的第四个问题)( byte 2 8 ) byte 1 这个地方我用一个表格说明一下 (例如第一字节是 6E第二字节是 2A)。/** * 时标CP56Time2a解析 */publicstaticStringTimeScale(intb[]){Stringstr;intyearb[6]0x7F;intmonthb[5]0x0F;intdayb[4]0x1F;intweek(b[4]0xE0)/32;// int week (b[4] 0xE0) 5;inthourb[3]0x1F;intminuteb[2]0x3F;intsecond(b[1]8)b[0];str时标CP56Time2a:20year-String.format(%02d,month)-String.format(%02d,day),hour:minute:second/1000.second%1000;returnstr\n;}/** * 时间转16进制字符串 */publicstaticStringdate2HStr(Datedate){CalendarcalendarCalendar.getInstance();calendar.setTime(date);StringBuilderbuildernewStringBuilder();StringmilliSecondString.format(%04X,(calendar.get(Calendar.SECOND)*1000)calendar.get(Calendar.MILLISECOND));builder.append(milliSecond.substring(2,4));builder.append(milliSecond.substring(0,2));builder.append(String.format(%02X,calendar.get(Calendar.MINUTE)0x3F));builder.append(String.format(%02X,calendar.get(Calendar.HOUR_OF_DAY)0x1F));intweekcalendar.get(Calendar.DAY_OF_WEEK);if(weekCalendar.SUNDAY)week7;elseweek--;builder.append(String.format(%02X,(week5)(calendar.get(Calendar.DAY_OF_MONTH)0x1F)));builder.append(String.format(%02X,calendar.get(Calendar.MONTH)1));builder.append(String.format(%02X,calendar.get(Calendar.YEAR)-2000));returnbuilder.toString();}低前高后的问题这里讲一下低前高后的问题拿这个 104 规约的信息对象地址举例。例如 34 12 00 这是原报文的字节再具体解析的时候我们要把它转成 0x0012344660其实这里和上面的毫秒的解析方式一样。IEC104 协议 | 帧格式 / 调试篇 1-CSDN博客https://blog.csdn.net/u013669912/article/details/144622175IEC104 协议 | 帧格式 / 调试篇 3-CSDN博客https://blog.csdn.net/u013669912/article/details/155851169viaIEC 104 电力规约详细解读 (一) - 报文结构、报文分类、ASDU_104 规约详细介绍及报文解析-CSDN 博客https://blog.csdn.net/ZhangYu971014/article/details/135889376IEC 104 电力规约详细解读 (二) - 总召唤_iec104 总召唤报文-CSDN 博客https://blog.csdn.net/ZhangYu971014/article/details/135983190IEC 104 电力规约详细解读 (三) - 遥信_104xieyi 信息元素值-CSDN 博客https://blog.csdn.net/ZhangYu971014/article/details/136072736IEC 104 电力规约详细解读 (四) - 遥测_iec104 规约标准 遥测-CSDN 博客https://blog.csdn.net/ZhangYu971014/article/details/136994209IEC 104 电力规约详细解读 (五) - 遥控_104 遥控-CSDN 博客https://blog.csdn.net/ZhangYu971014/article/details/138089077IEC 104 电力规约详细解读 (六) - Java 解析开发要点https://blog.csdn.net/ZhangYu971014/article/details/79841555IEC 60870-5-104 详细解读_张二狗和苗翠花的博客-CSDN 博客https://blog.csdn.net/zhangyu971014/category_12562718.html