// запись в журнал событий по одному разу static void WrateEventStr(const BYTE inEvent) { static bool fWr[ST_END]={0}; switch(inEvent) { case ST_M_OK: if(!fWr[ST_M_OK]){fWr[ST_M_OK] = true;Event_Push_Str("GPS/GLONASS модуль найден");} fWr[ST_M_NO] = false; break; case ST_M_NO: if(!fWr[ST_M_NO]){fWr[ST_M_NO] = true;Event_Push_Str("GPS/GLONASS модуль потерян");} fWr[ST_M_OK] = false; break; case ST_F_OK: //if(!fWr[ST_F_OK]){fWr[ST_F_OK] = true;Event_Push_Str("GPS/GLONASS время определил");} fWr[ST_F_NO] =false; break; case ST_F_NO: //if(!fWr[ST_F_NO]){fWr[ST_F_NO] = true;Event_Push_Str("GPS/GLONASS время потерял");} fWr[ST_F_OK] = false; break; case ST_T_OK: if(!fWr[ST_T_OK]){fWr[ST_T_OK] = true;Event_Push_Str("GPS/GLONASS время ОК");} fWr[ST_T_NO] = false; break; case ST_T_NO: if(!fWr[ST_T_NO]){fWr[ST_T_NO] = true;Event_Push_Str("GPS/GLONASS время NO");} fWr[ST_T_OK] = false; break; } }
//------------------------------------------------------------------------------ // fin_try==0 - последняя поппытка, можно и записать в журнал ерроры BOOL ligh_load_init(int fin_try) { // memset(&DK[CUR_DK],0,sizeof(DK[CUR_DK])); // clear crc memset(&crc_idp,0,sizeof(crc_idp)); // FLASH_PROGS flash_rd(FLASH_PROGRAM, sizeof(TPROJECT)*CUR_DK, (unsigned char*)&PROJ[CUR_DK], sizeof(PROJ[CUR_DK])); unsigned long crc=crc32_calc((unsigned char*)&PROJ[CUR_DK] , sizeof(PROJ[CUR_DK]) - sizeof(PROJ[CUR_DK].CRC32)); // unsigned long crc_progs; flash_rd(FLASH_PROGS, sizeof(TPROGRAMS)*(CUR_DK+1)-sizeof(crc_progs) , (unsigned char*)&crc_progs, sizeof(crc_progs)); // crc_idp.crc = crc_progs;// сохраним для передачи по UDP //i_size = sizeof(PROJ[CUR_DK]); if (PROJ[CUR_DK].ProjectSize ==sizeof(PROJ[CUR_DK])) { if ( crc == PROJ[CUR_DK].CRC32) { // if (crc_progs==PROJ[CUR_DK].CRC32_programs) { Init_DK(); DK[CUR_DK].proj_valid=true; DK[CUR_DK].work = true; DK[CUR_DK].progs_valid = true; return true; } else { dbg_printf("FAULT. CRC32 of progs invalid"); if (CUR_DK==0) if (!fin_try) Event_Push_Str("Некорр. программы (CRC)"); } } else { dbg_printf("FAULT. PROJ.CRC32"); if (CUR_DK==0) if (!fin_try) Event_Push_Str("Некорр. проект (CRC)."); } } else { if (CUR_DK==0) if (!fin_try) Event_Push_Str("Некорр. проект (размер)."); // dbg_printf("FAULT. PROJ.ProjectSize ==sizeof(PROJ)"); } return false; }
// вызываеться из потока 0.5 sec. static void checksumProject(void) { const BYTE TimeDelay = 5; static BYTE step = Null; static BYTE timeCall = 0; static BOOL choiceFlash = false; /* ///////////// test ///////////// if(DK[CUR_DK].tumblerAUTO) DK[CUR_DK].PROJ->CRC32 = 0; //ломаем CRC32 //////////// END /////////////// */ if(step==Null) { if(++timeCall>TimeDelay){ // проверка проекта 1 раз 5 сек timeCall = 0; if(!validProjectRAM()){ // проблемы с проектов в ОЗУ // запись в журнал проверки RAM if(!choiceFlash)Event_Push_Str("Авария CRC проекта 1 RAM!"); if(choiceFlash)Event_Push_Str("Авария CRC проекта 2 RAM!"); if(!validProjectALL(choiceFlash)){ // проблемы с проектом в флешь if(!choiceFlash){Event_Push_Str("Авария CRC проекта копия 1!");choiceFlash = true;} // проверка второй копии if(!validProjectALL(choiceFlash)){ Event_Push_Str("Авария CRC проекта копия 2!"); DK_HALT(); step=One; // уходим в отключение return; } return; } } } } else if(step==One) // авария все отключаем { DK_HALT(); } else // dafault { step=Null; timeCall = 0; } }
//------------------------------------------------------------------------------ void Check_DS() { if (abs(WAIT_1S_COUNT-DS_INTS_COUNT)>5){ //ales dbg_puts("Clock error!!!!!"); Event_Push_Str("Часы (DS1390) не работают!!!"); // #ifndef DEBUG DK_HALT(); #endif } Clear_DS_COUNTS(); }
/*loop cycle*/ static void task_light_func(void* param) { //unsigned short light; bool b_ch;//, b_err; unsigned int fpattern; //int i_sec; 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; } //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;} // здесь организовано миганине силовых выходов вот так!(в проетке его нет) /*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 }
//------------------------------------------------------------------------------ // проверка конфликтов каналов // return false - valid true - invalid static bool Check_Chan(void) { char buf[60]; static bool ret,sta, sta1, sta2, sta_tra; ret=false; GREEN_PORT_ERR=0; RED_PORT_ERR=0; BOOL power_valid=true; chan_faults=FT_NO; //int ic_new; // Check_Channels(); // call adc.c // //Validate power if((sens_zero_count[SENS_N-1]< 100) && (sens_plus_count[SENS_N-1]<100)) power_valid=false; //sens_count if ((sens_zero_count[SENS_N-1] + sens_plus_count[SENS_N-1]) > (sens_count+5)) power_valid=false; // if (power_valid) if (!DK[CUR_DK].test) if (U_STAT_PW!=U_STAT_PW_last) { if (U_STAT_PW) { if (PROJ[CUR_DK].jornal.power_on) Event_Push_Str("Включение напряжения"); /// U_STAT_PW_last=true; } else { if (PROJ[CUR_DK].jornal.power_off) Event_Push_Str("Oтключение напряжения"); /// U_STAT_PW_last=false; } } // if (!power_flag) return (false); /// if (light_time_out) { light_time_out--; return (false); } if (U_STAT_PW==0) return (false); // if (DK[CUR_DK].test) return (false); // U sensors work for (int ic=0; ic<SENS_N; ic++) { if ((sens_zero_count[ic]> 100) && (sens_plus_count[ic]==0) ) { if (ic<SENS_N-1) { sta2 = (GREEN_PORT_CONF & (1<<ic))>0 ? true: false; // if (PROJ[CUR_DK].jornal.alarm) if (!DK[CUR_DK].U_sens_fault_log[ic]) { DK[CUR_DK].U_sens_fault_log[ic]=true; snprintf(buf, 60 , "Датчик зел. %u неисправен",(ic+1)); Event_Push_Str(buf); chan_faults |= FT_GREEN_SENS; } // if (sta2) ret=true; } else { if (PROJ[CUR_DK].jornal.alarm) if (!DK[CUR_DK].U_sens_power_fault_log) { DK[CUR_DK].U_sens_power_fault_log=true; Event_Push_Str("Дачик напряжения не работает!"); } } } } // for (int ic=0; ic<8; ic++) { sta = (U_STAT[ic]>0) ? true : false; sta1 = (GREEN_PORT & (1<<ic))>0 ? true : false; sta2 = (GREEN_PORT_CONF & (1<<ic))>0 ? true: false; // состояния различаются if (sta2) //if (!sta_tra) if (sta ^ sta1) { //Validate if ((sens_zero_count[ic]< 100) && (sens_plus_count[ic]<100)) continue; //sens_count if ((sens_zero_count[ic] + sens_plus_count[ic]) > (sens_count+5)) continue; // выход - НЕТ, сигнал ЕСТЬ if (sta) { //недостаточный уровень // GREEN_PORT=0, U_STAT=1 if (sens_zero_count[ic]< 3*sens_plus_count[ic]) //if (udc_middle[ic]<500000) continue; } else { // пропадание зеленого, // GREEN_PORT=1, U_STAT=0 //if (udc_middle[ic]>100000) if (sens_zero_count[ic]> sens_plus_count[ic]/2) continue; } //различаются // AHTUNG GREEN_PORT_ERR= GREEN_PORT_ERR | (1<<ic); if (PROJ[CUR_DK].jornal.alarm) { if (sta_tra) sta1=false; /// if (sta1) { snprintf(buf, 60 , "Зел. выход %u неисправен",(ic+1)); chan_faults |= FT_GREEN_CHAN ; } else { snprintf(buf, 60 , "Конфликт зел., выход %u",(ic+1)); chan_faults |= FT_GREEN_CONFL ; } Event_Push_Str(buf); } ret=true; } } for (int ic=0; ic<8; ic++) { sta = (I_STAT[ic]>0)? true : false; sta1 = (RED_PORT & (1<<ic))>0 ? true : false; sta2 = (RED_PORT_CONF & (1<<ic))>0 ? true : false; if (sta2) if (sta ^ sta1){ //различаются AHTUNG RED_PORT_ERR= RED_PORT_ERR | (1<<ic); // if(PROJ[CUR_DK].jornal.alarm){ if (sta1){ snprintf(buf, 60 , "КР выход %u без нагрузки",(ic+1)); chan_faults |= FT_RED_CONFL; } Event_Push_Str(buf); } ret=true; } } return (ret); }
/*----------------------------------------------------------------------------*/ 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 }