⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wondercb.c

📁 该软件用于抄表器 实现多功能表自动抄表! 只需将其下载到9800型 抄表器即可运行!
💻 C
📖 第 1 页 / 共 4 页
字号:
  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 + -