tibbo_line/braker.tc

155 lines
4.8 KiB
Plaintext
Raw Permalink 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
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
}
}
}
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;
}