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

📄 lostevent.lst

📁 电能表源码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 214   1        byte_x_bcd_addone(&wr_buff[10],2);                        //窃电事件总次数加1
 215   1        wr_buff[12]=qiedian_code[type_qiedian][0];                 //窃电代码
 216   1        wr_buff[13]=qiedian_code[type_qiedian][1];
 217   1        wr_buff[14]=qiedian_code[type_qiedian][2];
 218   1      
 219   1        data_addr.word[1]=FL_dianliufanxiang+450;
 220   1        Write_data(FLASH,15);
 221   1      //----------------------------------------------------------结束
 222   1      
 223   1      }
 224          
 225          //======================================================================
 226          //函数功能:保存结束事件
 227          //
 228          //======================================================================
 229          void deel_endenvent(unsigned char type)
 230          { 
 231   1        wr_buff[0]=RTCTIME.rYear;;               //窃电结束时间
 232   1        wr_buff[1]=RTCTIME.rMonth;
 233   1        wr_buff[2]=RTCTIME.rDate;
 234   1        wr_buff[3]=RTCTIME.rHour;
 235   1        wr_buff[4]=RTCTIME.rMinute;
 236   1        data_addr.word[1]=FL_dianliufanxiang+type*100+5;
 237   1        Write_data(FLASH,5);                      //保存结束时间
 238   1      }
 239          
 240          
C51 COMPILER V7.50   LOSTEVENT                                                             05/26/2008 08:17:31 PAGE 5   

 241          
 242          //=========================================================================
 243          //函数功能:根据电流不平衡情况,切换计量通道
 244          //入口参数:不平衡状态
 245          //=========================================================================
 246          void change_channlmeter(unsigned char type_shijian)
 247          { unsigned long  A_dianliu,B_dianliu;
 248   1        unsigned char tempdata;
 249   1         Read_datafromID(ID_RMSCURNTA);
 250   1         A_dianliu=value_hex_from_4bcd(wr_buff)/100;
 251   1         Read_datafromID(ID_RMSCURNTB);
 252   1         B_dianliu=value_hex_from_4bcd(wr_buff)/100;
 253   1         if(type_shijian==start_qiedian)                              //电流不平衡时切换计量通道
 254   1               {  if(A_dianliu<B_dianliu)                              //A不平衡
 255   2                              { if(cuurnt_channl==0)
 256   3                                   { cuurnt_channl=1;                          //当前计量通道改为B 
 257   4                                         tempdata=ReadMeterFunc();
 258   4                                         tempdata|=0x20;                           //切换到B通道
 259   4                                 SetMeterFunc(tempdata);
 260   4                           }
 261   3                              }
 262   2                       else                                                //B不平衡
 263   2                          { if(cuurnt_channl==1)
 264   3                                   { cuurnt_channl=0;
 265   4                                         tempdata=ReadMeterFunc();
 266   4                                         tempdata&=0xdf;                           //切换到A通道
 267   4                                 SetMeterFunc(tempdata);
 268   4                           }
 269   3                              }
 270   2              }
 271   1       else if(type_shijian==end_qiedian)                          //结束则切换回A通道计量
 272   1         { if(cuurnt_channl==1)
 273   2              { cuurnt_channl=0;
 274   3                        tempdata=ReadMeterFunc();
 275   3                        tempdata&=0xdf;                           //切换到A通道
 276   3                        SetMeterFunc(tempdata);
 277   3              }
 278   2         }
 279   1      
 280   1      }
 281          
 282          //=====================================================================
 283          //函数功能:失压事件下切换计量通道,有效值和能量
 284          //入口参数:失压状态
 285          //=====================================================================
 286          void chang_channlrms(unsigned char type_shijian)
 287          { unsigned char value;
 288   1        if(type_shijian==start_qiedian)                      //如果是停电事件发生
 289   1            { value=ReadMeterFunc();
 290   2                  value|=0x40;                                   //选择有效值计量
 291   2              SetMeterFunc(value);
 292   2                }
 293   1        else
 294   1           { value=ReadMeterFunc();
 295   2                 value&=0xbf;                                   //选择能量计量
 296   2             SetMeterFunc(value);
 297   2               }
 298   1      
 299   1      }
 300          
 301          //================================================================
 302          //函数功能:停电时结束所有窃电事件
C51 COMPILER V7.50   LOSTEVENT                                                             05/26/2008 08:17:31 PAGE 6   

 303          //
 304          //================================================================
 305          void Ene_lostenvent(void)
 306          { if(sta_dianliufan==start_qiedian)
 307   1          deel_endenvent(0);
 308   1        if(sta_bupingheng==start_qiedian)
 309   1           deel_endenvent(1);
 310   1        if(sta_shiya==start_qiedian)
 311   1          deel_endenvent(2);
 312   1      }
 313          
 314          //==========================================================================
 315          //函数功能:防窃电和防潜功能
 316          //备注:两个事件不能同事检测,必须等到一个事件检测完毕,再渐次另外事件
 317          //==========================================================================
 318          void lost_qiandongmode(void)
 319          { unsigned char tempdata;
 320   1        if(flag_losetenvt_sec==1)
 321   1            { if(time_qiandong>=qidong_time)              //如果潜动时间到,
 322   2                 { time_qiandong=0;
 323   3                       lcr_dianliangsum();                   //清除电量累加器
 324   3                     }
 325   2              if(type_qiedian==0xff)                  //如果无窃电事件需要处理
 326   2                 { if(busy_buffflash==0)                     //如果缓存flash空闲
 327   3                    { if(flag_type>2)
 328   4                          { flag_type=0;                   //一轮事件判断结束
 329   5                            flag_losetenvt_sec=0;
 330   5                          }
 331   4                      else
 332   4                          flag_type++;
 333   4                      switch(flag_type) 
 334   4                         { case 0:                                                 //电流反向事件
 335   5                                                pan_dianliufan();                                  //判电流当前状态
 336   5                                type_shijian=pan_lostshijian(&sta_dianliufan,&sta_checkdialiufan,&time_checkdian
             -liufan,10);
 337   5                                                    if(type_shijian==start_qiedian)
 338   5                                                            F_fanxiangbaojin=1;                      //电流反向报警灯打开
 339   5                                else if(type_shijian==end_qiedian)
 340   5                                                            F_fanxiangbaojin=0;                      //电流反向报警灯关
 341   5                                                        break;
 342   5                           case 1:
 343   5                                pan_bupingheng();                                  //判电不平衡
 344   5                                Read_datafromID(ID_GATLOSTCUR);
 345   5                                tempdata=value_hex_from_bcd(wr_buff[2]); //时间  
 346   5                                type_shijian=pan_lostshijian(&sta_bupingheng,&sta_checkbupingheng,&time_checkbup
             -inheng,tempdata);
 347   5                                                    if(type_shijian!=idle_qiedian)                              
 348   5                                                            { change_channlmeter(type_shijian);                 //电流不平衡时切换计量通道
 349   6                                      if(type_shijian==start_qiedian)
 350   6                                                                          F_bupinhenbaojin=1;                           //不平衡报警灯打开
 351   6                                                                      else
 352   6                                                                          F_bupinhenbaojin=0;                           //不平衡报警灯关闭 
 353   6                                                                }
 354   5                                                        break;
 355   5                                           case 2:
 356   5                                                    pan_shiya();                                //判失压事件
 357   5                                                        Read_datafromID(ID_GATCUTPOW); 
 358   5                                tempdata=value_hex_from_bcd(wr_buff[2]); //时间  
 359   5                                                        type_shijian=pan_lostshijian(&sta_shiya,&sta_checkshiya,&time_checkshiya,tempdata);
 360   5                                if(type_shijian!=idle_qiedian)             //如果有失压事件发生
 361   5                                     { chang_channlrms(type_shijian);      //切换计量通道 
 362   6                                       if(type_shijian==start_qiedian)
C51 COMPILER V7.50   LOSTEVENT                                                             05/26/2008 08:17:31 PAGE 7   

 363   6                                             F_shiyabaojin=1;              //开失压报警灯
 364   6                                       else
 365   6                                             F_shiyabaojin=0;              //关失压报警灯   
 366   6                                     }    
 367   5                                                        break;
 368   5                                               case 3:
 369   5                                type_shijian=idle_qiedian;
 370   5                                                //pan_qiangci();                             //判强磁事件
 371   5                                                        //type_shijian=pan_lostshijian(&sta_shiya,&sta_checkshiya,&time_checkqiangci,5);
 372   5                                                        break;
 373   5                                                default:
 374   5                                                    flag_type=0;
 375   5                                                    break;
 376   5                         }  
 377   4                   
 378   4                      if(type_shijian!=idle_qiedian)                                 //窃电事件开始
 379   4                                           type_qiedian=flag_type;                                  //表示窃电事件处理开始
 380   4                               }
 381   3                         }
 382   2                if(type_qiedian!=0xff)                                              //如果有窃电事件进行处理  
 383   2                             { if(type_shijian==start_qiedian)                                //如果事件开始状态还没处理
 384   3                                       {  busy_buffflash=1;                                       //置位buff忙标志位
 385   4                                                  if(copy_flash(FL_dianliufanxiang,FL_wrbuffer,512)==1)   //如果保存数据到缓存成功
 386   4                                 { F_askerasenvernt=1;                                //事件页擦除
 387   5                                                       type_shijian=ok_copybuff;                           //状态切换到准备保存数据
 388   5                                 }
 389   4                              else                                                   //如果拷贝失败
 390   4                                 { if(Ferr_buff==flash_err)                          //如果本来该页已经错误
 391   5                                                              { F_askerasenvernt=1;                           //事件页擦除
 392   6                                                            type_shijian=ok_copybuff;                     //状态切换到准备保存数据
 393   6                                                                  }
 394   5                                                           else
 395   5                                                            F_askerasbuffer=1;                            //存数据失败,对缓存进行擦除
 396   5                                 } 
 397   4                                            }
 398   3                                        else if((type_shijian==ok_copybuff)&&(F_askerasenvernt==0))   //如果缓存数据完毕且页擦除完毕
 399   3                                            { deel_recoverdata();                                     //恢复数据并保存开始事件
 400   4                                                  type_qiedian=0xff;                                     //处理结束,继续处理下一事件
 401   4                                                  F_askerasbuffer=1;                                     //擦buffer页
 402   4                                            }
 403   3                                        else if(type_shijian==end_qiedian)                           //事件结束
 404   3                                            { deel_endenvent(type_qiedian);                          //处理结束事件
 405   4                                                  type_qiedian=0xff;                                     //处理结束,继续处理下一事件
 406   4                                                }
 407   3                                 } 
 408   2                
 409   2          }
 410   1      }                                                                                                         
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1641    ----
   CONSTANT SIZE    =     12    ----
   XDATA SIZE       =   ----      34
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
C51 COMPILER V7.50   LOSTEVENT                                                             05/26/2008 08:17:31 PAGE 8   

   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -