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

📄 sample.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -