#include "global.th" #include "sensors.th" #include "braker.th" #include "relay.th" extern Configuration config; BrakerProcess brakers[BRAKER_COUNT]; void brakers_init(){ for (int num = 0;num 3){ d("ERROR: Big braker number - set "+str(number)+" but max "+ str(BRAKER_COUNT)); } unsigned char num = number -1; config.BRAKERS[num].Enable = true; config.BRAKERS[num].SensPort = sensor; config.BRAKERS[num].DropPort = drop; config.BRAKERS[num].Relay = relay; config.BRAKERS[num].Timeout = timeout; brakers[num].config = &config.BRAKERS[num]; brakers[num].State = false; brakers[num].OnTime = 0; brakers[num].Fifo=""; if (config.BRAKERS[num].Enable){ #if PLATFORM_ID != SIMULATOR io.num = INPIN[config.BRAKERS[num].SensPort-1]; io.enabled=false; io.num = INPIN[config.BRAKERS[num].DropPort-1]; io.enabled=false; io.num = OUTPIN[config.BRAKERS[num].Relay-1]; io.enabled=true; #endif } } /// ** /// Обработка команды для бракиратора - G1 или B1. Где G|B статус сигнала (Good|Bad), а цифра - номер бракиратора /// ** void braker_set(string cmd){ if (len(cmd)!=2) d("Неверный формат команды = '"+cmd+"'"); string type = left(cmd,1); unsigned char num = val(right(cmd,1)); brakers[num-1].Fifo += type; d("Бракиратор #"+str(num)+" сигнал ["+type+"]"); } void braker_proc(unsigned char number) { unsigned char num = number-1; bool en = brakers[num].config->Enable; if (brakers[num].config->Enable==true){ unsigned long timeout = brakers[num].config->Timeout; if (brakers[num].State){ // проверка на выключение if (brakers[num].OnTime + timeout < sys.timercountms){ // Обработка таймаута relay_set(brakers[num].config->Relay,false); brakers[num].State = false; d("Бракиратор #"+str(number)+" выключен по таймауту ["+str(sys.timercountms - brakers[num].OnTime)+"/"+str(timeout)+"]ms"); brakers[num].OnTime = 0; }else{ // проверка статуса порта if (getPinState(brakers[num].config->DropPort)){ relay_set(brakers[num].config->Relay,false); brakers[num].State = false; d("Бракиратор #"+str(number)+" выключен по сигналу сброса через "+str(sys.timercountms - brakers[num].OnTime)+"ms"); brakers[num].OnTime = 0; } } }else{ // проверка на сработку if (pinChange(brakers[num].config->SensPort) && getPinStateS(brakers[num].config->SensPort,true)){ if (braker_get_current(num) == "B"){ relay_set(brakers[num].config->Relay,true); brakers[num].State = true; brakers[num].OnTime = sys.timercountms; d("Бракиратор #"+str(number)+" включен по сигналу сенсора"); } } } } } string braker_get_current(unsigned char num){ string c = left(brakers[num].Fifo,1); int l = len(brakers[num].Fifo); brakers[num].Fifo = right(brakers[num].Fifo,l-1); d("Бракиратор #"+str(num)+": Получено текущее значение = ["+c+"]"); return c; }