📄 hzmmimain18.c
字号:
for(;;)
{//取得当前汉化表指针
const CSTR *p;
p=(const CSTR *)sbxh[EEPROMread(eep_sbxh)].HzTable;
face_str=p[1].str;
SetTable=(const DaiMa *)p[2].str;
AnalogTable=(const DaiMa *)p[3].str;
KeyTable=(const DaiMa *)p[4].str;
ReportTable=(const DaiMa *)p[5].str;
CTL_DOT_CPU=(const CSTR *)p[6].str;
work_mode=(word)p[7].str;
if(work_mode&0x1000)
{
WORK_SETTING_AREA=(word)p[8].str;
TOTAL_SETTING_AREA=(word)p[9].str;
}
else
{
WORK_SETTING_AREA=16;
TOTAL_SETTING_AREA=8;
}
break;
}
STATUS_WORD=0;
RPT_TIME[0]=0x5a;
if(EEPROMread(eep_CPU_NUB+7)!=1)
{//如果未对cpu板设置过,则以开出表为依据设置cpu板投退
EEPROMwrite(eep_CPU_NUB+7,1);
for(i=1;i<=TOTAL_CPU_NUMBER;i++)
if(CTL_DOT_CPU[i].str==0)
EEPROMwrite(eep_CPU_NUB+i,0);
else
{
if((word)CTL_DOT_CPU[i].str==1)
{//对有录波板的装置,初始化录波报告设置
EEPROMwrite(eep_lb_r,EEPROMread(eep_lb_r)&1);
EEPROMwrite(eep_lb_d,EEPROMread(eep_lb_d)&1);
EEPROMwrite(eep_lb_u,(((EEPROMread(eep_lb_u)-1)&0x0f)+1)&0x0f);
EEPROMwrite(eep_lb_i,(((EEPROMread(eep_lb_i)-1)&0x0f)+1)&0x0f);
}
EEPROMwrite(eep_CPU_NUB+i,1);
}
}
for(i=0;i<=TOTAL_CPU_NUMBER;i++)
if(EEPROMread(eep_CPU_NUB+i)>=2)//如果对应cpu板设置有错,则置为无效
EEPROMwrite(eep_CPU_NUB+i,0);
poll_seq=0;
CPU_ID=0;
for(i=1;i<=TOTAL_CPU_NUMBER;i++)
if(EEPROMread(eep_CPU_NUB+i)==1)
{
poll_seq=i;
CPU_ID++;//投入的cpu板个数
Q_KEY[poll_seq]=0xaa;
}
if((CPU_ID==0)||(poll_seq==1))
{//只有一个CPU板且为CPU1
if(EEPROMread(eep_CPU_NUB+0)!=1)
EEPROMwrite(eep_CPU_NUB+0,1);
if(EEPROMread(eep_CPU_NUB+1)!=1)
EEPROMwrite(eep_CPU_NUB+1,1);
poll_seq=1;
CPU_ID=1;
cpu_name=1;
}
else//不止一个CPU板或不为CPU1
if((CPU_ID!=1)||(poll_seq!=1))
if(EEPROMread(eep_CPU_NUB+0)!=0)
EEPROMwrite(eep_CPU_NUB+0,0);
cpu_name=poll_seq;
CPU_ID=poll_seq<<5;
}
//毫秒定时器
void ms_cont_routine(void)//各定时器减一操作,减为一置到时标志;
{
if(trigger)
{
if(trigger_t>trigger)
trigger_t=trigger-1;
else
if(trigger_t)trigger_t--;
else
{
trigger_t=trigger-1;
trigger_f=TRUE;
}
}
if(poll_timer)
{
if(poll_timer_t>poll_timer)
poll_timer_t=poll_timer-1;
else
if(poll_timer_t)poll_timer_t--;
else
{
poll_timer_t=poll_timer-1;
poll_timer_f=TRUE;
}
}
if(lamp_last_timer)lamp_last_timer--;
if(wait_synch_timer>LON_WAITTIME)
wait_synch_timer=LON_WAITTIME;
if(wait_synch_timer)wait_synch_timer--;
if(synch_timer>LON_WAITTIME)
synch_timer=LON_WAITTIME;
if(synch_timer)synch_timer--;
if(comm_timer>COM_TIMEOUT)
comm_timer=COM_TIMEOUT;
if(comm_timer)comm_timer--;
}
//秒定时器
void s_cont_routine(void)//各定时器减一操作,减为零时,置到时标志;
{
clock_timer_f=TRUE;
s_count++;
if(comm_timer>10)
comm_timer=10;
if(cycle_timer)
{
if(cycle_timer_t)cycle_timer_t--;
else
{
cycle_timer_t=cycle_timer-1;
cycle_timer_f=TRUE;
}
}
if(key_timer)key_timer--;
if(ATTENTION_timer>60)
ATTENTION_timer=60;
if(ATTENTION_timer)ATTENTION_timer--;
if(detect_timer)detect_timer--;
if(desk_pause>10)
desk_pause=10;
if(desk_pause)desk_pause--;
}
//计算与cpu串口通讯数据的校验和;
byte chk_sum(word rcv_cnt)
{
byte sum;
word i;
sum=commu_buf[rcv_cnt-1];
for(i=0;i<(rcv_cnt-1);i++)
sum -= commu_buf[i];
return sum;
}
//显示串口通讯的数据;本函数用于调试
void disp_comm(word num)
{
word i;
csprintf(disp_buffer,"com=%d ",num);
for(i=0;(i<16)&&(i<num);i++)
csprintf(disp_buffer+i+i+7,(commu_buf[i]>=16)?"%x":"0%x",commu_buf[i]);
str_sasc(64,0,disp_buffer);
}
//本函数用于查寻cpu板通过硬件送上来的信息,使MMI处于关注状态,同时记下此时的时间
//为纪录报告做准备
void trigger_routine(void)
{
byte i,s_bit;
static byte GPS_disp=FALSE;
if(GPS_en&0xf0)
{//GPS有效时显示天线图标
if(mstimer2<500)
{//在整秒过半秒时显示
if(GPS_disp==FALSE)
{
disp_GPS();
GPS_disp=TRUE;
}
}
else
GPS_disp=FALSE;
}
if((ctl_data&COM_SEL)!=COM_SEL)
{//当处于与PC机通讯状态时,检查已有多长时间未通讯
rcv_cnt=com_rcv(0xff);
if(rcv_cnt==0)
{
if(detect_timer==0)
{
ctl_data|=COM_SEL;
init_disp();
PC_QUIT=0;
}
}
else
detect_timer=PC_DETECT;
}
//液晶背光点亮的条件;
if((CYCLE_FLAG!=FALSE)||(menu_in!=FALSE)||(STATUS_WORD!=0)
||(PC_QUIT==0xa5)||(key_timer!=0)||(ATTENTION!=FALSE))
ctl_data|=LCD_LED;
else
ctl_data&=~LCD_LED;
//ATTEN:
s_bit=PINF&ATTN;
if(s_bit==0)
{//MMI被通知应处于关注状态
if((menu_in!=FALSE)||(CYCLE_FLAG!=FALSE)||(STATUS_WORD==3)||
(PC_QUIT==0xa5)||(ALM_WORD_att))
waiting=0;
else
{
if(waiting==0)
{
cstrcpy(disp_buffer,"装置正在启动");
disp_wait(1*16);
}
else
{
cstrcpy(disp_buffer,"+");
str_hz(3*16,waiting/16,disp_buffer);
}
waiting++;
if(waiting>=20*16)
waiting=0;
}
if(ATTENTION==FALSE)
{//关注标志为假,则做如下初始化:
ATTENTION=TRUE;
lamp_last_timer=200;
ATTENTION_timer=60;
ALM_WORD_att=0; //告警状态字清零
report_time_lock(); //记下起动时间
if(STATUS_WORD==1)
{
STATUS_WORD=0;
cls();
}
}
else
{//关注标志已经为真,则做如下处理
if(lamp_last_timer==0)
{//运行灯每隔200ms变换一次状态
lamp_last_timer=200;
PORTD^=RUN_LAMP;
}
if((ATTENTION_timer==0)&&(ALM_WORD_att==0))
{//关注时间太长,告警
alarm();
ALM_WORD_att=1;
if(CYCLE_FLAG==FALSE)
rpt_ram_clr();
cstrcpy(&disp_buffer[0],"CPU板启动超时! ");
memcpy(&rpt_ram_buf[ram_ptr*16],&disp_buffer[0],16);
if(ram_ptr<(MAX_REPORT_RAM/16-1))
ram_ptr++;
else
memcpy(rpt_ram_buf,rpt_ram_buf+16,MAX_REPORT_RAM-16);
CYCLE_FLAG=TRUE;
cycle_timer_f=TRUE;
STATUS_WORD=0;
report_time_lock();//记录此刻时间,并存于eeprom中
sampleCPU=0;
for(i=0;i<16;i++)
EEPROMwrite(eep_rpt_buf+eep_ptr*17+i,RPT_TIME[i+1]);
EEPROMwrite(eep_rpt_buf+eep_ptr*17+16,0x0a);
eep_rpt_inc(eep_ptr);
RPT_TIME[0]=0x5a;
for(i=0;i<16;i++)
EEPROMwrite(eep_rpt_buf+eep_ptr*17+i,disp_buffer[i]);//存报告
EEPROMwrite(eep_rpt_buf+eep_ptr*17+16,0x0a);
eep_rpt_inc(eep_ptr);
EEPROMwrite(eep_rpt_buf+eep_ptr*17,0x04);
EEPROMwrite(eep_rpt_buf+eep_ptr*17+1,0x04);
i=strlen(disp_buffer)-1;
for(;i>1;i--)
if(disp_buffer[i]!=' ')
break;
disp_buffer[i+1]=0;
cls();
mediacy_hz(2*16,disp_buffer);
}
}
}
else
{//如果关注状态结束,则做如下处理;
if(ATTENTION!=FALSE)
{//如果上一个状态是关注
ATTENTION=FALSE;
if(waiting!=0)
{
waiting=0;
cls();
}
if((STATUS_WORD==3)||(STATUS_WORD==4))
{//如果关注的起因是端口测试
keep_timer=0;//关注保持时间清零
}
else
{//设置不应期为20秒,在不应期内0Xc1报文不产生新的时间串
PT_RST=TRUE;
keep_timer=20*2;
}
}
if(keep_timer==0)//不应期时间到
{
PT_RST=FALSE;
RPT_TIME[0]=0x5a;
}
PORTD&=~RUN_LAMP;
}
}
void clr_CYCLE_FLAG(void)
{
rpt_ram_clr();
CYCLE_FLAG=FALSE;
S_EEP=0;
}
//LON网信息的处理进程
void nv_update_routine(void)
{
byte i,j,k,key;
byte temp,temp1,temp2,temp3;
byte tm_str[10];
if((nv_c.o_node_addr==0xff)&&(nv_c.code==0x3d))
{//收到对时时间
if((bgnpoint!=endpoint)&&
((GPS_en&0x20)==0))//缓冲区中有其它报文,表明对时命令不是刚收到的
return;
//时间串合理性判断
if((nv_c.data[5]-0)>(99-0))return;
if((nv_c.data[4]-1)>(12-1))return;
if((nv_c.data[3]-1)>(31-1))return;
if((nv_c.data[2]-0)>(23-0))return;
if((nv_c.data[1]-0)>(59-0))return;
if((nv_c.data[0]-0)>(59-0))return;
for(i=0;i<6;i++)
tm_str[i]=((nv_c.data[i]/10)<<4)+(nv_c.data[i]%10);//16进制转换成BCD码
poll_com=0;
synch_timer=400;//同步时间小于400ms
for(;;)
{
if(synch_timer==0)
{
if((GPS_en&0xf0))
break;
else
return;
}
out_rst24();
comm_with_lon();
if(nv_update!=FALSE)
{
nv_update=FALSE;
if((nv_c.o_node_addr==0xff)&&(nv_c.code==0x3e))
{//收到对时确认命令
synch_timer=0;
break;
}
}
}
if((GPS_en&0xf0)==0)
{//没有GPS对时
for(;mstimer2<2;);
if(memcmp(time_str,tm_str,6)!=0)
{//给定时间与自己的不同时,刷新时间
mstimer2=1000-1;
for(i=0;i<6;i++)
time_str[i]=tm_str[i];
time_str_wr(time_str);
}
}
else
{//GPS正在对时
if(GPS_en&0x20)
{//当为分脉冲对时
int my_tm,net_tm;
for(;mstimer2<2;);//即将越过整秒时,等待其越过
my_tm =(time_str[0]&0x0f)+(time_str[0]>>4)*10+
((time_str[1]&0x0f)+(time_str[1]>>4)*10)*60;
net_tm=(tm_str[0]&0x0f)+(tm_str[0]>>4)*10+
((tm_str[1]&0x0f)+(tm_str[1]>>4)*10)*60;
my_tm=my_tm-net_tm;//计算小时内的时间之差
if(my_tm>1800)//处理过整点时的时间差
my_tm-=3600;
else
if(my_tm<-1800)//处理过整点时的时间差
my_tm+=3600;
if((-30<=my_tm)&&(my_tm<=30))
{//给定时间与自己的分秒非常接近,再判断小时以上的时间串
if((time_str[1]==0x59)&&(tm_str[1]==0)&&(my_tm<=0))
return;//给定时间快,但在正常范围内
else
if((tm_str[1]==0x59)&&(time_str[1]==0)&&(my_tm>=0))
return;//给定时间慢,但在正常范围内
else
if(memcmp(time_str+2,tm_str+2,4)==0)
return;
}
my_tm =(time_str[0]&0x0f)+(time_str[0]>>4)*10;
net_tm=(tm_str[0]&0x0f)+(tm_str[0]>>4)*10;
my_tm=my_tm-net_tm;//计算分之内的时间之差
if(my_tm<-30)
{//给定时间的秒接近59秒,自己的秒刚过0秒不久
if(tm_str[1]!=0x59)
{//自己的秒是正确的,所以给定的分要加1
tm_str[1]++;
if((tm_str[1]&0x0f)==0x0a)
tm_str[1]+=6;
}
else
{//给定时间的分加1会产生进位时,为了避免繁琐的进位计算,
//让给定时间的秒更接近59,在GPS脉冲到来时会得到已正确进位的时间串
time_str[0]=0x59;
}
}
else
if(my_tm>30)
{//自己的秒接近59秒,给定时间的秒刚过0秒不久
if(tm_str[1]!=0)
{//自己的秒是正确的,所以给定的分要减1
tm_str[1]--;
if((tm_str[1]&0x0f)==0x0f)
tm_str[1]-=6;
}
else
time_str[0]=0;
}
tm_str[0]=time_str[0];
memcpy(time_str,tm_str,6);
mstimer2=1000-1;
for(i=0;i<6;i++)
time_str[i]=tm_str[i];
time_str_wr(time_str);
}
else
if(GPS_en&0x10)
{//当为秒脉冲对时
for(;mstimer2<2;);
if(memcmp(time_str,tm_str,6)!=0)
{//给定时间串与自己的不同时,刷新时间
mstimer2+=200;//使下次GPS对时时用此时间串
memcpy(time_str,tm_str,6);
}
}
}
return;
}
//如果不是本装置的地址,又不是广播命令则不处理;
if((nv_c.o_node_addr!=EEPROMread(eep_node_id))&&(nv_c.o_node_addr!=0xff))
return;
if((STATUS_WORD==5)&&(nv_c.code>=2)&&(nv_c.code<=4))
{
if(poll_com!=0)
{
nv_update=TRUE;
return;
}
}
poll_clr();
temp=nv_c.s_node_addr & 0xe0;
if(temp!=0xe0)
{//向CPU板转发
if(temp==0)
CPU_ID=0xe0;
else
CPU_ID=temp;
commu_buf[0]=nv_c.lenth+1;
commu_buf[1]=nv_c.o_node_addr;
commu_buf[2]=nv_c.s_node_addr;
commu_buf[3]=nv_c.code;
for(i=0;i<nv_c.lenth-3;i++)
commu_buf[4+i]=nv_c.data[i];
commu_buf[4+nv_c.lenth-3]=0;
for(i=0;i<4+nv_c.lenth-3;i++)//下传数据求和
commu_buf[4+nv_c.lenth-3] +=commu_buf[i];
temp=nv_c.lenth+2;
com_byte(CPU_ID | 0x1f);//转发远动命令
for(i=0;i<temp;i++)
{
com_byte(CPU_ID | (commu_buf[i] & 0x0f));//字节低位
com_byte(CPU_ID | (commu_buf[i] >> 4));//字节高位
}
if((nv_c.code>=2)&&(nv_c.code<=6))
return;
dlyms(50);
poll_seq=(CPU_ID>>5)-1;
for(i=3;i!=0;)
{
if(poll_timer_f!=FALSE)
if(poll_com!=1)
{
poll_timer_f=FALSE;
if(poll_com==0)
poll_seq--;
poll_timer_routine();
if(poll_timer_f==FALSE)
i--;
}
}
}
else
{//LON网对MMI的命令
if(nv_c.code==0x3f)
{//复归命令
ans_nva(0x26);
press_rst_key();
if((ATTENTION==FALSE)&&(menu_in==FALSE)
&&(STATUS_WORD!=1)&&(STATUS_WORD!=2))
{
clr_CYCLE_FLAG();
STATUS_WORD=0;
init_disp();
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -