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

📄 taskdata.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 5 页
字号:
	//INT8U buf[1024];
	//INT8U send_flag[32];//在每个上送间隔时间内,上送标志:0,未上送,    1,已上送;
	INT16U temp,cur_year,cur_month,cur_day,cur_week,cur_hour,cur_minute,cur_second;
	
	//INT16U n;
	INT32U add_start;
	INT8U i;
//	INT16U count;//用于发送间隔是日或月的发送计数;
	static INT8U send_flag[32];//在每个上送间隔时间内,上送标志:0,未上送,    1,已上送;

	
	//static INT8U flag[32];
	
	INT16U num_flash,num_ram;  //上送数据在FLASH和RAM中的点数;
	
	INT32U Timebuf[4];
	
	//调试用
	//for(i=0;i<64;i++)
	//	Send_Q[i].state = 0;
			
	
	
	for(i=0;i<32;i++)
	{
		if(RAM1_TaskDataFat[i].State)
		{
			
			//在每个上送时间点清除上送标志
			DateTimeRead(&cur_year,&cur_month,&cur_day,&cur_week,&cur_hour,&cur_minute,&cur_second);
						
			//上送数据
			
			
			//对于发送间隔的单位是时和分的情况;
			if((RAM1_TaskDataFat[i].IntervalSend[0]==HOU)||(RAM1_TaskDataFat[i].IntervalSend[0]==MINU))
			{
			
			if((cur_hour*60+cur_minute)>=RAM1_TaskDataFat[i].TimeSend[1])
			{
			if(((cur_hour*60+cur_minute-RAM1_TaskDataFat[i].TimeSend[1])%(RAM1_TaskDataFat[i].IntervalSend[1]))<=2)
			
			{
				num_ram = 0;
				
				{
				//判断此时是否为上送时间点(2分钟内)
					if(send_flag[i]!=1)
					{
					
					
						//到RAM中寻找该时间点之前最近的数据采样点
						temp = bcd_hex(TaskData[RAM1_TaskDataFat[i].AddStart+4])*60+bcd_hex(TaskData[RAM1_TaskDataFat[i].AddStart+5]);
						if((cur_hour*60+cur_minute)>=(temp+RAM1_TaskDataFat[i].IntervalSample[1]))
							
						{
							while((cur_hour*60+cur_minute)>=(temp+RAM1_TaskDataFat[i].IntervalSample[1]))
							{
								
								temp = bcd_hex(TaskData[RAM1_TaskDataFat[i].AddStart+num_ram*RAM1_TaskDataFat[i].ByteNum_p+4])*60+
												bcd_hex(TaskData[RAM1_TaskDataFat[i].AddStart+num_ram*RAM1_TaskDataFat[i].ByteNum_p+5]);
								num_ram++;
							}
						} 
						//到此处num_ram的值为当前上送时间点之前最近的数据采样点的点号;
						//SendInterval = (RAM1_TaskDataFat[i].FhzSend)*(RAM1_TaskDataFat[i].IntervalSample[1]);
						if(RAM1_TaskDataFat[i].NumTotal>=num_ram)
						{
							num_flash = RAM1_TaskDataFat[i].NumTotal-num_ram;
							add_start = RAM1_TaskDataFat[i].AddStartFlash+(RAM1_TaskDataFat[i].NumTotal-num_flash)*RAM1_TaskDataFat[i].ByteNum_p;
						}
						else //所有的上送数据都在SRAM1中;
						{
							num_flash = 0;
							add_start = RAM1_TaskDataFat[i].AddStart+(num_ram-RAM1_TaskDataFat[i].NumTotal)*RAM1_TaskDataFat[i].ByteNum_p;
						}
						SendTaskData(i,num_ram,num_flash,add_start);
						send_flag[i] = 1;					
					}

				}
			
			}
			else	send_flag[i] = 0;
			}
			}
			//else if((RAM1_TaskDataFat[i].IntervalSend[0]==DAY)||(RAM1_TaskDataFat[i].IntervalSend[0]==MON))
			else if(RAM1_TaskDataFat[i].IntervalSend[0]==DAY)
			{	
				TimeCount((cur_year-2000),cur_month,cur_day,cur_hour,cur_minute,Timebuf);
							
					if(RAM1_TaskDataFat[i].TimeSend[0]==DAY)
					{
						if(Timebuf[1]%(RAM1_TaskDataFat[i].IntervalSend[1])==(RAM1_TaskDataFat[i].TimeSend[1]))
						if((cur_hour==0)&&(cur_minute==0))
							SendData(i);
					}
					else if(RAM1_TaskDataFat[i].TimeSend[0]==HOU)
					{
						if(Timebuf[1]%(RAM1_TaskDataFat[i].IntervalSend[1])==0)
						if((cur_hour==(RAM1_TaskDataFat[i].TimeSend[1]/60))&&(cur_minute==0))
							SendData(i);
					
					}
					else if(RAM1_TaskDataFat[i].TimeSend[0]==MINU)
					{
						if(Timebuf[1]%(RAM1_TaskDataFat[i].IntervalSend[1])==0)
						if((cur_hour==0)&&(cur_minute==RAM1_TaskDataFat[i].TimeSend[1]))
							SendData(i);
					
					}
				
				
			
			}
			else if(RAM1_TaskDataFat[i].IntervalSample[0]==MON)
			{
				TimeCount((cur_year-2000),cur_month,cur_day,cur_hour,cur_minute,Timebuf);
				
				
					if(RAM1_TaskDataFat[i].TimeSend[0]==MON)
					{
						if(Timebuf[0]%(RAM1_TaskDataFat[i].IntervalSend[1])==(RAM1_TaskDataFat[i].TimeSend[1]))
						if((cur_day==1)&&(cur_hour==0)&&(cur_minute==0))
							SendData(i);
					}
					else if(RAM1_TaskDataFat[i].TimeSend[0]==DAY)
					{
						if(Timebuf[0]%(RAM1_TaskDataFat[i].IntervalSend[1])==0)
						if((cur_day==RAM1_TaskDataFat[i].TimeSend[1])&&(cur_hour==0)&&(cur_minute==0))
							SendData(i);
					}
					else if(RAM1_TaskDataFat[i].TimeSend[0]==HOU)
					{
						if(Timebuf[0]%(RAM1_TaskDataFat[i].IntervalSend[1])==0)
						if((cur_day==1)&&(cur_hour==RAM1_TaskDataFat[i].TimeSend[1])&&(cur_minute==0))
							SendData(i);
					
					}
					else if(RAM1_TaskDataFat[i].TimeSend[0]==MINU)
					{
						if(Timebuf[0]%(RAM1_TaskDataFat[i].IntervalSend[1])==0)
						if((cur_day==1)&&(cur_hour==0)&&(cur_minute==RAM1_TaskDataFat[i].TimeSend[1]))
							SendData(i);
					
					}
				
				
			
			
			}
		}
	}
	
}





void SendData(INT8U no)
{
	INT16U count,i,j,num,num_f;
	INT32U lenth=0,lenth_d,len_frame=0;	//发送长度计数;
	INT8U buf[1024],crc;
	INT32U SendInterval;
	static INT8U iseq=0;//ISEQ 帧内序号(D15-D13),PSEQ 帧序号(D12-D6),
	
	
	SendInterval = (RAM1_TaskDataFat[no].FhzSend)*(RAM1_TaskDataFat[no].IntervalSample[1]);
	//当日SRAM1中没有采样到有效的数据点
	count = 0;
	num_f = RAM1_TaskDataFat[no].NumTotal;
	num = (INT16S)num_f;
	
	if((TaskData[RAM1_TaskDataFat[no].AddStart]==0)&&(TaskData[RAM1_TaskDataFat[no].AddStart+1]==0)&&
		(TaskData[RAM1_TaskDataFat[no].AddStart+2]==0)&&(TaskData[RAM1_TaskDataFat[no].AddStart+3]==0))
	{
	
		
	while(num_f>count)	//对FLASH中数据进行处理;num_f表示要从FLASH1中取出的点数;
	{	
		
		for(i=0;i<1024;i++)	buf[j] = 0;
		buf[0] = RAM1_TaskDataFat[no].TaskNO;		//任务号
		//buf[1] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p));	//年
		buf[1] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+1);
		buf[2] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+2);//月
		buf[3] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+3);//日
		buf[4] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+4);//时
		buf[5] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+5);//分
		buf[7] = RAM1_TaskDataFat[no].IntervalSample[0];			//数据间隔单位;
		buf[8] = SendInterval;	//数据间隔数值;
		
		lenth = 0;
		

		while((lenth+RAM1_TaskDataFat[no].ByteNum_p-(count+num-num_f)*6/(RAM1_TaskDataFat[no].FhzSend))<1000)	//RAM1_TaskDataFat[no].ByteNum_p
		{
			
			for(i=0;i<(RAM1_TaskDataFat[no].ByteNum_p)-6;i++)
			{
				buf[lenth+i+9-(count+num-num_f)*6/(RAM1_TaskDataFat[no].FhzSend)] = 
					*((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+lenth+i+6);
			}
			lenth += RAM1_TaskDataFat[no].ByteNum_p;
			count += RAM1_TaskDataFat[no].FhzSend;
			if(((count+num-num_f)/(RAM1_TaskDataFat[no].FhzSend))==0xff)	break;	//因为历史数据点数为1字节的限制
		}
			buf[6] = (count+num-num_f)/(RAM1_TaskDataFat[no].FhzSend);		//历史数据点数;
		
		
		
		//组帧
		
		
		for(i=0;i<64;i++)
		{
		
		
			if(Send_Q[i].state!=1)
			{
				for(j=0;j<1024;j++)		Send_Q[i].buf[j] = 0;
				Send_Q[i].flag = 1;
				Send_Q[i].ch = 02;
				//Send_Q[i].ch = 06;	//调试时先用RS232通道;
									//实际运行时,通过X8010[9]获得通信通道类型,从而确定每帧发送的最大长度;
				Send_Q[i].count = 0;//已发送次数;
				Send_Q[i].buf[0] = 0x68;
				Send_Q[i].buf[1] = ParamInSram.Term_Par.X8016[1];		//终端逻辑地址-地市码(A1);
				Send_Q[i].buf[2] = ParamInSram.Term_Par.X8016[0];		//终端逻辑地址-区县码(A2);
				Send_Q[i].buf[3] = ParamInSram.Term_Par.X8017[1];		//终端逻辑地址-终端地址(A3);
				Send_Q[i].buf[4] = ParamInSram.Term_Par.X8017[0];		//终端逻辑地址-终端地址(A4);
				pseq++;							//帧序号
				if(pseq>=0x7f)	pseq = 1;
				if((RAM1_TaskDataFat[no].NumTotal)*(RAM1_TaskDataFat[no].ByteNum_p)<1000)
					iseq = 0;					//帧内序号
				else iseq ++;
				
				Send_Q[i].buf[5] = ((pseq&0x03)<<6)+0;	//buf[5]和buf[6]表示主站地址和命令序号
				Send_Q[i].buf[6] = ((iseq&0x07)<<5)+((pseq&0x7c)>>2);
				Send_Q[i].buf[7] = 0x68;
				Send_Q[i].buf[8] = 0x82;//控制码
				lenth_d = (count+num-num_f)*(RAM1_TaskDataFat[no].ByteNum_p-6)/(RAM1_TaskDataFat[no].FhzSend)+9;
				Send_Q[i].buf[9] = (INT8U)lenth_d;//数据域长度
				Send_Q[i].buf[10] = (INT8U)(lenth_d>>8);
				for(j=0;j<lenth_d;j++)
				{
					Send_Q[i].buf[j+11] = buf[j];
				}  
				len_frame = 13+lenth_d;	//整个帧的长度,包括校验码和帧尾
				for(j=0;j<(len_frame-2);j++)
				{
					crc += Send_Q[i].buf[j];
				}
				Send_Q[i].buf[len_frame-2] = crc;
				Send_Q[i].buf[len_frame-1] = 0x68;
				Send_Q[i].len = len_frame;
				
				Send_Q[i].state = 1;
				
				break;
			}
			
		}
		num = num_f-count;
//		if(num==0)		//此时表明FLASH1中最后一点数据也属于发送帧中的内容
	}
				
	}
	
	else 
	{
	num_f--;
	
	while(num_f>count)	//对FLASH中数据进行处理;num_f表示要从FLASH1中取出的点数;
	{	
		
		for(j=0;j<1024;j++)	buf[j] = 0;
		buf[0] = RAM1_TaskDataFat[no].TaskNO;		//任务号
		buf[1] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num+1)*(RAM1_TaskDataFat[no].ByteNum_p));	//年
		buf[2] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num+1)*(RAM1_TaskDataFat[no].ByteNum_p)+1);
		buf[3] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num+1)*(RAM1_TaskDataFat[no].ByteNum_p)+2);//月
		buf[4] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num+1)*(RAM1_TaskDataFat[no].ByteNum_p)+3);//日
		buf[5] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num+1)*(RAM1_TaskDataFat[no].ByteNum_p)+4);//时
		buf[6] = *((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num+1)*(RAM1_TaskDataFat[no].ByteNum_p)+5);//分
		buf[8] = RAM1_TaskDataFat[no].IntervalSample[0];			//数据间隔单位;
		buf[9] = SendInterval;	//数据间隔数值;
		
		lenth = 0;
		

		while((lenth+RAM1_TaskDataFat[no].ByteNum_p-(count+num-num_f)*6/(RAM1_TaskDataFat[no].FhzSend))<1000)	//RAM1_TaskDataFat[no].ByteNum_p
		{
			
			for(i=0;i<(RAM1_TaskDataFat[no].ByteNum_p)-6;i++)
			{
				buf[lenth+i+10-(count+num-num_f)*6/(RAM1_TaskDataFat[no].FhzSend)] = 
					*((volatile unsigned char *)(RAM1_TaskDataFat[no].AddStart)+(num_f-num+1)*(RAM1_TaskDataFat[no].ByteNum_p)+lenth+i+6);
			}
			lenth += RAM1_TaskDataFat[no].ByteNum_p;
			count += RAM1_TaskDataFat[no].FhzSend;
			if(((count+num-num_f)/(RAM1_TaskDataFat[no].FhzSend))==0xff)	break;	//因为历史数据点数为1字节的限制
			if(count>num_f)
			{
				if(count>(num_f+1))  break;
				else 
				{
					if((lenth+RAM1_TaskDataFat[no].ByteNum_p-(count+num-num_f)*6/(RAM1_TaskDataFat[no].FhzSend))<1000)
					{
						for(i=0;i<(RAM1_TaskDataFat[no].ByteNum_p)-6;i++)
						{
							buf[lenth+i+10-(count+num-num_f)*6/(RAM1_TaskDataFat[no].FhzSend)] =
								TaskData[RAM1_TaskDataFat[no].AddStart+6+i];
						}
					}
					else
					{
						for(j=0;j<1024;j++)	buf[j] = 0;
						buf[0] = RAM1_TaskDataFat[no].TaskNO;		//任务号
						buf[1] = TaskData[RAM1_TaskDataFat[no].AddStart];	//年
						buf[2] = TaskData[RAM1_TaskDataFat[no].AddStart+1];
						buf[3] = TaskData[RAM1_TaskDataFat[no].AddStart+2];//月
						buf[4] = TaskData[RAM1_TaskDataFat[no].AddStart+3];//日
						buf[5] = TaskData[RAM1_TaskDataFat[no].AddStart+4];//时
						buf[6] = TaskData[RAM1_TaskDataFat[no].AddStart+5];//分
						buf[8] = RAM1_TaskDataFat[no].IntervalSample[0];			//数据间隔单位;
						buf[9] = SendInterval;	//数据间隔数值
					
					
						for(i=0;i<(RAM1_TaskDataFat[no].ByteNum_p)-6;i++)
						{
							buf[i+10] =	TaskData[RAM1_TaskDataFat[no].AddStart+6+i];
						}
						buf[7] = 1;
						goto  zuzheng;
					}
				}
			}
		}
		buf[7] = (count+num-num_f)/(RAM1_TaskDataFat[no].FhzSend);		//历史数据点数;
		
		
		
		//组帧
		
zuzheng:		
		for(i=0;i<64;i++)
		{
		
		
			if(Send_Q[i].state!=1)
			{
				for(j=0;j<1024;j++)		Send_Q[i].buf[j] = 0;
				Send_Q[i].flag = 1;
				Send_Q[i].ch = 02;
				//Send_Q[i].ch = 06;	//调试时先用RS232通道;
									//实际运行时,通过X8010[9]获得通信通道类型,从而确定每帧发送的最大长度;
				Send_Q[i].count = 0;//已发送次数;
				Send_Q[i].buf[0] = 0x68;
				Send_Q[i].buf[1] = ParamInSram.Term_Par.X8016[1];		//终端逻辑地址-地市码(A1);
				Send_Q[i].buf[2] = ParamInSram.Term_Par.X8016[0];		//终端逻辑地址-区县码(A2);
				Send_Q[i].buf[3] = ParamInSram.Term_Par.X8017[1];		//终端逻辑地址-终端地址(A3);
				Send_Q[i].buf[4] = ParamInSram.Term_Par.X8017[0];		//终端逻辑地址-终端地址(A4);
				pseq++;							//帧序号
				if(pseq>=0x7f)	pseq = 1;
				if((RAM1_TaskDataFat[no].NumTotal)*(RAM1_TaskDataFat[no].ByteNum_p)<1000)
					iseq = 0;					//帧内序号
				else iseq ++;
				
				Send_Q[i].buf[5] = ((pseq&0x03)<<6)+0;	//buf[5]和buf[6]表示主站地址和命令序号
				Send_Q[i].buf[6] = ((iseq&0x07)<<5)+((pseq&0x7c)>>2);
				Send_Q[i].buf[7] = 0x68;
				Send_Q[i].buf[8] = 0x82;//控制码
				lenth_d = (count+num-num_f)*(RAM1_TaskDataFat[no].ByteNum_p-6)/(RAM1_TaskDataFat[no].FhzSend)+10;
				Send_Q[i].buf[9] = (INT8U)lenth_d;//数据域长度
				Send_Q[i].buf[10] = (INT8U)(lenth_d>>8);
				for(j=0;j<lenth_d;j++)
				{
					Send_Q[i].buf[j+11] = buf[j];
				}  
				len_frame = 13+lenth_d;	//整个帧的长度,包括校验码和帧尾
				for(j=0;j<(len_frame-2);j++)
				{
					crc += Send_Q[i].buf[j];
				}
				Send_Q[i].buf[len_frame-2] = crc;
				Send_Q[i].buf[len_frame-1] = 0x68;

⌨️ 快捷键说明

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