📄 lostevent.lst
字号:
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 + -