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

📄 sample.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "sample.h"
//#include "curdata.h"

INT8U _jiaocai_addr[6]={0x47,0x10,0x07,0x00,0x00,0x00};
//INT8U _jiaocai_addr[6]={0x00,0x91,0x78,0x56,0x34,0x12};
INT8U _houxu_Frame_flag = 0;


/*********************************************************************************************************
** 函数名称: get_jiaocai_add
** 功能描述: 读取交采的地址
** 输   入: 无
** 输   出: 无 
********************************************************************************************************/
void get_jiaocai_add(void)
{
	INT32S reply;
	INT8U Sendbuf[6],j=0;
	INT16U i;
//	INT8S p;
	Sendbuf[0] = 0xAA;
	Sendbuf[1] = 0xAA;
	Sendbuf[2] = 0xAA;
	Sendbuf[3] = 0xAA;
	Sendbuf[4] = 0xAA;
	Sendbuf[5] = 0xAA;
//	p = fill_down_send_q();
//	Down_Send_ok = down_send(Sendbuf,0x01,0x34,0xC0);
	for(i=0;i<3;i++)
	{	
		Down_Send_ok = down_send(Sendbuf,0x01,0x34,0xC0);
		reply = ReadCommMs(4,Down_Revbuf,20,200,500);
		if(reply>0)    break;
	}
	if(i>=3)  ;      //交采采集的串口有问题,告警;
	
	while(Down_Revbuf[j] != 0x68) 		//取出接收缓冲区的一帧数据的帧头;
	{
		j++;
	//	OSTimeDly(1);
		if(j>=300)  break;       //退出,没有采集到正确数据;
	}
	for(i=0;i<6;i++)	_jiaocai_addr[i] = Down_Revbuf[i+j+1];//保存交采的地址;
}



/*********************************************************************************************************
** 函数名称: sample_data
** 功能描述: 下行交采发送读命令串
** 输   入: buf,接收数据缓冲区指针
** 输   出:  >=0 :返回实际写入的字节数。
**          < 0 : 函数调用失败。
********************************************************************************************************/
INT32S sample_data(void)
{

	INT16U j,len0=0,m=0;
//	INT8U * pointer;
	INT32S  rep = -2,repp;
	INT8U i,len,frame_flag = 0;   //此长度为从接收缓冲开始到有效数据开始之间的长度,有效数据包括数据标识码;
//	pointer = Down_Revbuf;
	
	for(i=0;i<3;i++)	
	{	
		for(j=0;j<300;j++)	
		{
			Down_Revbuf[j] = 0;
			First_Revbuf[j] = 0;
		}
		len0 = 0;
		down_send(_jiaocai_addr,0x01,0x1F,0xE9);
		m = 0;
		while(!frame_flag)
		{
			rep = ReadCommMs(4,First_Revbuf,300,50,500);
			
		    if(rep>0)
		    {
		    	for(j=0;j<rep;j++) Down_Revbuf[len0+j] = First_Revbuf[j];
		    	len0 = rep+len0;
		    	j=0;
				while(First_Revbuf[j] != 0x16)
				{
					j++;
					if(j>300)	break;
				}
				if(j<300) frame_flag = 1;
			}
			m++;
			if(m>300)	break;
		}
		frame_flag = 0;
		if(j<300)		
		{	
			repp = crc_process(Down_Revbuf,&len);
			if(repp<0)	
				return (-2);
			else 
			{
				//调用读取数据函数;
				down_data_E91F(Down_Revbuf+len+3);	
				if(_houxu_Frame_flag)
				{
					_houxu_Frame_flag = 0;
					//发送读后续帧数据命令;
					
				}
			}
			break;
		}
		
	}
	if(i>=3)  ;      //交采采集的串口有问题,告警;
	
	for(i=0;i<3;i++)	
	{	
		for(j=0;j<300;j++)	
		{
			Down_Revbuf[j] = 0;
			First_Revbuf[j] = 0;
		}
		len0 = 0;
		down_send(_jiaocai_addr,0x01,0x2F,0xE9);
		m = 0;
		while(!frame_flag)
		{
			rep = ReadCommMs(4,First_Revbuf,300,50,500);
			if(rep>0)
		    {
		    	for(j=0;j<rep;j++) Down_Revbuf[len0+j] = First_Revbuf[j];
		    	len0 = rep+len0;
		    	j=0;
				while(First_Revbuf[j] != 0x16)
				{
					j++;
					if(j>300)	break;
				}
				if(j<300) frame_flag = 1;
			}
			m++;
			if(m>300)	break;
		}
		frame_flag = 0;
		if(j<300)		
		{	
			repp = crc_process(Down_Revbuf,&len);
			if(repp<0)	
				return (-2);
			else 
			{
				//调用读取数据函数;
				down_data_E92F(Down_Revbuf+len+3);	
				if(_houxu_Frame_flag)
				{
					_houxu_Frame_flag = 0;
					//发送读后续帧数据命令;
					
				}
			}
			break;
		}
		
	}
	if(i>=3)  ;      //交采采集的串口有问题,告警;
	return 0;
}


/*********************************************************************************************************
** 函数名称: down_send
** 功能描述: 下行交采发送读命令
** 输   入: add:交采地址,6个字节;
**			 control:控制操作码;
**			 data0:数据0+33H
**			 data1:数据1+33H
** 输   出:  >=0 :返回实际写入的字节数。
**          < 0 : 函数调用失败。
********************************************************************************************************/


INT32S down_send(INT8U *add,INT8U control,INT8U data0,INT8U data1)
{
	INT8U i,crc = 0;
	INT32S reply;
	Down_Sendbuf[0] = 0x68;
	Down_Sendbuf[1] = *add;
	Down_Sendbuf[2] = *(add+1);
	Down_Sendbuf[3] = *(add+2);
	Down_Sendbuf[4] = *(add+3);
	Down_Sendbuf[5] = *(add+4);
	Down_Sendbuf[6] = *(add+5);
	Down_Sendbuf[7] = 0x68;
	Down_Sendbuf[8] = control;
	Down_Sendbuf[9] = 0x02;
	Down_Sendbuf[10] = data0+0x33;
	Down_Sendbuf[11] = data1+0x33;
	for(i=0;i<12;i++)
	{
		crc = Down_Sendbuf[i]+crc;
	}
	//crc = crc%256;
	Down_Sendbuf[12] = crc;
	Down_Sendbuf[13] = 0x16;
	reply = WriteComm(4,Down_Sendbuf,14);
	return reply;
}

/*********************************************************************************************************
** 函数名称: down_data_E91F
** 功能描述: 处理下行接收数据
** 输   入: buf,处理数据的起始地址;
** 输   出: 无
********************************************************************************************************/
void down_data_E91F(INT8U *buf)	
{
	INT8U i,pow[3],buf_v[6];
	INT32U cur_a,cur_b,cur_c,vol_a,vol_b,vol_c,pow_a,pow_b,pow_c,pow_total,temp;
	evaluate(cur_data[0].X9010,buf,4,5);		// (当前)正向有功电能数据块
	evaluate(cur_data[0].X9020,buf+20,4,5);	// (当前)正向无功电能数据块
	evaluate(cur_data[0].X9110,buf+40,4,5);	// (当前)正向无功电能数据块
	evaluate(cur_data[0].X9120,buf+80,4,5);	// (当前)反向无功电能数据块
	evaluate(cur_data[0].X9130,buf+100,4,5);	// (当前)一象限无功电能数据块
	evaluate(cur_data[0].X9150,buf+120,4,5);	// (当前)二象限无功电能数据块
	evaluate(cur_data[0].X9160,buf+140,4,5);	// (当前)三象限无功电能数据块

	buf_v[0] = (((*(buf+161)-0x33)<<4)+((*(buf+160)-0x33)>>4))+0x33;
	buf_v[1] = ((*(buf+161)-0x33)>>4)+0x33;
	buf_v[2] = (((*(buf+163)-0x33)<<4)+((*(buf+162)-0x33)>>4))+0x33;
	buf_v[3] = ((*(buf+163)-0x33)>>4)+0x33;
	buf_v[4] = (((*(buf+165)-0x33)<<4)+((*(buf+164)-0x33)>>4))+0x33;
	buf_v[5] = ((*(buf+165)-0x33)>>4)+0x33;
	
	evaluate(cur_data[0].XB611,buf_v,2,3);	//  电压数据块
	temp = (((INT32U)cur_data[0].XB611[1])<<8)+(INT32U)cur_data[0].XB611[0];
	vol_c = bcd_hex(temp);
	temp = (((INT32U)cur_data[0].XB612[1])<<8)+(INT32U)cur_data[0].XB612[0];
	vol_b = bcd_hex(temp);
	temp = (((INT32U)cur_data[0].XB613[1])<<8)+(INT32U)cur_data[0].XB613[0];
	vol_a = bcd_hex(temp);
	
	evaluate(cur_data[0].XB621,buf+166,2,3);	//  电流数据块
	temp = (((INT32U)cur_data[0].XB621[1])<<8)+(INT32U)cur_data[0].XB621[0];
	cur_c = bcd_hex(temp);
	temp = (((INT32U)cur_data[0].XB622[1])<<8)+(INT32U)cur_data[0].XB622[0];
	cur_b = bcd_hex(temp);
	temp = (((INT32U)cur_data[0].XB623[1])<<8)+(INT32U)cur_data[0].XB623[0];
	cur_a = bcd_hex(temp);
		
	temp = vol_c*cur_c;
	pow_total = temp;
	pow_c = hex_bcd(temp);

⌨️ 快捷键说明

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