📄 wondercb.c
字号:
else if(sum<all)
{
Number = sum;
}
libset (Number,B_W); //设置当前记录序号和字段序号.Number:记录序号,JBH:字段序号.成功返回1
libwrit(bw); // libwrit(unsigned char *s) 写当前字段
libset (Number,B_DZ);
libwrit(bdz);
for(m=0,i=START2,j=START1;i<=END2;i++,j++,m++)
{
libset(Number,i);
libread( backstring );
length=strlen(backstring);
if(length)
{
libset(Number,j);
libwrit( backstring );
}
libset(Number,i);
if(strcmp(ir_data[m],"空")!=0)
{
data = atof(ir_data[m]);
sprintf(datastr,"%.2f",data);
libwrit( datastr);
}
else libwrit("");
strcpy (datastr,"");
}
libset(Number,DATA_TIME2);
libread(backstring);
libset(Number,DATA_TIME1);
libwrit(backstring);
libset(Number,DATA_TIME2);
Get_Datetime(backstring);
libwrit(backstring);
return TRUE;
}//end of Store_Data()
//Read多功能表
int Read_DGN(U8 bdz[],U8 bw[],U8 ir_data[][50] )
{
U8 sign[20];
U8 addr_bcd[50]="";
int Key;
double Data=-1;
U8 delaytime=15;
int i,j;
int mode;
int SubMenuChoice;
const P_U8 SubMenu[]={//菜单2
"[1]红外输入",
"[2]手动输入",};
Retry:
cls();
Clear_123();
Face();
probw_dgn++;
if(probw_dgn>MAXRECORD)
probw_dgn=1;
moveto(7,3);
printf("%d",probw_dgn);
sprintf(bw,"%d",probw_dgn);
dgnback2: Key = InputStr(bdz,3,7,12);
switch(Key)
{case ESC : return ESC ;
case UP :
for(j=0;j<DL_MAX;j++)
bw[j]=0;
probw_dgn--;
if(probw_dgn<1)
probw_dgn=1;
moveto(7,3);
printf(" ");
moveto(7,3);
printf("%d",probw_dgn);
sprintf(bw,"%d",probw_dgn);
goto dgnback2;
case DOWN :
for(j=0;j<DL_MAX;j++)
bw[j]=0;
probw_dgn++;
if(probw_dgn>MAXRECORD)
probw_dgn=1;
moveto(7,3);
printf(" ");
moveto(7,3);
printf("%d",probw_dgn);
sprintf(bw,"%d",probw_dgn);
goto dgnback2;
case ENTER: goto dgngoing;
default : goto dgnback2;
}
dgngoing: if(!strlen(bdz))
{
OutPut_Message ( "请输入表地址!");
cls();
Face();
moveto(7,3);
putstr(bw);
goto dgnback2;
}
SubMenuChoice = popup( 3,10,15,16,SubMenu , "12",2,2,0);//在屏幕中间显示菜单
switch(SubMenuChoice)
{
case 0 : break;
case 1 : return SD;
case 255:
moveto(3,10);
putstr(" ");
moveto(3,12);
putstr(" ");
goto dgnback2;
}
mode = process_bdz(bdz,addr_bcd,delaytime); //mode 为bdz to bcd 的方式
if( mode == -1 ) //处理表地址
{
goto Retry;
}
cls();
Clear_123();
moveto(2,MiddleY);
putstr("读数据中.");
//读正向有功(总电能)(尖)(峰)(平)(谷)
for(i=0;i<5;i++)
sign[i] = ir_read(addr_bcd,0x9010+i,ir_data[i],delaytime);
//读反向有功(总电能)(尖)(峰)(平)(谷)
cls();
Clear_123();
moveto(2,MiddleY);
putstr("读数据中..");
for(i=0;i<5;i++)
sign[5+i] = ir_read(addr_bcd,0x9020+i,ir_data[5+i],delaytime);
//读正向无功(总电能)(尖)(峰)(平)(谷)
cls();
Clear_123();
moveto(2,MiddleY);
putstr("读数据中...");
for(i=0;i<5;i++)
sign[10+i]= ir_read(addr_bcd,0x9110+i,ir_data[10+i],delaytime);
//读反向有功(总电能)(尖)(峰)(平)(谷)
cls();
Clear_123();
moveto(2,MiddleY);
putstr("读数据中....");
for(i=0;i<5;i++)
sign[15+i]= ir_read(addr_bcd,0x9120+i,ir_data[15+i],delaytime);
cls();
for( j=0 ;;)
{
for( i=0 ; i<5 ; i++ )
{
Print_Data ( i,j,sign[ j*5+i ],ir_data[ j*5+i ]);
} //end for
MiddlePutStr("[返回] [存储]",15);
switch(j)
{
case 0 : Draw_UP_DOWN(DOWN);break;
case 3 : Draw_UP_DOWN(UP);break;
default: Draw_UP_DOWN(UP_DOWN);break;
}
Key=Get_Key();
switch(Key)
{
case ESC : return ESC ;
case ENTER : return ENTER ;
case UP : j--; j = j<0 ? 0 : j; break;
case DOWN : j++; j = j>=3? 3 : j; break;
}
}//end for
} //end红外读数据 单表
void Face( void )
{ cls();
keyswitchset(2);
Clear_123();
MiddlePutStr("抄多功能表",1);
moveto(2,3);
putstr("表位:");
moveto(2,5);
putstr("表地址:");
MiddlePutStr ( "[退出] [确认]",15);
Draw_UP_DOWN(UP_DOWN);
}
//输出正在存储
void Put_Storeing( void )
{
cls();
moveto(5,7);
putstr("正在存储...");
drawrect(0,0,127,127); //画一个方框 [0,0]~[127,127]
}
//输出增加记录完成
void Put_Store_Ready( void )
{
cls();
moveto(5,7);
putstr("存储成功!");
drawrect(0,0,127,127); //画一个方框 [0,0]~[127,127]
delay_ms( DELAY_TIME1S );
}
//输出增加记录失败信息
void Put_AddFalseMsg( void )
{
cls();
moveto(13,16);
putstr(" ");
moveto(7,4);
putstr("失败");
moveto(3,7);
putstr("存储失败!");
moveto(3,9);
putstr("按任意键继续!");
key(0);
}
//查找表位和表地值的记录
int Search_ir_Record (char bw[] ,char bdz[] )
{
int bz1,bz2,sign=0;
int num=0;
char str2[50]="";
char str1[50]="";
use("");
use(dbfname);
Record_Number = Get_Record_Number();
if ( Record_Number == 0 )
return -1;
for( num = 0 ; num < Record_Number ; num++ )
{
libset(num,B_W);
libread(str1);
bz1 = strcmp ( bw,str1 ); //查询并定位到相应记录.
libset(num,B_DZ);
libread(str2);
bz2 = strcmp ( bdz,str2);
if( bz1 == 0 && bz2 == 0 )
return num;
}
if ( num == Record_Number )
return -1;
}
// 存储数据
U8 Store_Data( U8 bw[] , U8 bdz[50] , U8 ir_data[][50] ,int Search_Resault)
{
char backstring[50]="";
int i,j;
int m=0,length;
int Number;
int sign=0;
int all,sum;
char datastr[50]="";
float data ;
use("");
use(dbfname);
sum=Get_Record_Number();
all=libsumr();
if(Search_Resault==-1&&sum==all)
{
sign=libappend();
if(sign!=1)
{
return FALSE;
}
Number = libsumr();
Number--;
}
else if(Search_Resault!=-1)
{
Number = Search_Resault;
}
else if(sum<all)
{
Number = sum;
}
libset (Number,B_W); //设置当前记录序号和字段序号.Number:记录序号,JBH:字段序号.成功返回1
libwrit(bw); // libwrit(unsigned char *s) 写当前字段
libset (Number,B_DZ);
libwrit(bdz);
for(m=0,i=START2,j=START1;i<=END2;i++,j++,m++)
{
libset(Number,i);
libread( backstring );
length=strlen(backstring);
if(length)
{
libset(Number,j);
libwrit( backstring );
}
libset(Number,i);
if(strcmp(ir_data[m],"空")!=0)
{
data = atof(ir_data[m]);
data /= 100.0;
sprintf(datastr,"%.2f",data);
libwrit( datastr);
}
else libwrit("");
strcpy (datastr,"");
}
libset(Number,DATA_TIME2);
libread(backstring);
libset(Number,DATA_TIME1);
libwrit(backstring);
libset(Number,DATA_TIME2);
Get_Datetime(backstring);
libwrit(backstring);
return TRUE;
}//end of Store_Data()
//输出数据
void Print_Data ( int i, int j, U8 sign , U8 ir_data[])
{
float data;
U8 Y;
char str[50]="",str2[50]="";
Clear_123();
keyswitchset(0);
switch ( j )
{
case 0 : strcpy (str2, "正向有功:"); break;
case 1 : strcpy (str2, "反向有功:"); break;
case 2 : strcpy (str2, "正向无功:"); break;
case 3 : strcpy (str2, "反向无功:"); break;
}
moveto(2,2);
putstr(str2);
switch ( i )
{
case 0 :
strcpy ( str , "总:"); Y = 4 ; break;
case 1 :
strcpy ( str , "尖:"); Y = 6 ; break;
case 2 :
strcpy ( str , "峰:"); Y = 8 ; break;
case 3 :
strcpy ( str , "平:"); Y = 10; break;
case 4 :
strcpy ( str , "谷:"); Y = 12; break;
}
moveto ( 2,Y );
putstr(str);
data = atof(ir_data);
data /= 100.0;
moveto ( 2 + strlen(str),Y);
if ( sign )
printf("%.2f kWh",data);
else {
printf("数据失败");
strcpy(ir_data,"空");
}
}
//读数据
U8 ir_read(P_U8 addr_bcd,U16 id,P_U8 ir_data,U16 delaytime)
{
U8 sendmsg[50]="",cs=0;
U8 rec[50]="",str[50]="",str1[50]="";
U16 len,len2;
int i,j;
uart_init(1,1200,0x49);
sendmsg[0]=0x68;
for(i=1;i<7;i++)
sendmsg[i]=addr_bcd[i-1];
sendmsg[7]=0x68;
sendmsg[8]=0x01;
sendmsg[9]=0x02;
sendmsg[10]=(id&0x00ff)+0x33;
sendmsg[11]=((id>>8)&0x00ff)+0x33;
for(i=0;i<12;i++)
cs+=sendmsg[i];
sendmsg[12]=cs;
sendmsg[13]=0x16;
for( i= 0; i < 3; i++ )
{
ir_sport(0xfe);
delay_ms(delaytime);
}
ir_trans(sendmsg,14,delaytime);
cs=0;
len=ir_receive(rec);
for(i=0;i<len;i++)
{
if(rec[i]==0x68)
break;
}
if(rec[7+i]!=0x68)
{
uart_init(0,1200,0x49);
return 0;
}
if(rec[8+i]!=0x81) //无后续数据帧
{
uart_init(0,1200,0x49);
return 0;
}
len2=rec[9+i]; //接收数据长度
if(rec[10+i]!=sendmsg[10])
{uart_init(0,1200,0x49);
return 0;
}
if(rec[11+i]!=sendmsg[11])
{uart_init(0,1200,0x49);
return 0;
}
for(j=0;j<len2-2;j++) //接收数据
str[j]=rec[j+i+12]-0x33;
str[j]='\0';
for(j=0+i;j<10+i+len2;j++)
cs+=rec[j];
if(rec[len2+i+10]!= cs)
{
uart_init(0,1200,0x49);
return 0;
}
if(rec[i+11+len2]!=0x16)
{
uart_init(0,1200,0x49);
return 0;
}
memcpy(str1,str,len2-2); //COPY STR TO STR1 长度为LEN2 -2
rotate(str1,len2-2); //将STR 翻转
bcdtochar(str1,len2-2,ir_data); //将BCD码转化为数字
uart_init(0,1200,0x49);
return 1;
}
//输出找不到表地址失败信息
void OutPut_Fand_Failed( char bdz[] )
{
cls();
MiddlePutStr(" 找不到表地址:",MiddleY-2); //字符串居中显示
MiddlePutStr(bdz,MiddleY);
MiddlePutStr(" 的多功能表!",MiddleY+2);
}
//处理表地址
int process_bdz(P_U8 bdz,P_U8 addr_bcd,U16 delaytime)
{
U8 sendmsg[50]="";
U8 rec[50]="";
U8 cs=0;
U16 length;
int i,j;
int mode=3;
int flag=0;
char str[20]="正在寻表";
nextmode:
cs=0;
uart_init(1,1200,0x49);
for(i=0;i<50;i++)
addr_bcd[i]=0; //初始化
if(mode>=0)
bdztobcd(bdz,addr_bcd, mode );
else
{
chartobcd(bdz,addr_bcd);
flag=1;
}
cls();
Clear_123();
moveto(2,MiddleY);
putstr(str); //字符串居中显示
strcat(str,".");
sendmsg[0]=0x68;
for(i=1;i<7;i++)
sendmsg[i]=addr_bcd[i-1];
sendmsg[7]=0x68;
sendmsg[8]=0x01;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -