// остановка ДК авария void DK_HALT(void) { LIGHT_STA = LIGHT_FAULT; POWER_SET(false); SIGNAL_OFF(); DK_ALARM_OC(); DK_MAIN(); }
//------------------------------------------------------------------------------ // следующая попытка static void Next_Try(bool b) { if (!DK[CUR_DK].no_FAULT) if (b) { //все отключаем if (reboot_tryes<PROJ[CUR_DK].guard.restarts) { reboot_tryes++; if (chan_faults!=FT_RED_CONFL){ POWER_SET(false); // off rele SIGNAL_OFF(); Save_LET(); // for (int i_dk=0; i_dk<dk_num; i_dk++) { CUR_DK = i_dk; Init_DK(); DK_ALARM_OC(); } // DK_MAIN(); light_machine.work=false; // }else{ Save_LET(); for (int i_dk=0; i_dk<dk_num; i_dk++) { CUR_DK = i_dk; Init_DK(); DK_ALARM_OC();//DK_ALARM_YF(); } DK_MAIN(); } Next_Try_wait = true; chan_faults=FT_NO; tn_task_sleep(100); } else { DK_HALT(); } } }
/*----------------------------------------------------------------------------*/ static void task_light_func(void* param) { bool b_ch; unsigned int fpattern; WORD TimeErrorGPS; BYTE fStat=false; SYSTEMTIME cur_time; DS1390_TIME time; CUR_DK=0; SIGNAL_OFF(); POWER_SET(true); SIGNAL_OFF(); pin_off(OPIN_ERR_LED); // error enabled // tn_task_sleep(500); SIGNAL_OFF(); pin_off(OPIN_TR_EN);//включить выходные регистры // Event_Push_Str("СТАРТ");// запись в журнал старт light_time_out=1; for (;;) { //считать время GetTime_DS1390(&time); // обновить cur_time.tm_hour = time.hour; cur_time.tm_mday = time.date; cur_time.tm_min = time.min; cur_time.tm_sec = time.sec; cur_time.tm_mon = time.month; cur_time.tm_year = time.year; // if (Next_Try_wait) if (Seconds_Between(&L_ERR_TIME, &cur_time) > PROJ[CUR_DK].guard.restart_interval){ for (int i_dk=0; i_dk<dk_num; i_dk++) { DK[i_dk].REQ.req[ALARM].presence = false; } light_machine.work=true; // if (chan_faults!=FT_RED_CONFL){ SIGNAL_OFF(); POWER_SET(true); SIGNAL_OFF(); } // Next_Try_wait = false; } // test mode if(DK[0].test) { if(!DK[0].test_init){ SIGNAL_OFF(); DK[0].test_init=true; } // Clear_UDC_Arrays(); tn_task_sleep(500); // Check_Channels(); continue; } // last time error Check_LET(); // work mode if (!light_machine.work){ tn_task_sleep(500); continue; } // ждем данных от GPS if((DK[0].PROJ->guard.gpsON)&&(LIGHT_STA==LIGHT_WORK)){ // работаем только с GPS DK_Service_undo(); GPS_INFO gps; Get_gps_info(&gps); switch(fStat) { case Null: // первый старт time_valid if(gps.time_valid==false){// выходим с аварией gps.fix_valid tn_task_sleep(2000); DK_ALARM_OC(); break;} DK_ALARM_undo();// включаем режим TimeErrorGPS = 0; fStat=One; break; case One:// нет данных GPS if(!gps.time_valid){TimeErrorGPS = 0;fStat=Two;} // gps.fix_valid break; case Two:// задерка на выключение 5 мин if(++TimeErrorGPS>300){DK_ALARM_OC();fStat=Three;} if(gps.time_valid)fStat=One; //gps.fix_valid break; case Three://ждем GPS данные if(gps.time_valid){TimeErrorGPS =0;fStat=Five;} // gps.fix_valid break; case Five:// задерка на включение 2 мин if(++TimeErrorGPS>120){DK_ALARM_undo();fStat=One;} if(!gps.time_valid)fStat=Three; // gps.fix_valid break; default:fStat=One;break; } } //machine stat switch (LIGHT_STA) { case LIGHT_WORK: { tn_event_wait(&g_light_evt, EVENT_SINHRO_TIME, TN_EVENT_WCOND_OR, &fpattern, TN_WAIT_INFINITE); //синхронизация времени GPS&RTC Synk_TIME(); //проверка конфликтов каналов b_ch = Check_Chan(); if(b_ch){ Next_Try(b_ch);break;} // основная логика работы DK_MAIN(); tn_task_sleep(500);// delay 0.5S //проверка конфликтов каналов b_ch = Check_Chan(); if(b_ch){ Next_Try(b_ch);break;} // провка проекта, он слетает checksumProject(); // здесь организовано миганине силовых выходов вот так!(в проетке его нет) /*for (int i_dk=0; i_dk<dk_num; i_dk++) { CUR_DK = i_dk; // тукущий ДК Update_STATES(true); } */ SET_OUTPUTS(); break; } case LIGHT_FAULT: { tn_task_sleep(500); break; } }// end switch }// end for }