📄 mmi.c
字号:
mytime.year=com_rx_buf[4];
mytime.month=com_rx_buf[5];
mytime.day=com_rx_buf[6];
mytime.hour=com_rx_buf[7];
mytime.minute=com_rx_buf[8];
mytime.second=com_rx_buf[9];
mytime.msecond=com_rx_buf[10]+(com_rx_buf[11]<<8);
}
}
void com_tx_handle()
{
INT16U sum,vv;
INT16U *p;
INT8U i,len,cmd;
com_tx_time=2000;
if(dev_flag==0x55) //读装置类型
{
dev_flag=0;
cmd=MMI_DEV;
len=2;
}
#if DEVICE_TYPE==61
else if (set_kch_flag==0x55) //下发定值和系数
{
set_kch_flag=0;
cmd=MMI_SET_KCH;
for(i=0;i<8;i++)
{
vv=(((INT32U)kch_data[i] << 14)+500)/1000;
com_tx_buf[4+i*2]=vv & 0xff;
com_tx_buf[5+i*2]=vv >> 8;
}
com_tx_buf[20]=my_set.id & 0xff;
com_tx_buf[21]=my_set.id >>8;
len=20;
}
#endif
else if(pqt_flag==0x55) //电度
{
pqt_flag=0;
cmd=MMI_PQT;
len=2;
}
else if(asp_flag==0x55) //ASP
{
asp_flag=0;
cmd=MMI_ASP;
len=2;
}
else if(coe_flag==0x55 && coe_data==coe_data_bak) //YK执行
{
coe_flag=0;
cmd=MMI_COE;
com_tx_buf[4]=coe_data;
com_tx_buf[5]=coe_data;
coe_data=0xff;
coe_data_bak=0;
len=4;
}
else if(rds_flag==0x55) //读定值
{
rds_flag=0;
cmd=MMI_RDS;
com_tx_buf[4]=0; //定值组号
com_tx_buf[5]=0; //定值组号
len=4;
}
else if(lds_flag==0x55) //下载定值
{
lds_flag=0;
cmd=MMI_LDS;
com_tx_buf[4]=0; //定值组号
com_tx_buf[5]=0; //定值组号
dis_to_set();
// p=&my_set.id;
for(i=0;i<SET_LEN;i++)
{
com_tx_buf[6+i*2]=p[i] & 0xff;
com_tx_buf[7+i*2]=p[i] >> 8;
}
len=SET_LEN*2+4;
}
else if(wrs_flag==0x55) //写入定值
{
wrs_flag=0;
cmd=MMI_WRS;
com_tx_buf[4]=0; //定值组号
com_tx_buf[5]=0; //定值组号
len=4;
}
else if(ajt_flag==0x55) //时间
{
ajt_flag=0;
cmd=MMI_AJT;
len=2;
}
else if(rdk_flag==0x55) //读系数
{
rdk_flag=0;
cmd=MMI_RDK;
len=2;
}
else if(wrk_flag==0x55) //写系数
{
wrk_flag=0;
cmd=MMI_WRK;
p=&kch_data[0];
for(i=0;i<KCH_LEN;i++)
{
vv=p[i];
vv=(((INT32U)vv << 14)+500)/1000;
com_tx_buf[4+i*2]=vv & 0xff;
com_tx_buf[5+i*2]=vv >> 8;
}
len=KCH_LEN*2+2;
}
else if(rdr_flag==0x55) //读主机内存
{
rdr_flag=0;
cmd=MMI_RDR;
com_tx_buf[4]=rdr_addr & 0xff; //地址
com_tx_buf[5]=rdr_addr >> 8; //地址
com_tx_buf[6]=3; //长度
len=5;
}
else// if (drf_flag==0x55) //全数据
{
drf_flag=0;
cmd=MMI_DRF;
len=2;
}
com_tx_buf[0]=cmd; //命令码
com_tx_buf[1]=len; //帧长
com_tx_buf[2]=DEVICE_TYPE; //装置类别
com_tx_buf[3]=0; //运行状态
sum=sum_check(&com_tx_buf[0],len+2);
com_tx_buf[len+2]=sum & 0xff;
com_tx_buf[len+3]=sum >> 8;
__disable_interrupt(); // Disable interrupts
com_tx_point=0;
com_tx_count=len+4;
__enable_interrupt(); // Enable interrupts
}
void dis_yc_dynamic_page()
{
INT8U i,p1,p2;
INT16U v;
char str[32];
float f;
#if DEVICE_TYPE==61 //主变自动化装置
for(i=0;i<2;i++)
{
p1=page_point*2+i;
if (page_point==0)
{
f=(float)yc_data[p1] * 150/1023-50; // 油温变送器0~20MA对应-50~100度,测量装置并150欧电阻0~3V对应0~1023
sprintf(str,"%5.2f\0",f);
}
else if (page_point==1) //直流备用
{
f=(float)yc_data[p1] * 3/1023;
sprintf(str,"%5.2f\0",f);
}
else if (page_point==2 || page_point==3) //交流
{
f=(float)yc_data[p1] * 0.47135; // PT:250V-1.1V AD:3V-1023 0.47135=3/1.414/1023*250/1.1
sprintf(str,"%5.2f\0",f);
}
else if (page_point==4 )
{
v=(INT16U)yc_data[p1];
f=(float)v/1000;
sprintf(str,"%6.3f\0",f);
}
Lprint(7,1-i,str,LCD_NORMAL);
}
#else
for(i=0;i<2;i++)
{
p1=page_point*2+i;
p2=yc_index[p1];
if (yc_data_type[p1]==0) //保护电流二次
{
f=(float)yc_data[p2]*100/8191;
sprintf(str,"%5.2f\0",f);
}
else if (yc_data_type[p1]==2) //电压二次
{
f=(float)yc_data[p2]*140/8191;
sprintf(str,"%5.2f\0",f);
}
else if (yc_data_type[p1]==3) //测量电流二次
{
f=(float)yc_data[p2]*7/8191;
sprintf(str,"%5.3f\0",f);
}
else if (yc_data_type[p1]==4) //功率二次
{
f=(float)yc_data[p2]*980*1.732/8191;
sprintf(str,"%5.1f\0",f);
}
else if (yc_data_type[p1]==5) //COS
{
v=(INT16U)yc_data[p2];
f=(float)v/1000;
if (f>1) f=1;
sprintf(str,"%6.3f\0",f);
}
else if (yc_data_type[p1]==6) //f
{
v=(INT16U)yc_data[p2];
f=(float)v/1000;
sprintf(str,"%6.3f\0",f);
}
else if (yc_data_type[p1]==7) //测量电流一次
{
f=(float)yc_data[p2]*(float)ct_val*7/8191;
sprintf(str,"%5.1f\0",f);
}
else if (yc_data_type[p1]==8) //电压一次
{
f=(float)yc_data[p2]*(float)pt_val*140/8191/1000;
sprintf(str,"%5.2f\0",f);
}
else if (yc_data_type[p1]==9) //功率一次
{
f=(float)yc_data[p2]*(float)ct_val*(float)pt_val*980*1.732/8191/1000;
sprintf(str,"%5.1f\0",f);
}
if (yc_data_type[p1]!=0x55)
{
if (yc_data_type[p1]==9)
Lprint(5,1-i,str,LCD_NORMAL);
else
Lprint(7,1-i,str,LCD_NORMAL);
}
}
#endif
}
void dis_yx_dynamic_page()
{
INT8U i,pp,ll;
#if DEVICE_TYPE==61 //主变自动化装置
j=(page_point*2) / 8;
k=(page_point*2) % 8;
if (bittst(&yx_data[j],k)) Lprint(9,1,"合",LCD_NORMAL);
else Lprint(9,1,"分",LCD_NORMAL);
if (bittst(&yx_data[j],k+1)) Lprint(9,0,"合",LCD_NORMAL);
else Lprint(9,0,"分",LCD_NORMAL);
return;
#endif
if (page_point==0)
{
if (bittst(&yx_data[0],0)) Lprint(9,1,"合",LCD_NORMAL);
else Lprint(9,1,"分",LCD_NORMAL);
if (bittst(&yx_data[0],1)) Lprint(9,0,"断线",LCD_NORMAL);
else Lprint(9,0,"正常",LCD_NORMAL);
}
else if (page_point==1)
{
if (bittst(&yx_data[0],2)) Lprint(10,1,"投入",LCD_NORMAL);
else Lprint(10,1,"退出",LCD_NORMAL);
if (bittst(&yx_data[0],3)) Lprint(10,0,"合",LCD_NORMAL);
else Lprint(10,0,"分",LCD_NORMAL);
}
else if(page_point==2 || page_point==3 || page_point==4 || page_point==5)
{
if (bittst(&yx_data[0],page_point*2)) Lprint(9,1,"合",LCD_NORMAL);
else Lprint(9,1,"分",LCD_NORMAL);
if (bittst(&yx_data[0],page_point*2+1)) Lprint(9,0,"合",LCD_NORMAL);
else Lprint(9,0,"分",LCD_NORMAL);
}
else if (page_point==6)
{
if (ad_erro_flag==0) Lprint(9,1,"正常",LCD_NORMAL);
else Lprint(9,1,"故障",LCD_NORMAL);
if (kch_erro_flag==0) Lprint(9,0,"正常",LCD_NORMAL);
else Lprint(9,0,"错误",LCD_NORMAL);
}
else if (page_point==7)
{
if (set_erro_flag==0) Lprint(9,1,"正常",LCD_NORMAL);
else Lprint(9,1,"错误",LCD_NORMAL);
if (com_erro_flag==0) Lprint(9,0,"正常",LCD_NORMAL);
else Lprint(9,0,"故障",LCD_NORMAL);
}
#if DEVICE_TYPE==35 || DEVICE_TYPE==46 //差动 高后备
else if(page_point>7)
{
for(i=0;i<2;i++)
{
pp=page_point*2+i;
if(pp==23) ll=bittst(&run_status,ZXQ_ERRO);//执行器
else if(pp==24) ll=0; // 备用
else if (pp==16 || pp==17)ll=bittst(&oct_status,(page_point-8)*2+i);//光纤A相
else ll=bittst(&oct_status,(page_point-8)*2+i+1);//光纤B C相
if (ll )
Lprint(11,1-i,"故障",LCD_NORMAL);
else
Lprint(11,1-i,"正常",LCD_NORMAL);
}
}
#else
else if(page_point>7)
{
for(i=0;i<2;i++)
{
pp=page_point*2+i;
if(pp==16) ll=bittst(&oct_status,0) | bittst(&oct_status,1); //光纤A相
else if(pp==17) ll=bittst(&oct_status,3)| bittst(&oct_status,4); //光纤B相
else if(pp==18) ll=bittst(&oct_status,5) | bittst(&oct_status,6); //光纤C相
else if(pp==19) ll=0; //光纤测频
else if(pp==20) ll=bittst(&run_status,ZXQ_ERRO);//执行器
else if(pp==21) ll=0; //备用
if (ll )
Lprint(11,1-i,"故障",LCD_NORMAL);
else
Lprint(11,1-i,"正常",LCD_NORMAL);
}
}
#endif
}
void dis_time_dynamic_page()
{
char s[16];
sprintf(s,"%4d\0",(mytime.year+2000));
Lprint(0,1,s,LCD_NORMAL);
sprintf(s,"%2d\0",mytime.month);
Lprint(6,1,s,LCD_NORMAL);
sprintf(s,"%2d\0",mytime.day);
Lprint(10,1,s,LCD_NORMAL);
sprintf(s,"%2d\0",mytime.hour);
Lprint(2,0,s,LCD_NORMAL);
sprintf(s,"%2d\0",mytime.minute);
Lprint(6,0,s,LCD_NORMAL);
sprintf(s,"%2d\0",mytime.second);
Lprint(10,0,s,LCD_NORMAL);
}
INT16U value_handle(INT16U v,INT16U min,INT16U max)
{
if (v<min) v=min;
else if(v>max) v=max;
return v;
}
void set_data_handle(INT8U tt)
{
INT8U type;
INT16U v;
type=set_type[tt];
v=set_data[tt];
#if DEVICE_TYPE==11 //线路
if (type==1) set_data[tt]=value_handle(v,10,1000); //电压在1~100V
else
{
if (tt==25) set_data[tt]=value_handle(v,4500,5000); //低频减载频率45HZ~50HZ
else if(tt==30) set_data[tt]=value_handle(v,1,200); //滑差频率0。01HZ~2HZ
else if (tt==0 || tt==4 || tt==13 || tt==35) set_data[tt]=value_handle(v,10,8000); //电流在0.1~80A
else if (tt==48) set_data[tt]=value_handle(v,100,1000); //突变量启动电流在1~10A
else if (tt==18) set_data[tt]=value_handle(v,2,140); //零序电流在0.02~1.4A
else if (tt==1) set_data[tt]=value_handle(v,0,9999); //速断时间在0~99.99S
else if (tt==5 || tt==15 || tt==27 || tt==19) set_data[tt]=value_handle(v,10,9999); //时间在0.1~99.99S
else if (tt==37 || tt==39 ) set_data[tt]=value_handle(v,10,1000); //重合闸/后加速时间在0.1~10S
else if (tt==21) set_data[tt]=value_handle(v,1,1000); //选线时间1~1000S
else if (tt==31) set_data[tt]=value_handle(v,4,50); //滑差时间在0.04~0.5S
else if(tt==45) set_data[tt]=value_handle(v,20,40);//重合闸角度
else if(tt==49) set_data[tt]=value_handle(v,1,99);//主机地址
}
#endif
#if DEVICE_TYPE==21 //电容器
if (tt==0 || tt==2 || tt==6 ) set_data[tt]=value_handle(v,100,8000); //电流1~80A
else if(tt==19 || tt==24) set_data[tt]=value_handle(v,100,1000); //有流闭锁欠压/突变量启动电流1~10A
else if (tt==1) set_data[tt]=value_handle(v,0,9999); //速断时间在0~99.99S
else if (tt==3 || tt==13 || tt==15) set_data[tt]=value_handle(v,10,9999); //时间在0.1~99.99S
else if (tt==7 || tt==9) set_data[tt]=value_handle(v,10,1000); //时间在0.1~10S
else if (tt==8 ) set_data[tt]=value_handle(v,100,1400); // 零序电压在10~140V
else if (tt==12 ) set_data[tt]=value_handle(v,1000,1400); // 过电压在100~140V
else if (tt==14 ) set_data[tt]=value_handle(v,100,1000); // 欠电压在10~100V
else if(tt==25) set_data[tt]=value_handle(v,1,99);//主机地址
#endif
#if DEVICE_TYPE==45 || DEVICE_TYPE==46 //低后备 高后备
if (tt==1 || tt==3 || tt==29) set_data[tt]=value_handle(v,10,999); // 电压在1~99.9V
else if (tt==9 || tt==17 || tt==25 || tt==35 ) set_data[tt]=value_handle(v,10,8000); //电流0.1~80A
else if (tt==11 || tt==13 || tt==15 || tt==37) set_data[tt]=value_handle(v,10,9999); //过流1段时间在0.1~99.99S
else if (tt==19 || tt==21 || tt==23 || tt==27 || tt==31 ) set_data[tt]=value_handle(v,10,9999); //过流2段/3段/零序时间在0.1~99.99S
else if(tt==38 ) set_data[tt]=value_handle(v,100,1000); //突变量启动电流1~10A
else if(tt==39) set_data[tt]=value_handle(v,1,99);//主机地址
#endif
#if DEVICE_TYPE==35 //差动
if ( tt==7) set_data[tt]=value_handle(v,30,70); //制动系数K1在0.3~0.7
else if (tt==9) set_data[tt]=value_handle(v,10,40);//谐波系数K2在0.1~0.4
else if (tt==35) set_data[tt]=value_handle(v,20,400); //平衡系数KL在0.2~4
else if (tt==13 || tt==19 || tt==25 || tt==31) set_data[tt]=value_handle(v,10,9999); //时间在0.1~99.99S
else if(tt==1 ) set_data[tt]=value_handle(v,500,8000); //差速断电流5~80A
else if(tt==3 || tt==5 || tt==11) set_data[tt]=value_handle(v,10,1000); //电流0.1~10A
else if(tt==17 || tt==23 || tt==29) set_data[tt]=value_handle(v,10,8000); //电流0.1~80A
else if(tt==38 ) set_data[tt]=value_handle(v,100,1000); //突变量启动电流1~10A
else if(tt==39) set_data[tt]=value_handle(v,1,99);//主机地址
#endif
}
void lcd_display_handle(INT8U page)
{
INT8U i,j,type;
char s[16];
INT16U v;
INT8U s_enable;
INT8U bit[4],pp,x,ll,xsd,tt;
float f;
if (clear_flag!=0x55) LCD_clear(); //换页清屏
clear_flag=0;
switch (page)
{
case MAIN_PAGE : //主菜单
Lprint(0,1,main_str[page_point*2],LCD_NORMAL);
Lprint(0,0,main_str[page_point*2+1],LCD_NORMAL);
if (arrow_state==0x55)
{
if(arrow_point==0) Lprint(0,1,arrow_str,LCD_NORMAL);
else if(arrow_point==1) Lprint(8,1,arrow_str,LCD_NORMAL);
else if(arrow_point==2) Lprint(0,0,arrow_str,LCD_NORMAL);
else if(arrow_point==3) Lprint(8,0,arrow_str,LCD_NORMAL);
}
break;
case YC_PAGE: //测量页
Lprint(0,1,yc_str[page_point*2],LCD_NORMAL);
Lprint(0,0,yc_str[page_point*2+1],LCD_NORMAL);
dis_yc_dynamic_page();
break;
case YX_PAGE: //状态页
Lprint(0,1,yx_str[page_point*2],LCD_NORMAL);
Lprint(0,0,yx_str[page_point*2+1],LCD_NORMAL);
dis_yx_dynamic_page();
break;
case PW_PAGE: //密码页
Lprint(2,1,pw_str,LCD_NORMAL);
dec_to_4bit(&bit[0],pass_word);
for(i=0;i<4;i++)
{
sprintf(s,"%d\0",bit[i]);
if (cursor_state==0x55 && cursor_point==i)
Lprint(5+i,0,s,LCD_UNDERLINE);
else
Lprint(5+i,0,s,LCD_NORMAL);
}
break;
case YK_PAGE : //传动页
Lprint(0,1,yk_str[page_point*2],LCD_NORMAL);
Lprint(0,0,yk_str[page_point*2+1],LCD_NORMAL);
if (arrow_state==0x55)
{
if(arrow_point==0) Lprint(0,1,arrow_str,LCD_NORMAL);
else if(arrow_point==1) Lprint(7,1,arrow_str,LCD_NORMAL);
else if(arrow_point==2) Lprint(0,0,arrow_str,LCD_NORMAL);
else if(arrow_point==3) Lprint(7,0,arrow_str,LCD_NORMAL);
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -