tibbo_line/braker.tc

133 lines
4.3 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;
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 <BRAKER_COUNT; num++){
brakers[num].config = &config.BRAKERS[num];
if (config.BRAKERS[num].Enable){
config.STORE_BRAKER = true;
#if PLATFORM_ID != SIMULATOR
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;
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
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));
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 (brakers[num].config->DropPort>0 && 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+1)+": Получено текущее значение = ["+c+"]");
return c;
}