C++结构体指针强制转换以处理电力系统IEC103报文

news2024/11/28 6:29:54

前言

最近依旧是开发规约解析工具的103篇,已经完成了通用分类服务部分的解析,现在着手开始搞扰动数据传输,也就是故障录波的传输。

在103故障录波(扰动数据)的报文中,数据是一个数据集一个数据集地存放,所以为了方便我们采用pData[offset]这种方式来访问到每一个数据,用结构体TJC103_Wave来定义数据集之前三行的其余字段部分,初步打算用结构体来访问其余字段部分,而用BYTE(unsigned char)型的指针来访问数据集,因为涉及到偏移量,所以采用pData[offset]这种方式来访问较为简单。
在这里插入图片描述

以下为部分代码实现:

//.h文件
//=========================新增103规约发送接收帧结构体=======================
typedef struct
{
    BYTE bStart;   //启动字符
    BYTE bLength;  //长度
    BYTE bControl1;//控制域1
    BYTE bControl2;//控制域2
    BYTE bControl3;//控制域3
    BYTE bControl4;//控制域4
    BYTE bType;    //类型标识
    BYTE bQualifier;//结构限定词
    BYTE bReason;  //传送原因 
    BYTE bAddress; //公共地址
    BYTE bFUN;      //功能类型
    BYTE bINF;     //信息序号
    BYTE bData;    
    BYTE bGenData;  //从NGD开始
} TJC103RxdFm, TJC103TxdFm;

TJC103RxdFm m_pRxdFm_JC103;			//存储报文的结构体

//故障录波数据准备好报文的应用服务数据格式
typedef struct
{
    BYTE bNotUsed;          //未用
    BYTE bDataType;         //数据类型
    WORD wFaultNumber;      //故障序号
    WORD wPowerGrid;        //电网故障序号(未用)
    BYTE NOC;               //模拟量路数
    WORD NOE;               //每路模拟量的点数
    WORD INT;               //非实际数
    DWORD dwNotUsed;        //没有使用,全部为零
    WORD StartRecordWave;   //启动与录波开始的间隔点数
    WORD ExitRecordWave;    //出口与录波开始的间隔周波数
    WORD ReturnRecordWave;  //返回与录波开始的间隔周波数
    BYTE bData;              //数据
} TJC103_Wave;
	

报文解析处理:

//.cpp文件
bool CXfloatDlg::Rxd68_JC103_Burst_Trans_Ready_26()	//扰动数据传输准备就绪
{
	
	TJC103_Wave* JC103_Wave = (TJC103_Wave*) & (m_pRxdFm_JC103->bData);
	SetTop_JC103("扰动数据传输准备就绪");
	qy.Format("%02X%s传送原因bReason:%s\r\n", m_pRxdFm_JC103->bReason, GetSpace(1), SETReason_JC103(m_pRxdFm_JC103->bReason));
	m_result += qy;
	qy.Format("%02X%s数据单元公共地址:%d\r\n", m_pRxdFm_JC103->bAddress, GetSpace(1), m_pRxdFm_JC103->bAddress);
	m_result += qy;
	qy.Format("%02X%s功能类型FUN:%d\r\n", m_pRxdFm_JC103->bFUN, GetSpace(1), m_pRxdFm_JC103->bFUN);
	m_result += qy;
	qy.Format("%02X%s信息序号INF:%d  %s\r\n", m_pRxdFm_JC103->bINF, GetSpace(1), m_pRxdFm_JC103->bINF, GetINFstrign(m_pRxdFm_JC103->bINF));
	m_result += qy;
	qy.Format("%02X%s未用\r\n", JC103_Wave->dwNotUsed, GetSpace(1));
	m_result += qy;
	qy.Format("%02X%s数据类型:%d\r\n", JC103_Wave->bDataType, GetSpace(1), JC103_Wave->bDataType);
	m_result += qy;
	//其余字段...
	BYTE* pData = &(JC103_Wave->bData);
	while (1)
	{
		//循环输出数据部分..
		pData[wOffset++];
		//循环输出数据部分..
	}
	return TRUE;
}

其中最主要的代码便是这两行:

TJC103_Wave* JC103_Wave = (TJC103_Wave*) & (m_pRxdFm_JC103->bData);

BYTE* pData = &(JC103_Wave->bData);

我们收到的报文内容存放在m_pRxdFm_JC103中,第一句将m_pRxdFm_JC103->bData的地址赋值给JC103_Wave,并且强制转换为TJC103_Wave类型,以 TJC103_Wave的方式来访问 m_pRxdFm_JC103->bData 的内容,并且可以通过JC103_Wave->bData来访问到数据类型的值,通过&(JC103_Wave->bData)来访问到其地址。

第二句则是将JC103_Wave->bData的地址赋值给pData,并且可以通过pData[0] 、pData[1]来访问到后续的值。

例如报文:
68 0C 18 00 04 00 1A 81 1F 01 FF 00 00 01
由103规约可知,1A是类型标识是26,进入上面我们提到的Rxd68_JC103_Burst_Trans_Ready_26函数,并且可以知道此时m_pRxdFm_JC103->bData的值便是最后一个00,而最后的00 01其实在内存中就是紧跟在m_pRxdFm_JC103->bData的值00之后的,所以我们这时可以通过JC103_Wave 来接管后面两个字节的监控,同时可以用JC103_Wave->bNotUsed来访问到这个最后的00 ,用JC103_Wave->bDataType访问到最后的01。

因为我们最后要操作数据,并且数据是一个数据集一个数据集地存放,所以我们需要通过pData[offset]这种方式来访问到每一个数据,所以我们将JC103_Wave->bData的地址在赋值给一个BYTE型指针,这样我们就可以一个字节一个字节地访问到每一个数据了。

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

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

相关文章

如何有效优化无线双模蓝牙模块的通讯距离?

许多客户在使用无线双模蓝牙模块时发现传输距离达不到预期要求。影响无线蓝牙模块通讯距离的因素有很多,以下是美迅物联网MesoonRF归纳总结的一些可能的原因以及如何改善: 1.优化天线设计 天线是影响无线双模蓝牙模块通讯距离的关键因素之一,…

IPC进程间通信

信号 信号是一种终端机制,程序运行到一半的时候接收到了某种通知,程序就会立刻中断运行,转而去处理通知。 登记信号 一个进程只会接收默认的几个信号 如果想要让一个进程接收特定信号的话,必须提前在该进程中登记一下想要接收…

一次了解所有功能!超详细【Stable Diffusion界面】大揭秘!

对于AI绘画的初学者而言,一看到SD的UI界面肯定是一脸懵,因为有太多陌生词汇,什么大模型、什么提示词、什么什么采样迭代,和传统的画图方式完全不在一个层面上,学习起来就无从下手~ 今天小元老师就给大家详…

运维高级内容--lvs按权重值轮询调度

创建5台主机(一些配置是基于实验一的基础): 客户端client 172.25.254.200路由器route 172.25.254.100 192.168.0.100 (需要eth0、eth1两个网关)LVS 192.168.0.50webserver1 192.168.0.10webserver2 192.168.0.20 1.LVS主机: vim…

DataGrip安装与MySQL连接

DataGrip安装 官网:DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains 点击页面中的【Download】进入下载界面,如下图所示: 根据自己的电脑系统选择不同的版本【windows/macOS/linux】,点击【.exe】可选择…

MySQL(一)——初识数据库(概念、数据类型、基本表库操作)

文章目录 初识数据库数据库相关基本概念数据库的分类 MySQL数据库数据模型基本操作库操作查看数据库创建数据库删除数据库选中数据库 数据类型数值类型字符串类型日期类型 表操作查看所有表查看表结构创建表删除表 其他操作查看警告信息查看编码集 这是我们 MySQL 学习的第一程…

GD32E503实现串口中断收发功能

如有技术问题及技术需求请加作者微信! 源码下载链接:代码下载 亲测可用实现GD32E503库函数串口数据收发功能: #include "gd32e50x.h" #include "gd32e503v_eval.h" #include "systick.h" #include <stdio.h> #include "user_uart…

JVM知识总结(性能调优)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 性能调优 何时进行JVM调优&#xff1f; 遇到以下情况&#xff0c…

初识C++ · 智能指针

目录 前言&#xff1a; 1 智能指针的发展历史 2 unique_ptr和shared_ptr的基本使用 3 shared_ptr的模拟实现 4 有关定制删除器 前言&#xff1a; 智能指针的引入&#xff0c;我们得先从异常开始说起&#xff0c;异常面临的一个窘境是new了多个对象&#xff0c;抛异常了会…

centos7简介和安装步骤

目录 centos简介 1.CentOS 7 简略简介 2.使用建议 vmware搭建centos7 1.centos镜像下载 2.虚拟机创建 2.1 新建虚拟机 2.2典型 2.3操作系统 2.4客户机操作系统选择 ​编辑 2.5虚拟机命名与位置安装 2.5磁盘容量 2.6完成 2.6编辑虚拟机 2.6.1内存大小编辑 2.6.…

React+vite+antd点击路由切换时出现闪屏

问题描述:点击左侧路由切换会出现闪屏的情况 页面的效果 解决方案 完整代码 import { lazy, Suspense, ReactNode } from "react"; import { Navigate, useLocation } from "react-router-dom"; import LayOut from ../pages/LayOut/LayOut import NotFo…

过滤了字母、数字、_、$的webshell命令执行技巧

目录 对于php5以上首先要解决的问题有 解决技巧 1.code长度小于35位 2.没有字母、数字、_ 、$ 3.怎么把文件放进服务器 4.怎么执行文件里面的内容 1.执行Linux命令 2.执行文件里面的shell命令 5.构造完整的code参数 6.我们还可以通过修改文件里面shell命令&#xff0c;…

学习记录703@计算机组成原理之原码、补码、反码、移码

数据表示基本概念 数据表示分为有符号数和无符号数&#xff0c;其中有符号数分为整数、纯小数、带小数&#xff1b;整数和纯小数小数点位置固定&#xff0c;统称为定点数&#xff1b;带小数小数点位置可以浮动&#xff0c;称为为浮点数&#xff0c;浮点数阶码就是整数部分&…

忘记iPhone锁屏密码,多次输出密码导致iPhone停用了怎么解锁?

iphone已停用怎么解锁&#xff1f;当因忘记iPhone锁屏密码&#xff0c;多次输入错误密码而被停用时&#xff0c;怎么解锁恢复对设备的访问是非常重要的。下面小编将给大家介绍几种解锁已停用iPhone的方法&#xff0c;一起来看看吧&#xff01; 一、使用恢复模式解锁 将iPhone连…

知识学习技巧:如何从 iPhone 恢复误操作删除的视频

您来这里主要是因为您想知道如何从 iPhone 恢复已删除的视频。实际上&#xff0c;如果视频是用 iPhone 拍摄的&#xff0c;您可以尝试在相册“最近删除”中找到它们。删除后它将保留 40 天。如果您清空了相册或无法从相册中找到已删除的视频&#xff0c;那么您必须尝试使用奇客…

系统管理篇

系统管理 一、网络管理1. 网络状态查看2. 网络和路由配置3. 网络故障排除4. 网络服务管理 二、软件管理1. 软件包管理器2. rpm包和rpm命令3. yum仓库4. 源代码编译安装5. 内核升级6. grub配置文件 三、进程管理1. 进程的概念与进程查看2. 进程的控制命令3. 进程的通信方式--信号…

Linux内核中的eMMC存储支持详解

一、eMMC概述 eMMC&#xff08;Embedded MultiMediaCard&#xff09;是一种嵌入式多媒体卡&#xff0c;是一种基于NAND Flash的闪存卡标准&#xff0c;由JEDEC&#xff08;电子设备工程联合委员会&#xff09;订立和发布。eMMC集成了NAND Flash、闪存控制器和eMMC协议接口&…

【npm】如何将开发的vite插件发布到npm

前言 简单说下 npm 是什么&#xff1a; npm 是一个 node 模块管理工具&#xff0c;也是全球最大的共享源。 npm 工具与 nodejs 配套发布&#xff0c;便利开发人员共享代码。npm 主要包括 npm 官方网站、CLI&#xff08;控制台命令行工具&#xff09;、和 registry&#xff08;…

系统架构设计定义

系统架构设计是软件开发和信息系统构建中至关重要的一环&#xff0c;它涉及到系统的整体结构、模块划分、接口定义以及设计原则等多个方面。以下是对系统架构设计的详细阐述&#xff1a; 一、系统架构设计的定义 系统架构设计是指对系统的整体结构、模块关系、接口定义以及交互…

IDEA2023版本创建mavenWeb项目及maven的相关配置

在使用idea创建maven项目之前&#xff0c;首先要确保本地已经下载并配置好maven的环境变量&#xff0c;可以参考我主页的maven下载及环境变量配置篇。 接下来首先介绍我们需要对maven安装目录文件进行的修改介绍。 maven功能配置 我们需要需改 maven/conf/settings.xml 配置…