📄 parseclass11.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 + -