📄 hzmmimain18.c
字号:
keep_timer=0;
}
else
{//置不应期为10秒
PT_RST=TRUE;
keep_timer=10*2;
}
}
if((RPT_TIME[0]&0xf0)==0xa0)
{//报告产生的时间是未曾使用的,保存时间
if(S_EEP)
{//如果MMI中的报告正在显示,则指针加1,最新行指向当前位置
frist_line=eep_ptr;
if(S_EEP>0)
S_EEP++;
}
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);
}
}
if(commu_buf[2] & 0x10)//点亮运行灯
PORTD|=RUN_LAMP;
else
PORTD&=~RUN_LAMP;
if(commu_buf[2] & 0x04)//接收到停止发送代码则告警
alarm();
key=0x02;
if(commu_buf[2]&0x02)
if((RPT_TIME[0]&0xf0)==0xa0)//向网络转发报告产生的时间
{
NV_ram_buf[0]=20; //lenth
NV_ram_buf[1]=commu_buf[3]; //o.addr
NV_ram_buf[2]=EEPROMread(eep_node_id);
NV_ram_buf[3]=commu_buf[5]; //code
memcpy(&NV_ram_buf[4],&RPT_TIME[2],15);
NV_ram_buf[19]=0x0d;
NV_ram_buf[20]=0x0a;
net_out(1);
if(RPT_TIME[0]==0xa5)
{
rpt_ram_clr();
memcpy(rpt_ram_buf,&RPT_TIME[2],15);
rpt_ram_buf[15]=' ';
ram_ptr++;
CYCLE_FLAG=TRUE;
STATUS_WORD=0;
}
RPT_TIME[0]=0x5a;//设置报告产生的时间已经使用过了
}
if(STATUS_WORD!=1)
if(keep_timer!=1)
while((commu_buf[2]&0x0b)==0)
{
if(sampleCPU==0)
{//在不应期内,CPU发出单一(采样)打印报文,则记下CPU号,
sampleCPU=poll_seq;
if((STATUS_WORD==5)&&(keep_timer>0))
{//菜单选择的打印,报文不暂存
keep_timer=1;
}
else
{//将报文存于0x400处,不应期即将结束时再打印
memmove(&commu_buf[400],&commu_buf[0],commu_buf[1]+1);
key=0x05;
if(keep_timer==0)
keep_timer=2;
}
}
else
if((sampleCPU==poll_seq)&&(keep_timer>1))
{//只有一个CPU,则不应期结束,打印0x400处报文
keep_timer=1;
key=net_send(1,commu_buf[1+400]-5,commu_buf[3+400],
commu_buf[5+400],2,0,&commu_buf[6+400]);
}
break;
}
if(key==0x02)
{
if((commu_buf[1]-5)>32)
key|=0x80;
net_send(1,commu_buf[1]-5,commu_buf[3],
commu_buf[5],key,0,&commu_buf[6]);
}
if(commu_buf[2] & 0x08) //数据要求存RAM
ram_save(rcv_cnt,0xc1);
if(RPT_TIME[0]!=0xb5)
if(commu_buf[2] & 0x02) //数据要求存EEPROM
eep_save(rcv_cnt,0xc1);
if((commu_buf[2] & 0x01) //送当地显示
&&(CYCLE_FLAG==FALSE)&&(menu_in==FALSE))
{
memcpy(disp_buffer1,&commu_buf[6],rcv_cnt);
disp_buffer1[rcv_cnt]=0;
if(reportchinese(rcv_cnt,1));//调用报文显示子程序
}
break;
}
}
//向cpu板发送时间
void send_time(void)
{
byte i,k;
if(mstimer2<(1000-1-5))//当前时刻不在整秒附近
return;
if(poll_com==1)
return;
com_byte(0xe0);
for(i=2;i<=2;i--)
{//下发时分秒
k=(time_str[i]>>4)*10+(time_str[i]&0x0f);//BCD码转换
com_byte(0xe0|(k>>4));//取高位下发
com_byte(0xe0|(k&0x0f));//取低位下发
}
com_byte(0xe1);
}
//时钟显示进程
void clock_timer_routine(void)
{
byte str[64],tmp[10];
byte i;
static byte cyc=0;
static byte prg_sum=FALSE;
soft_dog=7;
if((cyc==0)||(cyc==20))
send_time();
if(cyc>=38)//计算新的滚动位置
cyc=0;
else
cyc+=2;
if(cyc==0)
{//每20秒检查一次本程序的校验码
if(VERSION3[1]!='0')
prg_sum=FALSE;//调试状态不用校验
else
{
poll_clr();
csprintf(tmp,"0000%X",chk_prg_sum());
i=strlen(tmp)-4;
cstrcpy(str,VERSION3);
if(strncmp(&str[3],&tmp[i],4))
prg_sum=TRUE;
else
prg_sum=FALSE;
}
}
if((time_setting!=FALSE)||(CYCLE_FLAG==FALSE)&&(menu_in==FALSE))
{
if((net_err!=FALSE)&&(time_setting==FALSE))
{//如果网络CPU有错误
alarm();
ctl_data|=LCD_LED;
cstrcpy(str," 网络通讯有错误! ");
str_hz(0,0,str);
}
else
if((prg_sum!=FALSE)&&(time_setting==FALSE))
{//如果校验不正确则告警
alarm();
ctl_data|=LCD_LED;
cstrcpy(str," 面板程序校验错! ");
str_hz(0,0,str);
}
else
if((time_setting!=FALSE)||(face_str[0]==0)||(face_str==0))
{
disp_time(0);
if((time_setting!=FALSE)&&((GPS_en&0x0f)==2))
if((time_str[5]==1)&&(time_str[4]==1)&&(time_str[3]<10))
{//当时间设置在2001年1月1-9日,且分脉对时时,可测脉宽,调整时钟快慢
csprintf(str,"GPS脉宽:%ums ",ms_val);
mediacy_hz(3*16+8,str);
key_timer=10;//不断延长键盘输入等待时间
}
}
else
{//时间与设备题头滚动显示
str[0]='2';
str[1]='0';
for(;mstimer2<2;);//快到整秒时等待过整秒,防止时间串出错
for(i=5;i<6;i--)
csprintf(&str[2+15-i*3],(time_str[i]>=16)?"%x-":"0%x-",time_str[i]);
str[10]=' ';
str[13]=':';
str[16]=':';
str[19]=' ';
memset(str+20,' ',20);
i=cstrlen(face_str);
i=10-(((i/2)+1)&0xfe);
cstrcpy(str+i+20,face_str);
str[strlen(str)]=' ';
memcpy(str+40,str,20);
str[cyc+20]=0;
str_hz(0,0,str+cyc);
}
}
}
//报告滚屏显示进程,组织报告显示的格式
void cycle_timer_routine(void)
{
static byte bgn;//第一行借用第二行字符的个数
byte i;
if((CYCLE_FLAG==FALSE)||(menu_in!=FALSE)||(STATUS_WORD==5))
return;
cycle_timer_t=3;
if(STATUS_WORD!=1);
STATUS_WORD=0;
if(cycle_ptr==0)
bgn=0;
if(S_EEP)
{//报告来自MMI的eeprom中
if(S_EEP==1)
cstrcpy(disp_buffer1,"MMI中最新报告:");
else
if(S_EEP==-1)
cstrcpy(disp_buffer1,"MMI中最老报告:");
else
if(S_EEP>0)
csprintf(disp_buffer1,"MMI中第%d新报告:",S_EEP);
else
csprintf(disp_buffer1,"MMI中第%d老报告:",-S_EEP);
}
else
if(STATUS_WORD==1)
{//在零漂刻度菜单选择开入时,有时会进入报告滚屏状态
csprintf(disp_buffer1,"CPU%d的开入压板:",poll_seq);
}
else
cstrcpy(disp_buffer1,"最新报告:");
cls();
str_hz(0,0,disp_buffer1);//显示标题
i=20-strlen(disp_buffer1);
csprintf(disp_buffer,"第%d行",cycle_ptr+1);
if(i>7)
str_hz(0,20-strlen(disp_buffer),disp_buffer);//显示行号
else
if(i>strlen(disp_buffer+2))
str_hz(0,20-strlen(disp_buffer+2),disp_buffer+2);//显示行号
else
{
csprintf(disp_buffer,"%d",cycle_ptr+1);
str_hz(0,20-strlen(disp_buffer),disp_buffer);//显示行号
}
memcpy(disp_buffer1,&rpt_ram_buf[cycle_ptr*16],80);
cycle_ptr++;
if(cycle_ptr>=ram_ptr)
{
disp_buffer1[16]=0;
cycle_ptr=0;
}
else
if(cycle_ptr==(ram_ptr-1))
disp_buffer1[32]=0;
else
if(cycle_ptr==(ram_ptr-2))
disp_buffer1[48]=0;
else
if(cycle_ptr==(ram_ptr-3))
disp_buffer1[64]=0;
else
disp_buffer1[80]=0;
//将第一行借用第二行的字符摸去,
//解决因分段引起的完整数据被不合理分割的问题,如3.06被分断
for(i=0;i<bgn;i++)
disp_buffer1[i]=' ';
bgn=reportchinese(80,1);
}
//等待获取键值子程序
byte get_key(void)
{
byte key;
for(key=0;key_timer;)
{//等待按键
event_routine();
out_rst24();
if(STATUS_WORD==5)
return 0;
if(has_key&0x80)
{
has_key&=0x7f;
key=has_key&0x7f;
if(cpu_set_flag!=FALSE)
key_timer=KEY_SET_TIMEOUT;//重置等待时间
else
key_timer=KEY_TIMEOUT;//重置等待时间
break;
}
}
return key;
}
//DZ1,DZ2,DZ3
void set_chg(void)
{
static byte DZ123_L,DZ123_X,DZ123_N;
static word DZ123_T;
byte i,key;
key=(~PIND)&(DZ1|DZ2|DZ3);
if((DZ123_L==key)&&((~DZ123_X)==key))
{
DZ123_N=0x80;
return;
}
if(DZ123_N!=key)
{
DZ123_N=key;
DZ123_T=ms_count;
return;
}
if((ms_count-DZ123_T)<500)
return;
if(DZ123_L!=~DZ123_X)
{
DZ123_L=key;
DZ123_X=~key;
return;
}
else
{
menu_in=TRUE;
csprintf(disp_buffer,"切换定值区:0%d到0%d ?",DZ123_L,DZ123_N);
LCD_display(8,0);
cstrcpy(disp_buffer,"按SET键或RESET键确认");
str_hz(16*2,0,disp_buffer);
cstrcpy(disp_buffer,"或切回原定值区");
str_hz(16*3+8,0,disp_buffer);
key_timer=KEY_TIMEOUT;
for(;;)
{
event_routine();
if(CYCLE_FLAG!=FALSE)
break;
key=(~PIND)&(DZ1|DZ2|DZ3);
if(DZ123_N!=key)
{
DZ123_N=0x80;
break;
}
if(key_timer==0)
{
key_timer=KEY_SET_TIMEOUT;
alarm();
}
if(has_key&0x80)
{
if(((has_key&0x7f)==KEY_SET)
||((has_key&0x7f)==KEY_RST24))
{
if((has_key&0x7f)==KEY_SET)
{
has_key&=0x7f;
press_rst_key();
}
else
{
out_rst24();
for(;(has_key&0x80)==0;soft_dog=5)
comm_with_lon();
out_rst24();
}
cpu_set_flag=TRUE;
for(key=0;key<3;key++)
{
soft_dog=5;
for(i=1;i<=6;i++)
{
if(EEPROMread(eep_CPU_NUB+i)==1)
if(EEPROMread(eep_COMERR_CNT+i)<ALM_NUMBER)
if((word)CTL_DOT_CPU[i].str!=0x0001)//录波CPU
{
dlyms(50);
cpu_name=i;
if(rmtc_op(DZ123_N,0x67)==1)
{
dlyms(200);
break;
}
}
}
if(i>6)break;
}
cpu_set_flag=FALSE;
if(i>6)
{
DZ123_L=DZ123_N;
DZ123_X=~DZ123_N;
}
break;
}
else
has_key&=0x7f;
}
}
cls();
menu_in=FALSE;
STATUS_WORD=0;
key_timer=0;
}
}
//键盘进程,处理循环状态时的所有按键操作
void key_routine(void)
{
byte key,i;
const byte *cpp;
out_rst24();
if((CYCLE_FLAG==FALSE)&&(PC_QUIT!=0xa5))
set_chg();
key=has_key;
if((key&0x80)==0)//没有新键,返回
return;
has_key&=0x7f;
key&=0x7f;
menu_in=FALSE;
key_timer=KEY_TIMEOUT;//设置读键等待时间,点亮背光
if(key==KEY_QUIT)
{
if(waiting!=0)
{
waiting=0;
cls();
}
desk_pause=0;
if((ctl_data & COM_SEL)!=COM_SEL) //PC<-->CPU//
ctl_data|=COM_SEL;//切换到MMI控制状态
if((CYCLE_FLAG!=FALSE)&&(STATUS_WORD!=3)&&(STATUS_WORD!=5))
clr_CYCLE_FLAG();
else
if(STATUS_WORD==3)
{//让操作者多按一次退出键
STATUS_WORD=0;
if(ATTENTION==TRUE)
press_rst_key();
return;
}
else
{
static byte quit_count;
if((STATUS_WORD>=4)||(STATUS_WORD==2))
STATUS_WORD=0;
if(STATUS_WORD==1)
{
quit_count++;
if(quit_count>5)
{
STATUS_WORD=0;//让操作者多按一次退出键
quit_count=0;
}
}
key_timer=0;//键盘输入等待时间清零,背光消失
}
for(i=0;i<7;i++)
Q_KEY[i]=0xaa;
init_disp();
PC_QUIT=0;
return;
}
else
if((key==KEY_UP)||(key==KEY_DOWN))
{//处理上下键
if(STATUS_WORD==2)
{//对对点的特殊处理:发复归命令
if(key==KEY_UP)
return;
press_rst_key();
has_key=KEY_NOUSE;
return;
}
if(STATUS_WORD==1)
{//对零漂、刻度、阻抗,特殊处理
CYCLE_FLAG=FALSE;
if(key==KEY_UP)
{//调零漂,刻度的上键处理:前推一项
if((clz_old&0x1f00)!=0)
clz_old-=256;
else
clz_old=clz_total-256;
if(clz_old==clz_bzd)//如果遇到对点,则再前推一项
clz_old=((clz_old-256)&0x1f00)|(clz_old&0xe0ff);
if(clz_old==clz_prt)//如果遇到打印,则再前推一项
clz_old=((clz_old-256)&0x1f00)|(clz_old&0xe0ff);
if(clz_old==clz_bzd)//如果遇到对点,则再前推一项
clz_old=((clz_old-256)&0x1f00)|(clz_old&0xe0ff);
}
else
{//调零漂,刻度的下键处理:后推一项
clz_old=((clz_old+256)&0x1f00)|(clz_old&0xe0ff);
if(clz_old==clz_prt)//如果遇到打印,则再后推一项
clz_old=((clz_old+256)&0x1f00)|(clz_old&0xe0ff);
if(clz_old==clz_bzd)//如果遇到对点,则再后推一项
clz_old=((clz_old+256)&0x1f00)|(clz_old&0xe0ff);
if(clz_old==clz_prt)//如果遇到打印,则再后推一项
clz_old=((clz_old+256)&0x1f00)|(clz_old&0xe0ff);
if(clz_old>=clz_total)//如果遇到结尾,则再后推一项
clz_old=clz_old&0xe0ff;
}
csprintf(disp_buffer," 正在调取零漂第%d项, ",((clz_old/256)&0x1f)+1);
if((clz_old&0x1f)==0x11)
cpp="零漂";
else
if((clz_old&0x1f)==0x10)
cpp="刻度";
else
if((clz_old&0x1f)==0x12)
cpp="阻抗";
cstrcpy(disp_buffer+9,cpp);
disp_buffer[13]='第';
disp_wait(1*16+8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -