tibbo_line/braker.tc

109 lines
3.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 <BRAKER_COUNT; num++){
brakers[num].config = &config.BRAKERS[num];
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
}
}
}
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;
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;
}