📄 sample.c
字号:
pow_c =pow_c<<4;
pow[0] = (INT8U)(pow_c&0xff);
pow[1] = (INT8U)((pow_c>>8)&0xff);
pow[2] = (INT8U)((pow_c>>16)&0xff);
evaluate(cur_data[0].XB6B3,pow,3,1); //C相视在功率
temp = vol_b*cur_b;
pow_total += temp;
pow_b = hex_bcd(temp);
pow_b =pow_b<<4;
pow[0] = (INT8U)(pow_b&0xff);
pow[1] = (INT8U)((pow_b>>8)&0xff);
pow[2] = (INT8U)((pow_b>>16)&0xff);
evaluate(cur_data[0].XB6B2,pow,3,1); //B相视在功率
temp = vol_a*cur_a;
pow_total += temp;
pow_a = hex_bcd(temp);
pow_a =pow_a<<4;
pow[0] = (INT8U)(pow_a&0xff);
pow[1] = (INT8U)((pow_a>>8)&0xff);
pow[2] = (INT8U)((pow_a>>16)&0xff);
evaluate(cur_data[0].XB6B1,pow,3,1); //A相视在功率
temp = pow_total;
pow_total = hex_bcd(temp);
pow_total =pow_total<<4;
pow[0] = (INT8U)(pow_total&0xff);
pow[1] = (INT8U)((pow_total>>8)&0xff);
pow[2] = (INT8U)((pow_total>>16)&0xff);
evaluate(cur_data[0].XB6B0,pow,3,1); //总视在功率
evaluate(cur_data[0].X8E70,buf+172,2,1); // 零序电流(二次侧)
evaluate(cur_data[0].XB650,buf+174,2,4); // 功率因数数据块
evaluate(cur_data[0].XB630,buf+182,3,4); // 有功功率数据块
evaluate(cur_data[0].XB640,buf+194,3,4); // 无功功率数据块
if(((*(buf+206))&0x80)==0x80)
{
evaluate(cur_data[0].XB680,buf+182,3,1); // 反向总有功功率数据
for(i=0;i<3;i++) cur_data[0].XB670[i] = 0;// 正向总有功功率数据
}
else
{
evaluate(cur_data[0].XB670,buf+182,3,1); // 正向总有功功率数据
for(i=0;i<3;i++) cur_data[0].XB680[i] = 0;// 反向总有功功率数据
}
if(((*(buf+206))&0x40)==0x40)
{
evaluate(cur_data[0].XB681,buf+185,3,1); // 反向C相有功功率数据
for(i=0;i<3;i++) cur_data[0].XB671[i] = 0;// 正向C相有功功率数据
}
else
{
evaluate(cur_data[0].XB671,buf+185,3,1); // 正向C相有功功率数据
for(i=0;i<3;i++) cur_data[0].XB681[i] = 0;// 反向C相有功功率数据
}
if(((*(buf+206))&0x20)==0x20)
{
evaluate(cur_data[0].XB682,buf+188,3,1); // 反向B相有功功率数据
for(i=0;i<3;i++) cur_data[0].XB672[i] = 0;// 正向B相有功功率数据
}
else
{
evaluate(cur_data[0].XB672,buf+188,3,1); // 正向B相有功功率数据
for(i=0;i<3;i++) cur_data[0].XB682[i] = 0;// 反向B相有功功率数据
}
if(((*(buf+206))&0x10)==0x10)
{
evaluate(cur_data[0].XB683,buf+191,3,1); // 反向A相有功功率数据
for(i=0;i<3;i++) cur_data[0].XB673[i] = 0;// 正向A相有功功率数据
}
else
{
evaluate(cur_data[0].XB673,buf+191,3,1); // 正向A相有功功率数据
for(i=0;i<3;i++) cur_data[0].XB683[i] = 0;// 反向A相有功功率数据
}
if(((*(buf+206))&0x08)==0x08)
{
evaluate(cur_data[0].XB6A0,buf+194,2,1); // 反向总无功功率数据
for(i=0;i<2;i++) cur_data[0].XB690[i] = 0;// 正向总无功功率数据
}
else
{
evaluate(cur_data[0].XB690,buf+194,2,1); // 正向总无功功率数据
for(i=0;i<2;i++) cur_data[0].XB6A0[i] = 0;// 反向总无功功率数据
}
if(((*(buf+206))&0x04)==0x04)
{
evaluate(cur_data[0].XB6A1,buf+196,2,1); // 反向C相无功功率数据
for(i=0;i<2;i++) cur_data[0].XB691[i] = 0;// 正向C相无功功率数据
}
else
{
evaluate(cur_data[0].XB691,buf+196,2,1); // 正向C相无功功率数据
for(i=0;i<2;i++) cur_data[0].XB6A1[i] = 0;// 反向C相无功功率数据
}
if(((*(buf+206))&0x02)==0x02)
{
evaluate(cur_data[0].XB6A2,buf+198,2,1); // 反向B相无功功率数据
for(i=0;i<2;i++) cur_data[0].XB6A2[i] = 0;// 正向B相无功功率数据
}
else
{
evaluate(cur_data[0].XB6A2,buf+198,2,1); // 正向B相无功功率数据
for(i=0;i<2;i++) cur_data[0].XB692[i] = 0;// 反向B相无功功率数据
}
if(((*(buf+206))&0x01)==0x01)
{
evaluate(cur_data[0].XB6A3,buf+200,2,1); // 反向A相无功功率数据
for(i=0;i<2;i++) cur_data[0].XB693[i] = 0;// 正向A相无功功率数据
}
else
{
evaluate(cur_data[0].XB693,buf+200,2,1); // 正向A相无功功率数据
for(i=0;i<2;i++) cur_data[0].XB6A3[i] = 0;// 反向A相无功功率数据
}
}
/*********************************************************************************************************
** 函数名称: crc_process
** 功能描述: 校验处理
** 输 入: buf,处理数据的起始地址;
** 输 出: >=0 :校验成功。
** < 0 : 校验失败。
********************************************************************************************************/
INT32S crc_process(INT8U * buf,INT8U *lenth)
{
INT16U i,j=0,len;
INT8U crc=0;
INT32S rep=-8;
//INT32S reply;
while(*(buf+j) != 0x68) //第一个0x68,取出接收缓冲区的一帧数据的帧头;
{
j++;
if(j>=300) break; //退出,没有采集到正确数据;
}
buf = buf+j;
*lenth = j;
j = 7;
if(*(buf+j) != 0x68) return rep; //第二个0x68;
// for(i=0;i<8;i++) crc = *(buf+i)+crc; //计算0x68,a0,a1,a2,a3,a4,a5,0x68的校验和
j = j+1; //*(buf+j) 为应答码;
//接收正确0x81与错误0xc1,有后续帧时为0xa1;
if(*(buf+j) == 0xa1) _houxu_Frame_flag = 1;
else if(*(buf+j) == 0xc1) return rep;
else if(*(buf+j) != 0x81) return rep;
j++;
len = *(buf+j);
*lenth = *lenth+j;
// crc = *(pointer+j)+crc;
for(i=0;i<len+j+1;i++)
{
crc = *(buf+i)+crc;
}
j = j+len+1;
if(crc != *(buf+j)) return rep; //校验和错误;
j++;
if(0x16 != *(buf+j)) return rep; //没有收到帧尾
rep = 8;
return rep;
}
/*********************************************************************************************************
** 函数名称: evaluate
** 功能描述: 赋值处理
** 输 入: left_buf,赋值前数据的起始地址;
** right_buf,赋值后数据的起始地址;
** n ,一个数据项的长度
** m ,一个数据块的数据项的个数
** 输 出: >=0 :校验成功。
** < 0 : 校验失败。
********************************************************************************************************/
void evaluate(INT8U *left_buf,INT8U *right_buf,INT8U n,INT8U m) //赋值,
{
INT8U i,j;
for(j=0;j<m;j++)
{
for(i=0;i<n;i++)
{
*(left_buf+j*n+i) = *(right_buf+i)-0x33;
}
right_buf = right_buf+n;
}
}
/*********************************************************************************************************
** 函数名称: bcd_hex
** 功能描述: BCD码转换HEX码
** 输 入: bcd:BCD数
** 输 出: HEX数
********************************************************************************************************/
INT32U bcd_hex(INT32U bcd)
{
INT32U temp;
temp = ((bcd>>12)*1000)+(((bcd&0xf00)>>8)*100)+(((bcd&0xf0)>>4)*10)+(bcd&0x0f);
return temp;
}
/*********************************************************************************************************
** 函数名称: hex_bcd
** 功能描述: HEX码转换BCD码
** 输 入: hed:HEX数
** 输 出: BCD数
********************************************************************************************************/
INT32U hex_bcd(INT32U hex)
{
INT32U temp,bcd;
temp = hex%1000;
bcd = (hex/1000)<<12;
bcd = bcd|((temp/100)<<8);
temp = temp%100;
bcd = bcd|((temp/10)<<4)|(temp%10);
return bcd;
}
/*********************************************************************************************************
** 函数名称: down_data_E92F
** 功能描述: 处理下行接收数据
** 输 入: buf,处理数据的起始地址;
** 输 出: 无
********************************************************************************************************/
void down_data_E92F(INT8U *buf)
{
evaluate(cur_data[0].XA010,buf,3,5);
evaluate(cur_data[0].XA020,buf+15,3,5);
//buf有30个字节没有读,下面的起始地址为buf+60
evaluate(cur_data[0].XB010,buf+60,4,5);
evaluate(cur_data[0].XB020,buf+80,4,5);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -