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;} }