📄 taskdata.c
字号:
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 + -