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

📄 taskdata.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 5 页
字号:
				Send_Q[i].len = len_frame;
				
				Send_Q[i].state = 1;
				
				break;
			}
			
		}
		num = num_f-count;
//		if(num==0)		//此时表明FLASH1中最后一点数据也属于发送帧中的内容
	}
				
	}
		
	


}


/*********************************************************************************************************
** 函数名称: task_ask_data
** 功能描述: 任务数据的召唤;
** 输   入: 无
** 输   出: 无
********************************************************************************************************/
void task_ask_data(void)
{
	TASK_CALL_STR * pp;
	INT8U taskno,year,month,day,hour,minute;
	INT16U num_ram,num_flash,num_flash_em,num_total,hz;
	INT32U address;
	INT16U cur_year,cur_month,cur_day,cur_hour,cur_minute,cur_week,cur_second;//,year;
	
/*
typedef struct	{
					uint8	ch;					// 01:短信 02:GPRS 05:红外 06:RS232
					uint8	addr[6];			// 主站通讯地址
					uint8	concode;			// 控制码
					uint8	datalen[2];			// 数据长度
					uint8	buf[1024];			// 数据区
							任务号							pp->buf[0]
							数据起始时间(year)	1字节BCD码	pp->buf[1]
							数据起始时间(month)	1字节BCD码	pp->buf[2]
							数据起始时间(day)	1字节BCD码	pp->buf[3]
							数据起始时间(hour)	1字节BCD码	pp->buf[4]
							数据起始时间(minute)1字节BCD码	pp->buf[5]
							历史数据点数					pp->buf[6]
							数据间隔倍率					pp->buf[7]
				} TASK_CALL_STR
*/				
	pp = (TASK_CALL_STR*)(OSMboxAccept(Task_Call_Box));
	
	DateTimeRead(&cur_year,&cur_month,&cur_day,&cur_week,&cur_hour,&cur_minute,&cur_second);
	if(pp)		//如果邮箱返回的是非空指针,则进行任务数据召唤;
	{
		taskno = pp->buf[0];
		year = pp->buf[1];
		month = pp->buf[2]; 
		day = pp->buf[3];
		hour = pp->buf[4];
		minute = pp->buf[5];
		num_total = pp->buf[6];
		hz = pp->buf[7];
		//if((RAM1_TaskDataFat[taskno-1].IntervalSample[1]))
		num_flash_em = 0;
		if(day!=cur_day)	//确定开始的点不在当前的SRAM1中
		{
			//*((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p)+1));
			while((*((volatile unsigned char *)(RAM1_TaskDataFat[taskno-1].AddStartFlash+num_flash_em*(RAM1_TaskDataFat[taskno-1].ByteNum_p)+1)))<month)
			{
				num_flash_em++;
			}
			while((*((volatile unsigned char *)(RAM1_TaskDataFat[taskno-1].AddStartFlash+num_flash_em*(RAM1_TaskDataFat[taskno-1].ByteNum_p)+2)))<day)
			{
				num_flash_em++;
			}
			while((*((volatile unsigned char *)(RAM1_TaskDataFat[taskno-1].AddStartFlash+num_flash_em*(RAM1_TaskDataFat[taskno-1].ByteNum_p)+3)))<hour)
			{
				num_flash_em++;
			}
			while((*((volatile unsigned char *)(RAM1_TaskDataFat[taskno-1].AddStartFlash+num_flash_em*(RAM1_TaskDataFat[taskno-1].ByteNum_p)+4)))<minute)
			{
				num_flash_em++;
			}
			//到此处num_flash_em的值为任务召唤起始时间数据点之前的点数;
			address = RAM1_TaskDataFat[taskno-1].AddStartFlash+num_flash_em*(RAM1_TaskDataFat[taskno-1].ByteNum_p);
			
		}
		else
		{
		
		
		}
		
	}
 
}


/*********************************************************************************************************
** 函数名称: SendTaskData
** 功能描述: 任务数据的上送;
** 输   入: no,任务分配表的表号;
**			 num_r,当日数据区的存放点数;
**			 num_f,FLASH1中的存放点数;
**			 add,FLASH1中开始点的首地址;
** 输   出: 无
** 说    明:同一点的数据不能拆分在连续两帧里进行发送。
********************************************************************************************************/
void SendTaskData(INT8U no,INT16U num_r,INT16U num_f,INT32U add)
{
	INT8U buf[1024];
	static INT8U iseq=0;//ISEQ 帧内序号(D15-D13),PSEQ 帧序号(D12-D6),
	INT8U crc;
	INT32U i,j,count=0;
	INT32U lenth=0,lenth_d,len_frame=0;	//发送长度计数;
	INT32U SendInterval;
	INT16S num,num1,numf_bufen;//,lenthf_bufen;//num_bufen,一次上送帧中在FLASH1中的数据点数;
//	INT16U temp;
	
	


	num = (INT16S)num_f;
	num1 = (INT16S)num_r;
	
	SendInterval = (RAM1_TaskDataFat[no].FhzSend)*(RAM1_TaskDataFat[no].IntervalSample[1]);
	
	if(num_f>0)
	{
//	if(num)
	while(num_f>count)	//对FLASH中数据进行处理;num_f表示要从FLASH1中取出的点数;
	{	
		
		for(i=0;i<1024;i++)	buf[i] = 0;
		buf[0] = RAM1_TaskDataFat[no].TaskNO;		//任务号
		//buf[1] = *((volatile unsigned char *)add+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p));	//年
		buf[1] = *((volatile unsigned char *)add+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+1);
		buf[2] = *((volatile unsigned char *)add+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+2);//月
		buf[3] = *((volatile unsigned char *)add+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+3);//日
		buf[4] = *((volatile unsigned char *)add+(num_f-num)*(RAM1_TaskDataFat[no].ByteNum_p)+4);//时
		buf[5] = *((volatile unsigned char *)add+(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 *)add+(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字节的限制
			if(count>=num_f)	//当上送的点大于要从FLASH1中取出的点时,表示FLASH1中的数据点已发送完,
								//接下来就要从SRAM1中读取数据
								//假如count每次增加的上送频率大于1时,在SRAM1第一次取的有可能不是第一个点;
			{
				
				//lenth = 0;
				//发送完所有点的数据后,直接退出函数;
				numf_bufen = num;	//在FLASH1中最后一次的上送点数的字节数不足发送缓冲区的空间时,在FLASH1中上送点数值
				//lenthf_bufen = lenth;
				//count = RAM1_TaskDataFat[no].FhzSend-(count-num_f)-1;
			
				count = count-num_f;
				while(count<=num_r)
				{
					if(num_r>num1)
					{
					//numf_bufen = 0; 
					for(i=0;i<1024;i++)	buf[i] = 0;
					buf[0] = RAM1_TaskDataFat[no].TaskNO;		//任务号
					//buf[1] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)];	//年
					buf[1] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+1];
					buf[2] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+2];//月
					buf[3] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+3];//日
					buf[4] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+4];//时
					buf[5] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+5];//分
					buf[7] = RAM1_TaskDataFat[no].IntervalSample[0];			//数据间隔单位;
					buf[8] = SendInterval;	//数据间隔数值;
					}	
				while((lenth+RAM1_TaskDataFat[no].ByteNum_p-(count+numf_bufen+num1-num_r)*6/(RAM1_TaskDataFat[no].FhzSend))<1000)
				{
					for(i=0;i<(RAM1_TaskDataFat[no].ByteNum_p)-6;i++)
					{
						if(num_r==num1)
							buf[lenth+i+9-(count+numf_bufen)*6/(RAM1_TaskDataFat[no].FhzSend)] = 
								TaskData[RAM1_TaskDataFat[no].AddStart+count*(RAM1_TaskDataFat[no].ByteNum_p)+i+6];
						else						
							buf[lenth+i+9-(count+num1-num_r)*6/(RAM1_TaskDataFat[no].FhzSend)] = 
								TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+i+lenth+6];
							
					}
					lenth += RAM1_TaskDataFat[no].ByteNum_p;
					count += RAM1_TaskDataFat[no].FhzSend;
					if(num_r==num1)
						{if(((count+numf_bufen)/(RAM1_TaskDataFat[no].FhzSend))==0xff)	break;}	//因为历史数据点数为1字节的限制
					else
						{if(((count+num1-num_r)/(RAM1_TaskDataFat[no].FhzSend))==0xff)	break;}	//因为历史数据点数为1字节的限制
					if(num_r<=count) 
						 goto zhuzheng;
				
				}
	zhuzheng:	if(num_r==num1)	buf[6] = (count+numf_bufen)/(RAM1_TaskDataFat[no].FhzSend);//历史数据点数;
				else buf[6] = (count+num1-num_r)/(RAM1_TaskDataFat[no].FhzSend);		
			//	num_percent = buf[7];
				
			   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;//控制码
						if(num_r==num1)	lenth_d = (count+numf_bufen)*(RAM1_TaskDataFat[no].ByteNum_p-6)/(RAM1_TaskDataFat[no].FhzSend)+9;
						else lenth_d = (count+num1-num_r)*(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;
					}
			
				}
	
	
	
				
				
				if(num_r<=count) return;
				lenth = 0;
				num1 = num_r-count;
				
				}
			
			}
			
		}
		buf[6] = (count+num-num_f)/(RAM1_TaskDataFat[no].FhzSend);		//历史数据点数;
		//num_percent = buf[7];
		
		
		//组帧
		
		
		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 if(num_f==0)	//第一次上送的数据点都在SRAM1中
	{
		//发送完所有点的数据后,直接退出函数;
			
		//lenth = 0;
		//发送完所有点的数据后,直接退出函数;
		//numf_bufen = num;	//在FLASH1中最后一次的上送点数的字节数不足发送缓冲区的空间时,在FLASH1中上送点数值
		//count = RAM1_TaskDataFat[no].FhzSend-(count-num_f)-1;
		//count = count-num_f-1;
		lenth = 0;
		count = 0;
		while(count<=num_r)
		{
			if(num_r<=num1)
			{
				for(i=0;i<1024;i++)	buf[i] = 0;
				buf[0] = RAM1_TaskDataFat[no].TaskNO;		//任务号
				//buf[1] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)];	//年
				buf[1] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+1];
				buf[2] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+2];//月
				buf[3] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+3];//日
				buf[4] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+4];//时
				buf[5] = TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+5];//分
				buf[7] = RAM1_TaskDataFat[no].IntervalSample[0];			//数据间隔单位;
				buf[8] = SendInterval;	//数据间隔数值;
			}	
			while((lenth+RAM1_TaskDataFat[no].ByteNum_p-(count+num1-num_r)*6/(RAM1_TaskDataFat[no].FhzSend))<1000)
			{
				for(i=0;i<(RAM1_TaskDataFat[no].ByteNum_p)-6;i++)
				{
					buf[lenth+i+9-(count+num1-num_r)*6/(RAM1_TaskDataFat[no].FhzSend)] = 
							TaskData[RAM1_TaskDataFat[no].AddStart+(num_r-num1)*(RAM1_TaskDataFat[no].ByteNum_p)+i+lenth+6];
					
				}
				lenth += RAM1_TaskDataFat[no].ByteNum_p;
				count += RAM1_TaskDataFat[no].FhzSend;
				if(((count+num1-num_r)/(RAM1_TaskDataFat[no].FhzSend))==0xff)	break;	//因为历史数据点数为1字节的限制
				if(num_r<=count)  goto zhuzheng1;
			}
			
			
	zhuzheng1:	buf[6] = (count+num1-num_r)/(RAM1_TaskDataFat[no].FhzSend);	//历史数据点数;
				//num_percent = buf[7];
				
		   	for(i=0;i<64;i++)
			{
		
				if(Send_Q[i].state!=1)
				{
					

⌨️ 快捷键说明

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