⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parseclass11.cpp

📁 ABB AIN电表对数据类11解码的例子程序
💻 CPP
字号:
#include "stdio.h"
typedef struct 
{
	unsigned char  UKH[3];
	unsigned char  UPR;
	unsigned char  UKE[5];
    unsigned char  INTNORM;
	unsigned char  INTTEST;
	unsigned char  DPLOCE;
	unsigned char  DPLOCD;
	unsigned char  NUMSBI;
	unsigned char  VTRATIO[3];
	unsigned char  CTRATIO[3];
	unsigned char  XFACTOR[4];
    unsigned char  SPARE[15];
	unsigned char  CLOCKS;
} Class_0_Struct;

typedef struct 
{
	unsigned char KWH[7];
	unsigned char KW[3];
	unsigned char TD[5];
	unsigned char KWCUM[3];
	unsigned char KWC[3];
} RATE_Struct;

typedef struct 
{
	RATE_Struct RATE[4];  //Rate: A B C D
} TOU_Struct;

typedef struct
{ 
	unsigned char EKVARH[7];
} EKVARH_Struct;

typedef struct
{
	TOU_Struct TOU[4];       //TOU: 1 2 3 4
    EKVARH_Struct EKVARH[4]; //EKVARH: 4 3 2 1
	unsigned char EAVGPF[2];
} Class_11_Struct;

//以下结构用于存储解析后的class_11的数据
typedef struct
{
   float KWH;   //解析后的费率电量
   float KW;    //解析后的费率的最大需量
   unsigned char TD[5]; //费率最大需量发生时间,BCD码,年月日时分
   float KWCUM;  //解析后的费率的累计需量值
   float KWC;  //解析后的费率的需量伴随值
} Real_RATE_Struct;

typedef struct
{
	Real_RATE_Struct RATE[4];
} Real_TOU_Struct;

typedef struct 
{
	Real_TOU_Struct TOU[4];
	float EKVARH[4];
	float EAVGPF;
} Real_Class_11_Struct;



//以下2个全局变量的数据填写,由读表程序完成,只需要把读出来的有效数据依次填入。

Class_0_Struct Class_0_Data;         //全局变量,将Class0读出来的数据填入
Class_11_Struct Class_11_Data;       //全局变量,将Class11读出来的数据填入
Real_Class_11_Struct Real_Class_11_Data;  //全局变量,存储Class11解析后的各参数的值

 
#define MAX_LEN	10                //根据需要改变,这是定义BCD转换为实际数据时使用的全局数组长度
unsigned char InputData[MAX_LEN];  //将需要解析的BCD数值填写进来,然后进一步计算。


//需要处理的BCD码调用之前,存放在InputData里面,
//bcdlen表示处理的bcd码的总的字节数,decnum表示转换后的小数位数
float ParsedBCD(int bcdlen, int decnum)     
{
  float outputdata = 0;
  int i;
  unsigned char tempH,tempL;
  for(i=0;i<bcdlen;i++)
  {
	  tempH = InputData[i] & 0xf0;
	  tempH = tempH>>4;
	  tempL = InputData[i] & 0x0f;
	  outputdata = outputdata * 100 + tempH *10 + tempL;
  }
  for(i=0; i<decnum;i++)
  {
	  outputdata = outputdata/10;
  }
  return outputdata;
}

void ParsedClass11() //解析Class_11_Data的数据,存放到Real_Class_11_Data
{
	int dploce;    //根据class0解析出来的电量的小数位数
	int dplocd;    //根据class0解析出来的各种需量的小数位数
	int RATECount=4;  //Rate A B C D
	int TOUCount=4;   //TOU 1 2 3 4
	int EKVARHCount=4; //EKVARH 4 3 2 1
	int i,j,k;
	dploce = Class_0_Data.DPLOCE;
    dplocd = Class_0_Data.DPLOCD;
    //以下解析每个TOU
	for(i=0;i<TOUCount;i++)
	{
      for(j=0;j<RATECount;j++)
	  {
		  for(k=0;k<7;k++)    //KWH
		  {
			  InputData[k]=Class_11_Data.TOU[i].RATE[j].KWH[k];
          }
         Real_Class_11_Data.TOU[i].RATE[j].KWH=ParsedBCD(7,dploce);
          for(k=0;k<3;k++)    //KW
		  {
			  InputData[k]=Class_11_Data.TOU[i].RATE[j].KW[k];
          }
         Real_Class_11_Data.TOU[i].RATE[j].KW=ParsedBCD(3,dplocd);
		  for(k=0;k<5;k++)    //最大需量时间,仍采用BCD,所以基本复制即可
		  {
		   Real_Class_11_Data.TOU[i].RATE[j].TD[k]=Class_11_Data.TOU[i].RATE[j].TD[k];
		  }
		 Real_Class_11_Data.TOU[i].RATE[j].TD[1] &= 0x7f; //月份需要单独处理一下
		  for(k=0;k<3;k++)    //KWCUM
		  {
		    InputData[k]=Class_11_Data.TOU[i].RATE[j].KWCUM[k];
          }
		 Real_Class_11_Data.TOU[i].RATE[j].KWCUM=ParsedBCD(3,dplocd);
		  for(k=0;k<3;k++)  //KWC 需量伴随值
          {
			InputData[k]=Class_11_Data.TOU[i].RATE[j].KWC[k];
		  }
		  Real_Class_11_Data.TOU[i].RATE[j].KWC=ParsedBCD(3,dplocd);
	  }
	}
	//解析4个象限的无功分量  4 3 2 1顺序
	for(i=0;i<EKVARHCount;i++)
	{
		for(j=0;j<7;j++)   //EKVARH
		{
			InputData[j]=Class_11_Data.EKVARH[i].EKVARH[j];
		}
		Real_Class_11_Data.EKVARH[i]=ParsedBCD(7,dploce+6);
	}
    //解析EAVGPF
	for(i=0;i<2;i++)
	{
		InputData[i]=Class_11_Data.EAVGPF[i];
	}
	Real_Class_11_Data.EAVGPF=ParsedBCD(2,3);
  
}


void main()
{ 
  float dataout;	
  InputData[0]=0x00;
  InputData[1]=0x99;
  InputData[2]=0x43;
  dataout= ParsedBCD(2,2);
  printf("%f",dataout);
}
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -