?? transflow.c
字號:
#include <reg51.h>
#include <absacc.h>
sbit WatchDog = P1^3; //看門狗
extern unsigned char xdata send_liul[32],send_occ[32];
extern unsigned int xdata loop_ratio[32];
unsigned char xdata T;
unsigned char xdata fl,fh;
unsigned char xdata last_recetimeid,record_day;
unsigned char xdata steptime[16];
extern unsigned int xdata data_address;
extern unsigned int xdata address;
extern unsigned int xdata tr_flagaddr;
extern unsigned char xdata now_day_planid;
extern unsigned char xdata period_sch[41];
extern unsigned char xdata now_step_schid;
extern unsigned char xdata timeid;
extern unsigned int xdata savecount;
extern unsigned char xdata sch_step[16];
extern unsigned char xdata selcal_flag;
unsigned char xdata per[24][70];
extern unsigned char xdata per_count;
trans_volum() //流量和占有率發送程序,在周期結束時,發送到FPGA板
{
unsigned char i;
savecount++;
while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){}; //等待FGPA修改頭尾
XBYTE[0xa023]=0x01; //CPU修改頭尾
XBYTE[0xa024]=0X00;
data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
data_address=(data_address&0x7ff);
address=data_address;
data_address=data_address+70; //應答數據長度70字節
if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
data_address--;
XBYTE[0XA021]=data_address>>8; //
XBYTE[0XA022]=data_address;
XBYTE[0XA023]=0X00; //CPU修改頭尾結束
XBYTE[0XA024]=0X00;
for(i=0;i<6;i++){
tr_flagaddr=0XA030+5*i;
if(XBYTE[tr_flagaddr]==0x87)break;
}
if(i==6)return 1;
XBYTE[tr_flagaddr+1]=address>>8; //發送數據的首地址
XBYTE[tr_flagaddr+2]=address;
XBYTE[tr_flagaddr+3]=data_address>>8; //發送數據的尾地址
XBYTE[tr_flagaddr+4]=data_address;
address=address+0xa000; //發送應答數據
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0XFD; //發送標識
// SBUF=XBYTE[address];while(!TI);TI=0; /////////////////////////////////////////
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC008]; //發送月
// SBUF=XBYTE[address];while(!TI);TI=0; /////////////////////////////////////////
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC007]; //日
// SBUF=XBYTE[address];while(!TI);TI=0; /////////////////////////////////////////
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC004]; //時
// SBUF=XBYTE[address];while(!TI);TI=0; /////////////////////////////////////////
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC002]; //分
// SBUF=XBYTE[address];while(!TI);TI=0; /////////////////////////////////////////
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC000]; //秒
// SBUF=XBYTE[address];while(!TI);TI=0; /////////////////////////////////////////
address++;
if(address>0xa7f0)address=0xa080;
for(i=0;i<32;i++){
XBYTE[address]=send_liul[i]; //發送流量
// SBUF=XBYTE[address];while(!TI);TI=0; /////////////////////////////////////////
address++;
if(address>0xa7f0)address=0xa080;
send_occ[i]=(loop_ratio[i]*10/1000)/T;
XBYTE[address]=send_occ[i]; //發送占有率
// SBUF=XBYTE[address];while(!TI);TI=0; /////////////////////////////////////////
address++;
if(address>0xa7f0)address=0xa080;
}
XBYTE[tr_flagaddr]=0x01;
for(i=0;i<32;i++){
send_liul[i]=0;
send_occ[i]=0;
loop_ratio[i]=0;
}
// SBUF=0XFF;
// while(!TI);TI=0;
for(i=0;i<32;i++){
send_liul[i]=0;
send_occ[i]=0;
loop_ratio[i]=0;
}
}
void self_learn() using 1
{
unsigned char i,j,k;
unsigned char good;
unsigned int addr;
for(i=0;i<16;i++){ //本周期結束的時候
good=period_sch[9+i];
for(j=0;j<70;j++){
if((j==good)&&(j!=0))per[i][j]++;
}
}
//時段切換后計算學習結果
if(last_recetimeid!=timeid){
for(i=0;i<16;i++){ //對上次能學習結果清0
steptime[i]=0;
}
for(i=0;i<16;i++){
good=0;
for(j=0;j<70;j++){
if(good<=per[i][j])good=per[i][j];
}
k=0;
do{
k++;
}while(per[i][k-1]!=good);
k--;
steptime[i]=k;
}
addr=(last_recetimeid-1)*16;
record_day=XBYTE[0XC006];
if(record_day>7)record_day=3;
addr=addr+(record_day-1)*384;
addr=addr+0x3f00;
for(i=0;i<16;i++){//寫到0X3F00開始的地址
XBYTE[addr+i]=steptime[i];
}
for(i=0;i<41;i++){// 清空自學習緩沖區
period_sch[i]=0;
}
for(i=0;i<32;i++){ //mei
for(j=0;j<70;j++){
per[i][j]=0;
}
}
}
last_recetimeid=period_sch[3];
}
void tran_psh() //每周期發送一次方案
{
selcal_flag=0;
// unsigned char i;
// period_sch[0]=0x20; //當前方案號 方案32作為備用降級方案
period_sch[0]=now_day_planid; //當前日計劃號
period_sch[1]=now_step_schid; //當前的階段表號
period_sch[3]=timeid; //當前的時段號
period_sch[6]=XBYTE[0XC006]; //當前星期號
self_learn();
/*
while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){}; //等待FGPA修改頭尾
XBYTE[0xa023]=0x01; //CPU修改頭尾
XBYTE[0xa024]=0X00;
data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
address=data_address;
data_address=data_address+43; //應答數據長度+1字節
if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
data_address--;
XBYTE[0XA021]=data_address>>8; //
XBYTE[0XA022]=data_address;
XBYTE[0XA023]=0X00; //CPU修改頭尾結束
XBYTE[0XA024]=0X00;
for(i=0;i<6;i++){
tr_flagaddr=0XA030+5*i;
if(XBYTE[tr_flagaddr]==0x87)break;
}
//if(i==6)return 1;
XBYTE[tr_flagaddr+1]=address>>8; //發送數據的首地址
XBYTE[tr_flagaddr+2]=address;
XBYTE[tr_flagaddr+3]=data_address>>8; //發送數據的尾地址
XBYTE[tr_flagaddr+4]=data_address;
address=address+0xa000; //發送應答數據
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0Xc6; //采用應答方式發送當前方案給FPGA
address++;
if(address>0xa7f0)address=0xa080;
for(i=0;i<41;i++){
XBYTE[address]=period_sch[i];
address++;
if(address>0xa7f0)address=0xa080;
}
XBYTE[address]=0; //湊個偶數
XBYTE[tr_flagaddr]=0x01;
*/
}
void ask_sch()
{
unsigned char i,day;
unsigned addr_r;
day = XBYTE[0XC006]; /*星期*/
if(day>7)day=3;
addr_r=0x3f00+(day-1)*384+(timeid-1)*16;
for(i=0;i<16;i++){
sch_step[i]=XBYTE[addr_r+i];
}
/* unsigned char i;
unsigned char te;
fl=XBYTE[0xa023];
fh=XBYTE[0xa024];
while((fl==0)&&(fh==1)){}; //等待FGPA修改頭尾
XBYTE[0xa023]=0x01; //CPU修改頭尾
XBYTE[0xa024]=0X00;
data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
address=data_address;
data_address=data_address+3; //應答數據長度+1字節
if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
data_address--;
XBYTE[0XA021]=data_address>>8; //
XBYTE[0XA022]=data_address;
XBYTE[0XA023]=0X00; //CPU修改頭尾結束
XBYTE[0XA024]=0X00;
for(i=0;i<6;i++){
tr_flagaddr=0XA030+5*i;
if(XBYTE[tr_flagaddr]==0x87)break;
}
//if(i==6)return 1;
XBYTE[tr_flagaddr+1]=address>>8; //發送數據的首地址
XBYTE[tr_flagaddr+2]=address;
XBYTE[tr_flagaddr+3]=data_address>>8; //發送數據的尾地址
XBYTE[tr_flagaddr+4]=data_address;
address=address+0xa000; //發送應答數據
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0X86; //發送查詢標識條件,考慮增加日計劃,方案等查詢條件
address++;
if(address>0xa7f0)address=0xa080;
te=timeid+1;
XBYTE[address]=te; //查詢的時段
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC006]; //查詢的周日類型
XBYTE[tr_flagaddr]=0x01;
*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -