070914
Dependencies: FreescaleIAP MODSERIAL mbed monitor timer0
Fork of 17_PT1000 by
main.cpp
00001 // Version 1.0 erstellt am 25.04.2015 00002 // 01.05.15 den Eingäng 4 auf 2 verlegt 00003 // den Eingang 5 auf 1 verlegt 00004 00005 #include "mbed.h" 00006 #include "main.h" 00007 #include "timer0.h" 00008 #include "monitor.h" 00009 #include "MODSERIAL.h" 00010 00011 // timer 2 => optischer Alarm Periode = 500 entspricht Blinkfrequnz von 1 Selunde 00012 #define OA_PERIODE 500 00013 // timer 3 => Minimale Zeit für den akustischen Alarm in ms >> soll 10000 entspricht 10 Sekunden 00014 #define AA_NIN 10000 00015 // timer 4 => Verzögerung für des Entriegeln des Tasters. In dieser Zeit wird dann kein neuer 00016 // akustischer Alarm ausgelöst 00017 #define AA_DELAY 10000 00018 00019 #define NEED_CONSOLE_OUTPUT 1 // Set this if you need debug messages on the console 00020 // mit Debug wird die Programmgröße von 32,8k um ca. 300 Byte vergrößert 00021 // dies ist nicht bedeutend, aber auch die Ausführungszeit der Ausgabebefehle 00022 // benötigt CPU Zeit 00023 #if NEED_CONSOLE_OUTPUT 00024 #define DEBUG(...) { pc.printf(__VA_ARGS__); } 00025 #else 00026 #define DEBUG(...) // nothing 00027 #endif // #if NEED_CONSOLE_OUTPUT 00028 00029 //------------------------------------------------------------------------------ 00030 // Anlegen von Klassen 00031 00032 timer0 down_timer; // Zeitsteuerung 00033 MODSERIAL pc(USBTX, USBRX); // tx, rx 00034 00035 monitor mon; 00036 00037 Timer t; // Zeitmessung für Entprellen 00038 00039 //------------------------------------------------------------------------------ 00040 // Zuordnung von Eingängen und Ausgängen 00041 00042 DigitalOut LED(PTE30); 00043 00044 DigitalOut OUT1(PTC6); // nicht belegt 00045 DigitalOut OUT2(PTC5); // LED Rot 00046 DigitalOut OUT3(PTC4); // LED Grün 00047 DigitalOut OUT4(PTC3); // LED Gelb 00048 DigitalOut OUT5(PTC2); // Summer 00049 DigitalOut OUT6(PTC1); // Relais 00050 00051 DigitalIn IN1(PTC7); // Notaus, schaltet gegen 24V => 24V oder 1 ist der Ruhezustand 00052 DigitalIn IN2(PTD4); // Sabotageschalter, schaltet gegen 24V => 24V oder 1 ist Ruhezustand 00053 DigitalIn IN3(PTD5); // KABA Türöffner Signal => 24V oder 1 ist Ruheezustand 00054 DigitalIn IN4(PTD6); // nicht belegt 00055 DigitalIn IN5(PTD7); // nicht belegt 00056 00057 DigitalInOut rst(PTA4); //Connect this to the reset pin 00058 00059 //------------------------------------------------------------------------------ 00060 // Globale Variablen 00061 00062 bool in; 00063 00064 struct di_struct in1; // Eingang 1 00065 struct di_struct in2; // Eingang 2 00066 struct di_struct in3; // Eingang 3 00067 00068 //------------------------------------------------------------------------------ 00069 // 00070 00071 int main() 00072 { 00073 rst.input(); // SW watchdog ist derzeit nicht erforderlich 00074 00075 //------------------------------------------------------------------------------ 00076 // RS232 Schnittstellt welche auf den CMSIS-DAP (USB Port) weitergeleitet wird 00077 // 00078 pc.baud(115200); 00079 pc.printf("\n N1380 was compiled on %s %s \n", __DATE__,__TIME__); 00080 00081 00082 //-------------------------------------------------------------------- 00083 // Anfangswerte setzen 00084 00085 in1.old = 1; // 1 im Ruhezustand 00086 in1.aktiv = 0; 00087 in1.filter = 0; 00088 in1.optischer_alarm = 0; 00089 in1.summer = 0; 00090 00091 in2.old = 1; // 1 im Ruhezustand 00092 in2.aktiv = 0; 00093 in2.filter = 0; 00094 in2.optischer_alarm = 0; 00095 in2.summer = 0; 00096 00097 in3.old = 1; // 1 im Ruhezustand 00098 in3.aktiv = 0; 00099 in3.filter = 0; 00100 00101 //-------------------------------------------------------------------- 00102 // Softwaretimer für die Zeitsteuerung anlegen 00103 00104 down_timer.SetCountdownTimer(0,1,500); // 1 ms Timer * 500 => ergibt 500 ms 00105 down_timer.SetCountdownTimer(1,1,10); // 1 ms Timer * 10 => ergibt 10 ms 00106 down_timer.SetCountdownTimer(2,1,0); // 1 ms Timer => reserviert für optischen Alarm 00107 down_timer.SetCountdownTimer(3,1,0); // 1 ms Timer => reserviert für akustischen Alarm 00108 down_timer.SetCountdownTimer(4,1,0); // 1 ms Timer => reserviert für nach Entriegelung 00109 00110 //-------------------------------------------------------------------- 00111 // Schleife fuer die Datenerfassung 00112 00113 while(1) 00114 { 00115 //------------------------------------------- 00116 // Prüfen ob Zeichen eingegeben wurden 00117 // wird in der aktiven Version ausgeblendet, ist nur zum Testen 00118 00119 mon.get_line(); 00120 00121 //------------------------------------------- 00122 // timer 0 steuert die LED auf dem Board mit der Takrate 0,5 Sekunden 00123 00124 if (down_timer.GetTimerStatus(0) == 0) { 00125 down_timer.SetCountdownTimer(0,1,500); 00126 LED = !LED; 00127 00128 } 00129 00130 //------------------------------------------- 00131 // Eingänge abfragen und Aktionen ableiten 00132 // down 00133 00134 if (down_timer.GetTimerStatus(1) == 0) 00135 { 00136 //down_timer 1 mit 10 ms gesetzt 00137 down_timer.SetCountdownTimer(1,1,10); 00138 00139 //------------------------------------------------ 00140 // IN1 Nottaster auswerten, null im Ruhezustand 00141 // wird mit der negativen Flanke aktiviert 00142 // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird 00143 00144 in = IN1; 00145 00146 00147 if(!in && in1.old) // Öffner im Ruhezustand 24 V >> durch Drücken wird eine neg. Flanke erzeugt 00148 { 00149 in1.old = 0; 00150 in1.aktiv = 1; // Taster ist betätigt 00151 in1.optischer_alarm = 1; 00152 in1.summer = 1; 00153 down_timer.SetCountdownTimer(3,1,AA_NIN); // Zeit für Softtimer auf 10 Sekunden setzen 00154 DEBUG("\n negative Flanke IN1 \n"); 00155 } 00156 00157 if (in && !in1.old) { // Öffner im Ruhenzustand 24 V >> durch Rückstellen enteht eine pos. Flanke 00158 in1.old = 1; 00159 in1.aktiv = 0; // Taster ist zurückgesetzt 00160 00161 in1.summer = 0; 00162 down_timer.SetCountdownTimer(4,1,AA_DELAY); // Zeit für Entriegelung, Haube innerhalb von 10 Sekunden schließen 00163 DEBUG("\n positve Flanke IN1 \n"); 00164 } 00165 00166 // optischer Alarm ausschalten, wenn IN3 wieder 0 bekommt ==> Quittierung 00167 00168 if (in1.optischer_alarm && in3.aktiv) 00169 { 00170 in1.optischer_alarm = 0; 00171 DEBUG("\n IN1 mit IN3 quittiert \n"); 00172 } 00173 00174 00175 //------------------------------------------------ 00176 // IN2 Sabotageschalter, 24V ist Ruhezustand 00177 // wird mit der negativen Flanke aktiviert 00178 // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird 00179 00180 in = IN2; 00181 00182 00183 if(!in && in2.old) // Eingang neg. Flanke 00184 { 00185 in2.old = 0; // 0 im aktivierten Modus 00186 in2.aktiv = 1; // Eingang ist aktiv 00187 in2.optischer_alarm = 1; 00188 in2.summer = 1; 00189 down_timer.SetCountdownTimer(3,1,AA_NIN); // Zeit für Softtimer auf 10 Sekunden setzen 00190 DEBUG("\n negative Flanke IN2 \n"); 00191 } 00192 00193 if (in && !in2.old) // Eingang mit pos. Flanke 00194 { 00195 in2.old = 1; // 1 im Ruhezustand 00196 in2.aktiv = 0; // Eingang ist inaktiv 00197 in2.summer = 0; 00198 DEBUG("\n positve Flanke IN2 \n"); 00199 } 00200 00201 if (in2.aktiv && !in2.summer && !in1.summer && (down_timer.GetTimerStatus(4) == 0)) 00202 { 00203 in2.summer = 1; 00204 down_timer.SetCountdownTimer(3,1,AA_NIN); // Zeit für Softtimer auf 10 Sekunden setzen ( zum Testen auf 2 Sek. gesetzt ) 00205 DEBUG("\n IN2 Summer aktiviert \n"); 00206 } 00207 00208 // nur zurückschalten, wenn IN3 wieder 1 ==> Quittierung 00209 00210 if (in2.optischer_alarm && in3.aktiv) { 00211 in2.optischer_alarm = 0; 00212 DEBUG("\n IN2 mit IN3 quittiert \n"); 00213 } 00214 00215 //------------------------------------------------ 00216 // IN3 Signalstation, Öffner => 1 ist Ruheezustand 00217 00218 in = IN3; 00219 00220 if(in && !in3.old) // Eingang pos. Flanke 00221 { 00222 in3.old = 1; 00223 in3.aktiv = 0; // Eingang ist Ruhezustand 00224 00225 } 00226 00227 if (!in && in3.old) // Eingang mit neg Flanke 00228 { 00229 in3.old = 0; 00230 in3.aktiv = 1; // Eingang ist aktiv 00231 } 00232 00233 00234 //--------------------------------------------------------------------------------------------------------------------------------------- 00235 // Die Eingänge sind nun gelesen, jetzt kommt das Steuern der Ausgaänge 00236 // 00237 00238 //------------------------------------------------ 00239 // Rot/Grüne LED (verriegelt/entriegelt): 00240 // rot Tor ist verriegelt 00241 // grün Tor ist entriegelt 00242 00243 // 1. IN3 auf 1 = OUT2 ein und OUT3 aus Rot an / Grün aus (verriegelt) 00244 00245 if(!in3.aktiv) { 00246 OUT2 = LED_EIN; 00247 OUT3 = LED_AUS; 00248 } 00249 00250 // 2. IN3 auf 0 = OUT2 aus und OUT3 ein Rot aus / Grün an (entriegelt) 00251 // 3. IN5 auf 1 = OUT2 aus und OUT3 ein Rot aus / Grün an (entriegelt) 00252 00253 if (in3.aktiv || in1.aktiv) { 00254 OUT2 = LED_AUS; 00255 OUT3 = LED_EIN; 00256 } 00257 00258 //------------------------------------------------ 00259 // Gelbe LED (optischer Alarm): 00260 00261 if (in1.optischer_alarm || in2.optischer_alarm) // sobald der optische Alarm aus Eingang 1 oder Eingang 2 akiviert wurde, diesen in Blinkmode schalten 00262 { 00263 if (down_timer.GetTimerStatus(2) == 0) 00264 { 00265 down_timer.SetCountdownTimer(2,1,OA_PERIODE); // Zeit für Softtimer auf eine Sekunde setzen 00266 OUT4 = !OUT4; 00267 } 00268 } 00269 else 00270 { 00271 OUT4 = LED_AUS; 00272 } 00273 00274 //------------------------------------------------ 00275 // Summer (OUT5 +24V) 00276 00277 if (in1.summer || in2.summer || (down_timer.GetTimerStatus(3) != 0)) // sobald der Eingang 1 oder Eingang 2 akiviert ist oder der Timer 00278 { // noch aktiv ist, den Summer aktivieren 00279 OUT5 = 1; 00280 } 00281 else 00282 { 00283 OUT5 = 0; 00284 } 00285 00286 //------------------------------------------------ 00287 // Relais K1: 00288 // Der Kontakt des Nottasters wird weitergegeben 00289 00290 if (in1.aktiv) { // 1. IN1 auf 0 = OUT6 (K1) ein 00291 OUT6 = 0; 00292 } else { // 2. IN1 auf 1 = OUT6 aus 00293 OUT6 = 1; 00294 } 00295 00296 } // end if (downtimer ... 00297 00298 } // end while 00299 00300 } // end main 00301
Generated on Sat Jul 16 2022 18:44:41 by 1.7.2