国网376.1协议解析 (简单解析,包含示例)

目录

1. 前言   

2. 基本概念

3. 解析 

    3.1 控制域C

    3.2 地址域 A

    3.3应用层功能码 AFN

    3.4帧序列域解析 SEQ

    3.5 数据单元标识

    3.6 数据单元

4.案例 

1. 前言   

        今天分享下,国网376.1协议的一些基本解析,包含案例。

2. 基本概念

        国网376.1协议规定了电力用户用电信息采集系统主站和采集终端之间进行数据传输的帧格式、数据编码及传输规则。

           本部分适用于点对点、多点共线及一点对多点的通信方式,适用于主站对终端执行主从问答方式以及终端主动上传方式的通信

3. 解析 

    3.1 控制域C

        控制域C表示报文传输方向和所提供的传输服务类型的信息。 

    3.2 地址域 A

        地址域由行政区划码A1、终端地址A2、主站地址和组地址标志A3组成。

 

    3.3应用层功能码 AFN

        应用层功能码AFN由一字节组成,采用二进制编码表示 

    3.4帧序列域解析 SEQ

        帧序列域SEQ为1字节,用于描述帧之间的传输序列的变化规则,由于受报文长度限制,数据无法在一帧内传输,需要分成多帧传输(每帧都应有数据单元标识,都可以作为独立的报文处理)。

    3.5 数据单元标识

        数据单元标识由信息点标识DA和信息类标识DT组成,表示信息点和信息类型。

        信息点DA由信息点元DA1和信息点组DA2两个字节构成。

        DA2采用二进制编码方式表示信息点组,DA1对位表示某一信息点组的1~8个信息点,以此共同构成信息点标识pn(n=1~2040)

 

        信息类DT由信息类元DT1和信息类组DT2两个字节构成。

        DT2采用二进制编码方式表示信息类组,DT1对位表示某一信息类组的1~8种信息类型,以此共同构成信息类标识Fn(n=1~248)

 

    3.6 数据单元

        这一块就不过多介绍,根据376.1的协议文件,来看需要什么功能,按照文件上的来就行,文件写的很清楚,比如正向无功总电量都有字节数,对着文件解析就行。

4.案例 

        举个例子就比如我现在要查当前正向无功(组合无功1)电能示值,AFN = F130。下面是设备返回的报文。我们就来解析这个报文。

689A009A006888001335A1000C63010102102513271023041501000015010000000000000000000000000000B616

         根据上面两张图片来解析数据单元,以下是我解析的数据。

 

        好了,以上就是对376.1协议的基本解析,希望大家能多多点赞哈,有不足之处,还请大佬批评指正!

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
国网376.1协议解析源码主要是基于各种编程语言和平台实现的,其中比较常用的编程语言包括C/C++、Java、Python等。以下以C/C++语言为例,介绍376.1协议解析源码的实现方式。 首先,需要了解376.1协议的数据结构和通信流程。376.1协议主要分为应用层和传输层两个部分,应用层负责数据的封装和解析,而传输层则负责数据的传输和校验。在应用层中,376.1协议主要包括控制域、地址域、数据单元标识符以及数据单元等部分。控制域包括帧起始符、帧长度、帧校验码等信息,地址域用于标识数据发送方和接收方的地址信息,数据单元标识符用于标识数据单元的类型,数据单元则是具体的数据内容。 在C/C++语言中,可以使用结构体来表示376.1协议中的各个部分,例如: ```C++ struct ControlField { unsigned char start; // 帧起始符 unsigned short length; // 帧长度 unsigned char cs; // 帧校验码 }; struct AddressField { unsigned char send; // 发送方地址 unsigned char receive; // 接收方地址 }; struct DataUnitIdentifier { unsigned char code; // 数据单元标识符 }; struct DataUnit { // 数据单元内容 }; ``` 在解析376.1协议时,可以先将接收到的数据按照结构体的形式进行解析,然后再根据数据单元标识符的不同,对数据单元进行进一步的解析和处理。例如: ```C++ void parse_data_unit(unsigned char code, unsigned char* data, int len) { switch (code) { case 0x01: // 数据单元类型为时标 // 解析时标数据 break; case 0x02: // 数据单元类型为遥测数据 // 解析遥测数据 break; case 0x03: // 数据单元类型为遥信数据 // 解析遥信数据 break; // 其他数据单元类型的解析 } } void parse_frame(unsigned char* frame, int len) { // 解析控制域 // 解析地址域 // 解析数据单元标识符 DataUnitIdentifier dui; memcpy(&dui, frame + CONTROL_FIELD_LEN + ADDRESS_FIELD_LEN, DATA_UNIT_IDENTIFIER_LEN); // 解析数据单元 parse_data_unit(dui.code, frame + CONTROL_FIELD_LEN + ADDRESS_FIELD_LEN + DATA_UNIT_IDENTIFIER_LEN, len - CONTROL_FIELD_LEN - ADDRESS_FIELD_LEN - DATA_UNIT_IDENTIFIER_LEN - CHECK_SUM_LEN); } ``` 当然,实际的解析源码还需要考虑更多细节和异常情况的处理,例如数据长度不足、校验失败等情况。但基本的思路和方法是类似的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值