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.

Revision:
1:a49b3c29aeb2
Parent:
0:e1ee9ea8436b
--- a/main.cpp	Thu Nov 14 16:39:38 2019 +0000
+++ b/main.cpp	Sat Nov 16 11:03:27 2019 +0000
@@ -19,6 +19,8 @@
 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);
@@ -30,9 +32,11 @@
 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 zvono2(PC_8);
+PwmOut alarm(PA_9);            
 
                         //Timeri:
 Timer osnovno;          //za vraćanje u osnovno nakon isključenja
@@ -62,6 +66,8 @@
 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
@@ -77,6 +83,9 @@
 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
@@ -96,10 +105,17 @@
        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
@@ -118,7 +134,12 @@
         if(kvar==1) {
             ledk=1;}
             else {
-                    ledk=0;}
+                    ledk=0;
+                    alarm_i=0;}
+        if(smetnja==1) {
+            leds=1;}
+            else {
+                    leds=0;}
                     
                                
                                 //uključenje:
@@ -130,12 +151,13 @@
             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, 20.0);
-            wait(6); //predzvonjenje
+            Tukljucenje.attach(&T_iskljucenje, 40.0);
+            wait(8); //predzvonjenje
             postav_dolje();
              pr_zv(); 
              U=1;
@@ -145,6 +167,7 @@
           if(aisk==1) {
                
             smetnja=1;
+            leds=1;
             bsmetnja=bsmetnja+1;
             postav_gore();  
             wait(0.2);        
@@ -152,35 +175,49 @@
             //mjere.detach();
             tcs.detach();           //isključenje signala
             led1=0; 
-            led2=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
-                Tukljucenje.detach();
+                
+                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;  
+                   led2=0;
+                   led3=0;
+                   led4=0;  
                     
                   osnovno.start();  //pokretanje timera osnovno
                 }
                          //Dovođenje u osnovno stanje               
                 
-           if(osnovno.read()>=20 || (uklj2==1 && uklj1==1)) {
-            if(osnovno.read()>=20) {
+           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();
@@ -193,9 +230,12 @@
              wait(0.1);   
                             //Uključenje kvara kod aktivacije isklj. kontakta bez uključenja:
                               
-        if((uklj1==0 && uklj2==0) && (isklj==1)) {      //kvar kod isključnog 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()
@@ -265,11 +305,17 @@
            
                        
   void kvar_isklj(void) {
-        if(uklj1==0 && uklj2==0)
-        kvar=0;
+        
+        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() {
@@ -284,6 +330,8 @@
 void cs(void) {
     led1=!led1;
     led2=!led2;
+    led3=!led3;
+    led4=!led4;
     mjerenja();
        }
     
@@ -304,18 +352,21 @@
 if(led1==1) {
     struja1=strujaCS1;
     struja3=strujaCS3;
-   if(struja1<=0.2f || struja1>=0.8f || struja3<=0.2f || struja3>=0.8f) {
+   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.8f || struja4<=0.2f || struja4>=0.8f) {
+        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){
@@ -337,6 +388,30 @@
             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;}
+            
+            }
+        
+
             
\ No newline at end of file