Konstrukcijski rad, simulator rada uređaja za osiguranje željezničko-cestovnog prijelaza

Dependencies:   mbed TextLCD ULN2003_StepperDriver

Simulator rada uređaja za osiguranje željezničko-cestovnog prijelaza

1. Uvod

Uređaji za osiguranje željezničko-cestovnih prijelaza (ŽCP) ugrađuju se na željezničke pruge kako bi se umanjila mogućnost naleta vlaka na cestovna vozila ili pješake. Pri tome takvi uređaji moraju udovoljiti strogim tehničkim uvjetima za siguran rad. Ovaj konstrukcijski rad daje prikaz automatskog uređaja za osiguranje ŽCP-a na otvorenoj pruzi. Automatski uređaj uključuje i isključuje sam vlak prelaskom preko uključno-isključnih elemenata.

2. Opis 2.1. Elementi simulatora

Uređaj koji je simuliran ovim konstrukcijskim radom sastoji se od sljedećih osnovnih funkcionalnih elemenata: • središnja upravljačka i nadzorna jedinica • uključni i isključni elemanti • cestovni svjetlosni i zvučni signali • postavljač polubranika • nadzorno sučelje.

Središnja upravljačko-nadzorna jedinica je MBED mikroupravljač NUCLEO F411RE. Na modul NUCLEO dodani su ulazno-izlazni elementi: • 3 reed releja za uključenje i isključenje uređaja • 4 LED za cestovne signale (dva signala) • piezzo zvučnik • integrirani krug ULN2003 za upravljanje stepper motorom • stepper motor 17PM-M012 • LCD 16x2 s I2C komunikacijom • LED za javljanje stanja uređaja uključenje, isključenje, kvar, smetnja • tipkalo za reset kvara i smetnje.

2.2. Način rada

Dovođenjem napona napajanja uređaj ja uključen u osnovnom stanju u kojem su svjetlosni signali i zvučnik isključeni, a motka polubranika u gornjem položaju. Aktiviranjem jednog od releja uključenja (k_uklj1 ili k_uklj2) uključuju se trepćuće svjetlo na cestovnim signali i zvučnik. Nakon proteka vremena predzvonjenja (potrebno da prijelaz napuste vozila i pješaci) pokreće se motor i postavlja motku polubranika u donji položaj kako bi se zaštitio prijelaz. Uređaj ostaje u ovom stanju sve dok se ne aktivira isključni relej ili dok ne protekne programirano vrijeme uključenog stanja. Pojavom jednog od navedenih uvjeta pokreće se motor i postavlja motku polubranika u gornji položaj, a nakon toga se isključuju svjetlosni signali. Po isključenju uređaj ne dolazi odmah u osnovno stanje već ostaje u stanju u kojem se ne može uključiti aktiviranjem uključnih elemenata kako bi se spriječilo ponovno uključenje kad se aktivira (prolaskom vlaka) uključni element u odlaznom smjeru (element koji nije uključio. Osnovno stanje nastaje kada se aktivira uključni element u odlaznom smjeru ili istekom programiranog vremena nakon čega je uređaj spreman za novo uključenje.

Funkcija kvara uključuje stanje „kvar“ u slučaju: • aktiviranja isključnog elementa za vrijeme osnovnog stanja • loma motke polubranika • struje LED izvan zadanog prozora Funkcija smetnje uključuje stanje „smetnja“ u slučaju: • automatskog isključenja uređaja nakon isteka vremena bez aktiviranja isključnog elementa • automatskog osnovnog stanja nakon isteka vremena bez aktiviranja uključnog elementa

Na LCD se prikazuju broj nastalih smetnji, broj nastalih kvarova te aktivno stanje smetnje i kvara. Prijenos informacija na LCD odvija se I2C komunikacijom. Kod uređaja ŽCP-a ugrađenih na pruzi ova javljanja koriste se za regulaciju prometa vlakova i za provjeru postupanja prometnih radnika u slučaju nastanka smetnje ili kvara.

3. Zaključak

U radu stvarnog uređaja pojavljuju se još neke situacije koje nisu obuhvaćene ovim konstrukcijskim radom, ali njihovo rješavanje nadilazi okvire ovog projektnog zadatka.

main.cpp

Committer:
dkrajacic
Date:
2019-11-16
Revision:
1:a49b3c29aeb2
Parent:
0:e1ee9ea8436b

File content as of revision 1:a49b3c29aeb2:

#include "mbed.h"
#include "TextLCD.h"    //ovo je head za LCD
#include "ULN2003.h"    //ovo je head za motor

Serial pc(USBTX, USBRX); // tx, rx
ULN2003 postavljac(PB_10, PB_4, PB_5, PB_3, 4096); //definiranje izlaza za stepper

I2C i2c_lcd(I2C_SDA, I2C_SCL); // SDA, SCL, I2C komunikacija za LCD
TextLCD_I2C lcd(&i2c_lcd, 0x4e, TextLCD::LCD16x2);  // I2C bus, PCF8574 Slaveaddress, LCD Type; LCD na I2C komunikaciji:

//TextLCD lcd(PA_0, PA_1, PA_4, PB_0, PC_1, PC_0); // RS, E, D4-D7, LCDType=LCD16x2, BL=NC, E2=NC, LCDTCtrl=HD44780; spajanje lcd-a na pinove (ako zatreba)

//SPI spi_lcd(P_, P_NC, P_); // MOSI, MISO, SCLK; // SPI komunikacija (ako zatreba):
 
DigitalOut led1(PC_10); //LED c.s. 1-4
DigitalOut led2(PC_12); 
DigitalOut led3(PA_6);
DigitalOut led4(PA_7);
DigitalOut ledi(PC_2);  //LED stanja isključenja 
DigitalOut ledu(PC_3);  //LED stanja uključeno
DigitalOut ledk(PA_1);  //LED kvara
DigitalOut leds(PA_0);  //LED kvara
DigitalIn gp(PB_1);  //LED k
                            
                            //Analogni ulazi za mjerenje struje:
AnalogIn strujaCS1(PC_0);
AnalogIn strujaCS2(PC_1);
AnalogIn strujaCS3(PB_0);
AnalogIn strujaCS4(PA_4);
                               //Interrupt pinovi:
InterruptIn k_uklj1(PA_13);     //uklj. kontakt 1
InterruptIn k_uklj2(PA_14);     //uklj. kontakt 2
InterruptIn k_isklj(PA_15);     //isklj. kontakt
InterruptIn kv_isklj(PD_2);     //isključenje kvara (tipka)
InterruptIn lom(PA_8);

PwmOut zvono1(PC_6);              //pinovi za zvona
PwmOut zvono2(PC_8);
PwmOut alarm(PA_9);            

                        //Timeri:
Timer osnovno;          //za vraćanje u osnovno nakon isključenja
Ticker tcs;             //ticker za blink signala
Timeout Tukljucenje;    //time out za trajanje uključenja
Timer debounce;         //timer za debounce     
Ticker mjere;           //ticker za mjerenje struje LED
Timer osovine;           //timer za blokadu osnovnog stanja za više osovina
Ticker ispis_LCD;
                    //Varijable:
bool uklj1=0;       //uključenje po kontaktu 1
bool uklj2=0;       //uključenje po kontaktu 2
bool isklj=0;       //isključenje po isključnom kontaktu
bool kvar=0;        //kvar: stanje ima-nema
bool smetnja=0;     //smetnja: stanje ima-nema
int bkvar=0;        //brojač kvarova
int bsmetnja=0;     //brojač smetnji
bool upis_k=0;      //pomoćna varijabla za upis kvara na LCD samo kad se poajvi kvar)
bool upis_s=0;      //pomoćna varijabla za upis smetnje na LCD samo kad se poajvi)
char s_aktiv;       //varijabla za ispis aktivnog kvara na LCD
char k_aktiv;       //varijabla za ispis aktivnog kvara na LCD
bool deaktiv_lcd=0; //varijabla za ispis na LCD nakon poništenja kvara/smetnje
bool p_gore=0;      //pomoćna varijabla za dizanje postavljača kod isključenja
float struja1;      //varijable vrijednosti analognog ulaza za kontrolu LED CS
float struja2;
float struja3;
float struja4;
bool U=0;           //pomoćna varijabla za uključenje
bool aisk=0;        //pomoćna varijabla za automatsko isključenje (vremensko)
bool kvar_l=0;
bool alarm_i=0;

void ukljucenje1();         //funkcija (potprogram) uključenja sa strane 1
void ukljucenje2();         //funkcija (potprogram) za uključenje sa strane 2
void iskljucenje();         //funkcija (potpogram) za isključenje
void kvar_lcd(void);        //funkcija za ispis na lcd
void kvar_isklj(void);      //funkcija za kvar kod aktivacije isklj. kontakta
void postav_gore(void);     //funkcija za dizanje motke
void postav_dolje(void);    //funkcija za spuštanje motke
void cs(void);              //funkcija za cestovni signal
void upis_kvara();          //funkcija ispisa na LCD
void zvona();               //funkcija za buzzer
void pr_zv();               //gašenje zvona
void mjerenja();            //funkcija za  struje LED 
void T_iskljucenje();       //funkcija za automatsko isključenje (vremensko)
void osnovno_st();
void lom_m();
void lom_m_k();
void alarm_u();
 
int main() {
     lcd.setBacklight(TextLCD::LightOn);    //uključenje pozadinskog svjetla na LCD
         
     k_uklj1.mode(PullDown);    //konfiguracija tastera na PullDown
     k_uklj2.mode(PullDown);
     k_isklj.mode(PullDown);
     kv_isklj.mode(PullDown);
    
     led1=0; led2=0;
    
    lcd.setCursor(TextLCD::CurOn_BlkOn); // Uključenje i blinkanje kursora na LCD 
 
    //debounce.start();
                                    //konfiguracija interrupt kontakata na uzlazni/silazni brid
       k_uklj1.rise(&ukljucenje1);
       k_uklj2.rise(&ukljucenje2);
       k_isklj.fall(&iskljucenje);
       kv_isklj.fall(&kvar_isklj);
       lom.fall(&lom_m);
       lom.rise(&lom_m_k);
   
        lcd.cls();   //čišćenje displeja
        lcd.printf("Kvar %i\nSmetnja %i", bkvar, bsmetnja); //prikaz broja kvara i smetnje na lcd 
         
         if(gp==0){
               postav_gore();
               wait(8);
               }
               
               //glavna petlja
   while(1) {
                            //uvjeti za LED uključenja, isključenja i kvara
       if(uklj1==1 || uklj2==1) {
       ledu=1;
       }
        else {
            ledu=0;
            }
        if(isklj==1) {
            ledi=1;
            }
        else {
            ledi=0;
            }
        if(kvar==1) {
            ledk=1;}
            else {
                    ledk=0;
                    alarm_i=0;}
        if(smetnja==1) {
            leds=1;}
            else {
                    leds=0;}
                    
                               
                                //uključenje:
                                
       if((uklj1==1 || uklj2==1) && isklj==0){
                        
            
            //mjerenja();
            if(U==0){
                
                zvona();
                led3=1;
                led1=1;
            tcs.attach(&cs, 0.5); 
             //mjere.attach(&mjerenja, 1.5); 
             //start tickera za CS, treptanje dioda
            Tukljucenje.attach(&T_iskljucenje, 40.0);
            wait(8); //predzvonjenje
            postav_dolje();
             pr_zv(); 
             U=1;
            }
          }
                        //Automatsko isključenje ako je proteklo vrijeme
          if(aisk==1) {
               
            smetnja=1;
            leds=1;
            bsmetnja=bsmetnja+1;
            postav_gore();  
            wait(0.2);        
            Tukljucenje.detach();
            //mjere.detach();
            tcs.detach();           //isključenje signala
            led1=0; 
            led2=0; 
            led3=0;
            led4=0; 
            uklj1=0;
            uklj2=0;
            U=0;
            aisk=0;
            alarm_u();
            if(gp==0){
                kvar=1;
                }
        }
                        //Isključenje na isključnom kontaktu
                        
       if((uklj1==1 || uklj2==1) && (isklj==1)) {   //isključenje za stranu 1
                
                wait(2);
                if(p_gore==0) {
                postav_gore();
                wait(0.1);
                p_gore=1;
                if(gp==0){
                   kvar=1;
                   }
                   }
                Tukljucenje.detach();
                 tcs.detach();         //isključenje signala
                   led1=0; 
                   led2=0;
                   led3=0;
                   led4=0;  
                    
                  osnovno.start();  //pokretanje timera osnovno
                }
                         //Dovođenje u osnovno stanje               
                
           if(osnovno.read()>=40 || (uklj2==1 && uklj1==1)) {
            if(osnovno.read()>=40) {
                smetnja=1;
                leds=1;
                bsmetnja=bsmetnja+1;
                osnovno_st();
                alarm_u();
                }
                else {
                    osovine.start();
                    if(osovine.read()>=2) {
                    osnovno_st(); 
                    }
                 }
                }
             
             wait(0.1);   
                            //Uključenje kvara kod aktivacije isklj. kontakta bez uključenja:
                              
        if(((uklj1==0 && uklj2==0) && (isklj==1)) || lom==0){      //kvar kod isključnog kontakta bez uključenja
              kvar=1;
              alarm_u();
              
              }
              
        kvar_lcd();
                  } //kraj while(1)
            }    //kraj int main()
   
   
     void ukljucenje1(void){
     uklj1=1; 
     osovine.reset();
     if(uklj2==0) {
     isklj=0;
     } 
     ledu=1;
         }
                      
    void ukljucenje2(void){
     uklj2=1; 
     osovine.reset();
     if(uklj1==0) {
     isklj=0; 
     }
     ledu=1;
     }
                      
    void iskljucenje(void){
       isklj=1;               
       ledi=1;
       }
                 
    void kvar_lcd(void) {
                if(kvar==1){
                k_aktiv=65;
                }
                else {
                    k_aktiv=73;
                    }          
            if(kvar==1 && upis_k==0) {
                bkvar=bkvar+1;
            lcd.cls();
            lcd.printf("Kvar %i %c\nSmetnja %i %c", bkvar, k_aktiv, bsmetnja, s_aktiv);
            upis_k=1;
            } 
            else if(kvar==0) {
            upis_k=0;
            }       
            
            if(smetnja==1){
                s_aktiv=65;
                }
                else {
                    s_aktiv=73;
                    }                         
            if(smetnja==1 && upis_s==0) {       //ispis smetnje
            //bsmetnja=bsmetnja+1;
            lcd.cls();
            lcd.printf("Kvar %i %c\nSmetnja %i %c", bkvar, k_aktiv, bsmetnja, s_aktiv);
            upis_s=1;
            } 
            else if(smetnja==0) {
                upis_s=0;
                }  
            if (deaktiv_lcd==1) {
            lcd.cls();
            lcd.printf("Kvar %i %c\nSmetnja %i %c", bkvar, k_aktiv, bsmetnja, s_aktiv);
            deaktiv_lcd=0;
            }
           }
           
                       
  void kvar_isklj(void) {
        
        if(uklj1==0 && uklj2==0) {
        if(kvar_l==0) {
            kvar=0;
            }
        smetnja=0;
        wait(0.2);
        deaktiv_lcd=1;
        //alarm=0;
        alarm_u();
        }
           }
 
 void postav_dolje() {
     postavljac.moveForward(100,20);
     pr_zv();
               }
     
 void postav_gore() {
     postavljac.moveReverse(100,15);
     }
     
void cs(void) {
    led1=!led1;
    led2=!led2;
    led3=!led3;
    led4=!led4;
    mjerenja();
       }
    
void zvona() {
zvono1.period(1); // set PWM period to 10 ms
zvono1=0.5;      // set duty cycle to 80%
zvono2.period(1); // set PWM period to 10 ms
zvono2=0.5;      // set duty cycle to 80%
}

void pr_zv() {
    zvono1=0;
    zvono2=0;
    }

void mjerenja() {

if(led1==1) {
    struja1=strujaCS1;
    struja3=strujaCS3;
   if(struja1<=0.2f || struja1>=0.55f || struja3<=0.2f || struja3>=0.55f) {
    kvar=1;
    ledk=1;
    alarm_u();
      }
       }
       
    if(led2==1) {
    struja2=strujaCS2;
    struja4=strujaCS4;
        if(struja2<=0.2f || struja2>=0.55f || struja4<=0.2f || struja4>=0.55f) {
    kvar=1;
    ledk=1;
    alarm_i=1;
    alarm_u();
     }
       }
       if(uklj1==0 && uklj2==0){
           mjere.detach();}
}

void T_iskljucenje() {
    aisk=1;
       }      
       
void osnovno_st() {
        
            uklj1=0;
            uklj2=0;
            isklj=0;
            wait(0.05);
            U=0;
            osnovno.stop();
            osnovno.reset();
            p_gore=0;
            osovine.stop();
                 }   
                 
void lom_m() {
    kvar=1;
    kvar_l=1;
    alarm_u();
    }   
    
void lom_m_k() {
    kvar_l=0;
    }
    
void alarm_u() {
        
        if(kvar==1 && alarm_i==0) {
            alarm.period(2); // set PWM period to 10 ms
            alarm=0.9;
            wait(0.1);
             }
                
            else {
                alarm=0;}
            
            }