📄 taskdata1.c
字号:
#include "TaskData.h"
INT8U pseq=0;//ISEQ 帧内序号(D15-D13),PSEQ 帧序号(D12-D6),
INT8U flag_r[32],flag_f[32];
INT32U j_r[32],j_f[32];
/*********************************************************************************************************
** 函数名称: task_data
** 功能描述: 任务数据的采集和存放,任务数据的组帧和上送,任务数据的召唤
** 输 入: 无
** 输 出: 无
********************************************************************************************************/
void task_data(void)
{
task_get_data();
task_send_data();
// task_ask_data();
}
/*********************************************************************************************************
** 函数名称: task_get_data
** 功能描述: 任务数据的采集和存放;
** 输 入: 无
** 输 出: 无
********************************************************************************************************/
void task_get_data(void)
{
static INT8U pre_month[32],pre_day[32],pre_hour[32],pre_minute[32];//本次采样时间
static INT16U pre_year[32];
INT8U i;
INT8U buf[300];//,month,day,hour,minute;
// INT8U buf[20*1024];
// INT32U count;
INT32U m,temp,lenth=0;
INT16U n,cur_year,cur_month,cur_day,cur_hour,cur_minute,cur_week,cur_second;//,year;
//static INT8U flag[32],flag_f[32];
//static INT32U j[32],j_f[32];
DateTimeRead(&cur_year,&cur_month,&cur_day,&cur_week,&cur_hour,&cur_minute,&cur_second);
for(i=0;i<32;i++)
{
if(RAM1_TaskDataFat[i].State)
{
//对于采样时间的单位是时和分的情况;
if((RAM1_TaskDataFat[i].IntervalSample[0]==HOU)||(RAM1_TaskDataFat[i].IntervalSample[0]==MINU))
{
//对FLASH1空间进行处理;
if(!flag_f[i])
{
while((*((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p)))!=0xFF)&&
(*((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p))+1)!=0xFF)&&
(*((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p))+2)!=0xFF)&&
(*((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p))+3)!=0xFF))
{
j_f[i]++;
if(j_f[i]>RAM1_TaskDataFat[i].NumTotal) break;
}
//运行到此处j_f[i]表示第一个没有有效时标和正确数据的数据点;
if(!j_f[i]) //由当日的零点向前推本任务的所有点的时标
{
if(cur_day==1)
{
pre_month[i] = cur_month-1;
// month = pre_month[i];
switch(cur_month)
{
case 1:{
pre_day[i] = 31;
// day = pre_day[i];
pre_year[i] = cur_year-1;
// year = pre_year[i];
}
break;
case 2:
case 4:
case 6:
case 8:
case 9:
case 11:pre_day[i] = 31;
break;
case 3:{
if(((cur_year%4==0)&&(cur_year%100!=0))||(cur_year%400==0)) //闰年
pre_day[i] = 29;
else pre_day[i] = 28; //不闰年
}
break;
case 5:
case 7:
case 10:
case 12:pre_day[i] = 30;
break;
default:break;
}
}
else
{
pre_year[i] = cur_year;
pre_month[i]= cur_month;
pre_day[i] = cur_day-1;
}
//temp = RAM1_TaskDataFat[i].IntervalSample[1];
pre_hour[i] = 24-( RAM1_TaskDataFat[i].IntervalSample[1]/60);
if((RAM1_TaskDataFat[i].TimeSample[1])<(RAM1_TaskDataFat[i].IntervalSample[1]))
{
pre_hour[i] -= 1;
pre_minute[i] = 60 + RAM1_TaskDataFat[i].TimeSample[1] - RAM1_TaskDataFat[i].IntervalSample[1];
}
else
pre_minute[i] = (RAM1_TaskDataFat[i].TimeSample[1])-(RAM1_TaskDataFat[i].IntervalSample[1]);
//写入零点前第一点数据的时标;
temp = hex_bcd(pre_year[i]);
buf[0] = temp>>8;
buf[1] = temp;
temp = hex_bcd(pre_month[i]);
buf[2] = temp;
temp = hex_bcd(pre_day[i]);
buf[3] = temp;
temp = hex_bcd(pre_hour[i]);
buf[4] = temp;
temp = hex_bcd(pre_minute[i]);
buf[5] = temp;
ATMELWrite((RAM1_TaskDataFat[i].AddStartFlash+
((RAM1_TaskDataFat[i].NumTotal)-1)*(RAM1_TaskDataFat[i].ByteNum_p)),
6,
buf);//长度要为偶数;
//写入零点前第一点数据的数据;
//for(m=0;m<300;m++) buf[m] = 0xff;
//ATMELWrite((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+
// ((RAM1_TaskDataFat[i].NumTotal)-1)*(RAM1_TaskDataFat[i].ByteNum_p)+6),
// RAM1_TaskDataFat[i].ByteNum_p-6,
// buf);//长度要为偶数;
//零点之前除第一点外的所有点
//for(m=0;m<(RAM1_TaskDataFat[i].NumTotal-1-(1440/RAM1_TaskDataFat[i].IntervalSample[1]));m++)
for(m=0;m<(RAM1_TaskDataFat[i].NumTotal-1);m++)
//while()
{
if(pre_hour[i] >= (RAM1_TaskDataFat[i].IntervalSample[1]/60))
{
pre_hour[i] -= RAM1_TaskDataFat[i].IntervalSample[1]/60;
}
else
{
pre_hour[i] = pre_hour[i]+24-RAM1_TaskDataFat[i].IntervalSample[1]/60;
//pre_day[i]--;
if(pre_day[i]==1)
{
switch(pre_month[i])
{
case 1:{
pre_day[i] = 31;
pre_year[i] = cur_year-1;
}
break;
case 2:
case 4:
case 6:
case 8:
case 9:
case 11:pre_day[i] = 31;
break;
case 3:{
if(((pre_year[i]%4==0)&&(pre_year[i]%100!=0))||(pre_year[i]%400==0)) //闰年
pre_day[i] = 29;
else pre_day[i] = 28; //不闰年
}
break;
case 5:
case 7:
case 10:
case 12:pre_day[i] = 30;
break;
default:break;
}
pre_month[i] -= 1;
}
else
{
//pre_year[i] = cur_year;
//pre_month[i]= cur_month;
pre_day[i] -= 1;
}
}
if((pre_minute[i])<(RAM1_TaskDataFat[i].IntervalSample[1]))
{
if(pre_hour[i] >= 1) pre_hour[i] -= 1;
else
{
pre_hour[i] = pre_hour[i]+23; //24-1
//pre_day[i]--;
if(pre_day[i]==1)
{
switch(pre_month[i])
{
case 1:{
pre_day[i] = 31;
pre_year[i] = cur_year-1;
}
break;
case 2:
case 4:
case 6:
case 8:
case 9:
case 11:pre_day[i] = 31;
break;
case 3:{
if(((pre_year[i]%4==0)&&(pre_year[i]%100!=0))||(pre_year[i]%400==0)) //闰年
pre_day[i] = 29;
else pre_day[i] = 28; //不闰年
}
break;
case 5:
case 7:
case 10:
case 12:pre_day[i] = 30;
break;
default:break;
}
pre_month[i] -= 1;
}
else
{
//pre_year[i] = cur_year;
//pre_month[i]= cur_month;
pre_day[i] -= 1;
}
}
pre_minute[i] = 60 + pre_minute[i] - RAM1_TaskDataFat[i].IntervalSample[1];
}
else
pre_minute[i] -= (RAM1_TaskDataFat[i].IntervalSample[1]);
//写入零点之前除第一点外的所有点数据的时标;
temp = hex_bcd(pre_year[i]);
buf[0] = temp>>8;
buf[1] = temp;
temp = hex_bcd(pre_month[i]);
buf[2] = temp;
temp = hex_bcd(pre_day[i]);
buf[3] = temp;
temp = hex_bcd(pre_hour[i]);
buf[4] = temp;
temp = hex_bcd(pre_minute[i]);
buf[5] = temp;
ATMELWrite((RAM1_TaskDataFat[i].AddStartFlash+
(RAM1_TaskDataFat[i].NumTotal-m-2)*(RAM1_TaskDataFat[i].ByteNum_p)),
6,
buf);//长度要为偶数;
//写入零点之前除第一点外的所有点数据的数据;
//for(n=0;n<300;n++) buf[n] = 0xff;
//ATMELWrite((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+
// (RAM1_TaskDataFat[i].NumTotal-2-m)*(RAM1_TaskDataFat[i].ByteNum_p)+6),
// RAM1_TaskDataFat[i].ByteNum_p-6,
// buf);//长度要为偶数;
}
////由当日的零点向前推本任务的所有点的时标时,当日第一点数据的时标
pre_year[i] = cur_year;
pre_month[i] = cur_month;
pre_day[i] = cur_day;
pre_hour[i] = (RAM1_TaskDataFat[i].TimeSample[1])/60;
pre_minute[i] = (RAM1_TaskDataFat[i].TimeSample[1])%60;
}
else //由历史数据空间中有效数据的时标向后推到当日零点之前的最后一个有效数据点;
{
pre_year[i] = ((INT16U)(*((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p))))<<8)+
*((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p)+1));
pre_month[i] = *((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p)+2));
pre_day[i] = *((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p)+3));
pre_hour[i] = *((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p)+4));
pre_minute[i] = *((volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p)+5));
while(pre_day[i]!=cur_day)
{
temp = pre_minute[i]+RAM1_TaskDataFat[i].IntervalSample[1];
pre_minute[i] = temp%60;
pre_hour[i] += temp/60;
if(pre_hour[i]>24)
{
pre_hour[i] = 0;
pre_day[i] += 1;
switch(pre_month[i])
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
{
if(pre_day[i]==32)
{
pre_day[i]=1;
pre_month[i]++;
}
}
break;
case 12:{
if(pre_day[i]==32)
{
pre_day[i]=1;
pre_month[i]=1;
pre_year[i]++;
}
}
break;
case 4:
case 6:
case 9:
case 11:
{
if(pre_day[i]==31)
{
pre_day[i]=1;
pre_month[i]++;
}
}
break;
case 2:{
if(((pre_year[i]%4==0)&&(pre_year[i]%100!=0))||(pre_year[i]%400==0)) //闰年
{
if(pre_day[i] == 30)
{
pre_day[i]=1;
pre_month[i]++;
}
}
else
{
if(pre_day[i] == 29) //不闰年
{
pre_day[i]=1;
pre_month[i]++;
}
}
}
break;
default:break;
}//switch(pre_month[i])
}//if(pre_hour[i]>24)
temp = hex_bcd(pre_year[i]);
buf[0] = temp>>8;
buf[1] = temp;
temp = hex_bcd(pre_month[i]);
buf[2] = temp;
temp = hex_bcd(pre_day[i]);
buf[3] = temp;
temp = hex_bcd(pre_hour[i]);
buf[4] = temp;
temp = hex_bcd(pre_minute[i]);
buf[5] = temp;
EraseWriteFlash(buf,
(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p)),
6);//长度要为偶数;
//写入零点之前除第一点外的所有点数据的数据;
/*for(m=0;m<300;m++) buf[m] = 0xFF;
EraseWriteFlash(buf,
(volatile unsigned char *)(RAM1_TaskDataFat[i].AddStartFlash+j_f[i]*(RAM1_TaskDataFat[i].ByteNum_p)+6),
RAM1_TaskDataFat[i].ByteNum_p-6);//长度要为偶数;
*/
j_f[i]++;
}//while(pre_day[i]!=cur_day)
////由历史数据空间中有效数据的时标向后推到当日零点之前的最后一个有效数据点时标;
////从而计算出当日的第一点数据的时标;
temp = pre_minute[i]+RAM1_TaskDataFat[i].IntervalSample[1];
pre_minute[i] = temp%60;
pre_hour[i] += temp/60;
if(pre_hour[i]>24)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -