#include "global.th" #include "sensors.th" #include "braker.th" #include "relay.th" extern Configuration config; string ports = ""; BrakerProcess brakers[BRAKER_COUNT]; void braker_add_port(char port){ if (instr(1,ports,port,1)==0){ ports+=(string)chr(port); } } bool isBrakerPort(int port){ char p = (char)port; // d(instr(1,ports,chr(p),1)); return (instr(1,ports,chr(p),1)>0); } void brakers_init(){ ports = ""; config.STORE_BRAKER = false; for (int num = 0;num 0){ braker_add_port(config.BRAKERS[num].SensPort); io.num = INPIN[config.BRAKERS[num].SensPort-1]; io.enabled=false; } if (config.BRAKERS[num].DropPort >0){ braker_add_port(config.BRAKERS[num].DropPort); io.num = INPIN[config.BRAKERS[num].DropPort-1]; io.enabled=false; } io.num = OUTPIN[config.BRAKERS[num].Relay-1]; io.enabled=true; #endif } } } void braker_init(unsigned char number, unsigned char sensor, unsigned char drop, unsigned char relay, unsigned long timeout) { if (number >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; config.BRAKERS[num].Mode = sensor == 0 ? 1 : 0; brakers[num].config = &config.BRAKERS[num]; brakers[num].State = false; brakers[num].OnTime = 0; brakers[num].Fifo=""; if (config.BRAKERS[num].Enable){ config.STORE_BRAKER = true; #if PLATFORM_ID != SIMULATOR if (config.BRAKERS[num].SensPort >0){ braker_add_port(config.BRAKERS[num].SensPort); io.num = INPIN[config.BRAKERS[num].SensPort-1]; io.enabled=false; } if (config.BRAKERS[num].DropPort >0){ braker_add_port(config.BRAKERS[num].DropPort); 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)); if (brakers[num-1].config->Mode == 0){ brakers[num-1].Fifo += type; d("Бракиратор #"+str(num)+" сигнал ["+type+"]"); } else{ if (type == "G"){ braker_change_state(num-1,true); d("Бракиратор #"+str(num)+" включен по сигналу сервера"); }else{ d("Бракиратор #"+str(num)+" получил сигнал 'B'. Игнорируем."); } } } 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){ // Обработка таймаута braker_change_state(num,false); d("Бракиратор #"+str(number)+" выключен по таймауту ["+str(sys.timercountms - brakers[num].OnTime)+"/"+str(timeout)+"]ms"); }else{ // проверка статуса порта if (brakers[num].config->DropPort>0 && getPinState(brakers[num].config->DropPort)){ braker_change_state(num,false); d("Бракиратор #"+str(number)+" выключен по сигналу сброса через "+str(sys.timercountms - brakers[num].OnTime)+"ms"); } } }else{ // проверка на сработку if (brakers[num].config->Mode==0 && pinChange(brakers[num].config->SensPort) && getPinStateS(brakers[num].config->SensPort,true)){ if (braker_get_current(num) == "B"){ braker_change_state(num,true); d("Бракиратор #"+str(number)+" включен по сигналу сенсора"); } } } } } void braker_change_state(unsigned char num, bool state){ relay_set(brakers[num].config->Relay,state); brakers[num].State = state; if (state){ //d("set timer for "+str(num)); brakers[num].OnTime = sys.timercountms; }else{ //d("reset timer for "+str(num)); brakers[num].OnTime = 0; } } 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+1)+": Получено текущее значение = ["+c+"]"); return c; }