Beispiel #1
0
// запись в журнал событий по одному разу
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;
  }
}
Beispiel #2
0
//------------------------------------------------------------------------------
// 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;
}
Beispiel #3
0
// вызываеться из потока 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;
  }
}
Beispiel #4
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();
}
Beispiel #5
0
/*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
}
Beispiel #6
0
//------------------------------------------------------------------------------
// проверка конфликтов каналов
// 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);
}
Beispiel #7
0
/*----------------------------------------------------------------------------*/
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
}