Version für den BSW Nottaster - OUT1

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 19_Taster_a by Notaus

Committer:
mauchcontrols
Date:
Wed Aug 19 15:15:28 2015 +0000
Revision:
22:dc30e220da6e
Parent:
21:07482037ca54
angepasst f?r den BSW Nottaster - OUT1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mauchcontrols 22:dc30e220da6e 1 // Version BSW 1.0 erstellt am 18.08.2015
mauchcontrols 22:dc30e220da6e 2 //
rs27 0:e248310dfcdb 3
rs27 0:e248310dfcdb 4 #include "mbed.h"
rs27 19:f3c41bbc809a 5 #include "main.h"
rs27 0:e248310dfcdb 6 #include "timer0.h"
rs27 0:e248310dfcdb 7 #include "monitor.h"
Sven3010 18:939d3df56218 8 #include "MODSERIAL.h"
rs27 0:e248310dfcdb 9
rs27 19:f3c41bbc809a 10 // timer 2 => optischer Alarm Periode = 500 entspricht Blinkfrequnz von 1 Selunde
rs27 19:f3c41bbc809a 11 #define OA_PERIODE 500
rs27 19:f3c41bbc809a 12 // timer 3 => Minimale Zeit für den akustischen Alarm in ms >> soll 10000 entspricht 10 Sekunden
rs27 19:f3c41bbc809a 13 #define AA_NIN 10000
rs27 19:f3c41bbc809a 14 // timer 4 => Verzögerung für des Entriegeln des Tasters. In dieser Zeit wird dann kein neuer
rs27 19:f3c41bbc809a 15 // akustischer Alarm ausgelöst
rs27 19:f3c41bbc809a 16 #define AA_DELAY 10000
rs27 0:e248310dfcdb 17
rs27 19:f3c41bbc809a 18 #define NEED_CONSOLE_OUTPUT 1 // Set this if you need debug messages on the console
rs27 19:f3c41bbc809a 19 // mit Debug wird die Programmgröße von 32,8k um ca. 300 Byte vergrößert
rs27 19:f3c41bbc809a 20 // dies ist nicht bedeutend, aber auch die Ausführungszeit der Ausgabebefehle
rs27 19:f3c41bbc809a 21 // benötigt CPU Zeit
rs27 19:f3c41bbc809a 22 #if NEED_CONSOLE_OUTPUT
rs27 19:f3c41bbc809a 23 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
rs27 19:f3c41bbc809a 24 #else
rs27 19:f3c41bbc809a 25 #define DEBUG(...) // nothing
rs27 19:f3c41bbc809a 26 #endif // #if NEED_CONSOLE_OUTPUT
Sven3010 18:939d3df56218 27
rs27 6:f53dd76c8806 28 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 29 // Anlegen von Klassen
Sven3010 4:46365f765d30 30
rs27 2:f48d2eb0cc55 31 timer0 down_timer; // Zeitsteuerung
rs27 19:f3c41bbc809a 32 MODSERIAL pc(USBTX, USBRX); // tx, rx
rs27 6:f53dd76c8806 33
rs27 19:f3c41bbc809a 34 monitor mon;
rs27 19:f3c41bbc809a 35
rs27 10:84387eed15b5 36 Timer t; // Zeitmessung für Entprellen
rs27 0:e248310dfcdb 37
rs27 6:f53dd76c8806 38 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 39 // Zuordnung von Eingängen und Ausgängen
rs27 6:f53dd76c8806 40
rs27 19:f3c41bbc809a 41 DigitalOut LED(PTE30);
rs27 0:e248310dfcdb 42
mauchcontrols 21:07482037ca54 43 DigitalOut OUT1(PTC6); // Summer
rs27 19:f3c41bbc809a 44 DigitalOut OUT2(PTC5); // LED Rot
rs27 19:f3c41bbc809a 45 DigitalOut OUT3(PTC4); // LED Grün
rs27 19:f3c41bbc809a 46 DigitalOut OUT4(PTC3); // LED Gelb
mauchcontrols 21:07482037ca54 47 DigitalOut OUT5(PTC2); // nicht belegt
rs27 19:f3c41bbc809a 48 DigitalOut OUT6(PTC1); // Relais
rs27 0:e248310dfcdb 49
rs27 19:f3c41bbc809a 50 DigitalIn IN1(PTC7); // Notaus, schaltet gegen 24V => 24V oder 1 ist der Ruhezustand
rs27 19:f3c41bbc809a 51 DigitalIn IN2(PTD4); // Sabotageschalter, schaltet gegen 24V => 24V oder 1 ist Ruhezustand
rs27 19:f3c41bbc809a 52 DigitalIn IN3(PTD5); // KABA Türöffner Signal => 24V oder 1 ist Ruheezustand
rs27 19:f3c41bbc809a 53 DigitalIn IN4(PTD6); // nicht belegt
rs27 19:f3c41bbc809a 54 DigitalIn IN5(PTD7); // nicht belegt
rs27 0:e248310dfcdb 55
rs27 19:f3c41bbc809a 56 DigitalInOut rst(PTA4); //Connect this to the reset pin
rs27 6:f53dd76c8806 57
rs27 6:f53dd76c8806 58 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 59 // Globale Variablen
rs27 6:f53dd76c8806 60
rs27 19:f3c41bbc809a 61 bool in;
rs27 2:f48d2eb0cc55 62
rs27 19:f3c41bbc809a 63 struct di_struct in1; // Eingang 1
rs27 19:f3c41bbc809a 64 struct di_struct in2; // Eingang 2
rs27 19:f3c41bbc809a 65 struct di_struct in3; // Eingang 3
rs27 0:e248310dfcdb 66
rs27 2:f48d2eb0cc55 67 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 68 //
rs27 0:e248310dfcdb 69
rs27 19:f3c41bbc809a 70 int main()
rs27 0:e248310dfcdb 71 {
rs27 19:f3c41bbc809a 72 rst.input(); // SW watchdog ist derzeit nicht erforderlich
Sven3010 3:72a65324d50d 73
rs27 2:f48d2eb0cc55 74 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 75 // RS232 Schnittstellt welche auf den CMSIS-DAP (USB Port) weitergeleitet wird
rs27 2:f48d2eb0cc55 76 //
rs27 19:f3c41bbc809a 77 pc.baud(115200);
rs27 19:f3c41bbc809a 78 pc.printf("\n N1380 V1.0 was compiled on %s %s \n", __DATE__,__TIME__);
rs27 0:e248310dfcdb 79
rs27 19:f3c41bbc809a 80
rs27 19:f3c41bbc809a 81 //--------------------------------------------------------------------
rs27 19:f3c41bbc809a 82 // Anfangswerte setzen
rs27 6:f53dd76c8806 83
rs27 19:f3c41bbc809a 84 in1.old = 1; // 1 im Ruhezustand
rs27 19:f3c41bbc809a 85 in1.aktiv = 0;
rs27 19:f3c41bbc809a 86 in1.filter = 0;
rs27 19:f3c41bbc809a 87 in1.optischer_alarm = 0;
rs27 19:f3c41bbc809a 88 in1.summer = 0;
rs27 0:e248310dfcdb 89
rs27 19:f3c41bbc809a 90 in2.old = 1; // 1 im Ruhezustand
rs27 19:f3c41bbc809a 91 in2.aktiv = 0;
rs27 19:f3c41bbc809a 92 in2.filter = 0;
rs27 19:f3c41bbc809a 93 in2.optischer_alarm = 0;
rs27 19:f3c41bbc809a 94 in2.summer = 0;
rs27 19:f3c41bbc809a 95
rs27 19:f3c41bbc809a 96 in3.old = 1; // 1 im Ruhezustand
rs27 19:f3c41bbc809a 97 in3.aktiv = 0;
rs27 19:f3c41bbc809a 98 in3.filter = 0;
rs27 2:f48d2eb0cc55 99
rs27 2:f48d2eb0cc55 100 //--------------------------------------------------------------------
rs27 19:f3c41bbc809a 101 // Softwaretimer für die Zeitsteuerung anlegen
rs27 6:f53dd76c8806 102
rs27 19:f3c41bbc809a 103 down_timer.SetCountdownTimer(0,1,500); // 1 ms Timer * 500 => ergibt 500 ms
rs27 20:b85406f52de3 104 down_timer.SetCountdownTimer(1,1,100); // 1 ms Timer * 10 => ergibt 10 ms, 100 ms für Einschaltverzögerung
rs27 19:f3c41bbc809a 105 down_timer.SetCountdownTimer(2,1,0); // 1 ms Timer => reserviert für optischen Alarm
rs27 19:f3c41bbc809a 106 down_timer.SetCountdownTimer(3,1,0); // 1 ms Timer => reserviert für akustischen Alarm
rs27 19:f3c41bbc809a 107 down_timer.SetCountdownTimer(4,1,0); // 1 ms Timer => reserviert für nach Entriegelung
rs27 2:f48d2eb0cc55 108
rs27 0:e248310dfcdb 109 //--------------------------------------------------------------------
rs27 0:e248310dfcdb 110 // Schleife fuer die Datenerfassung
rs27 19:f3c41bbc809a 111
rs27 0:e248310dfcdb 112 while(1)
rs27 0:e248310dfcdb 113 {
rs27 19:f3c41bbc809a 114 //-------------------------------------------
rs27 19:f3c41bbc809a 115 // Prüfen ob Zeichen eingegeben wurden
rs27 19:f3c41bbc809a 116 // wird in der aktiven Version ausgeblendet, ist nur zum Testen
rs27 19:f3c41bbc809a 117
rs27 19:f3c41bbc809a 118 mon.get_line();
rs27 19:f3c41bbc809a 119
rs27 19:f3c41bbc809a 120 //-------------------------------------------
rs27 19:f3c41bbc809a 121 // timer 0 steuert die LED auf dem Board mit der Takrate 0,5 Sekunden
rs27 19:f3c41bbc809a 122
rs27 19:f3c41bbc809a 123 if (down_timer.GetTimerStatus(0) == 0) {
rs27 19:f3c41bbc809a 124 down_timer.SetCountdownTimer(0,1,500);
rs27 19:f3c41bbc809a 125 LED = !LED;
rs27 19:f3c41bbc809a 126
rs27 19:f3c41bbc809a 127 }
rs27 19:f3c41bbc809a 128
rs27 19:f3c41bbc809a 129 //-------------------------------------------
rs27 19:f3c41bbc809a 130 // Eingänge abfragen und Aktionen ableiten
rs27 19:f3c41bbc809a 131 // down
rs27 19:f3c41bbc809a 132
rs27 19:f3c41bbc809a 133 if (down_timer.GetTimerStatus(1) == 0)
rs27 19:f3c41bbc809a 134 {
rs27 19:f3c41bbc809a 135 //down_timer 1 mit 10 ms gesetzt
rs27 19:f3c41bbc809a 136 down_timer.SetCountdownTimer(1,1,10);
Sven3010 18:939d3df56218 137
rs27 19:f3c41bbc809a 138 //------------------------------------------------
rs27 19:f3c41bbc809a 139 // IN1 Nottaster auswerten, null im Ruhezustand
rs27 19:f3c41bbc809a 140 // wird mit der negativen Flanke aktiviert
rs27 19:f3c41bbc809a 141 // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird
rs27 6:f53dd76c8806 142
rs27 19:f3c41bbc809a 143 in = IN1;
rs27 6:f53dd76c8806 144
rs27 6:f53dd76c8806 145
rs27 19:f3c41bbc809a 146 if(!in && in1.old) // Öffner im Ruhezustand 24 V >> durch Drücken wird eine neg. Flanke erzeugt
rs27 16:3a4350104b68 147 {
rs27 19:f3c41bbc809a 148 in1.old = 0;
rs27 19:f3c41bbc809a 149 in1.aktiv = 1; // Taster ist betätigt
rs27 19:f3c41bbc809a 150 in1.optischer_alarm = 1;
rs27 19:f3c41bbc809a 151 in1.summer = 1;
rs27 19:f3c41bbc809a 152 down_timer.SetCountdownTimer(3,1,AA_NIN); // Zeit für Softtimer auf 10 Sekunden setzen
rs27 19:f3c41bbc809a 153 DEBUG("\n negative Flanke IN1 \n");
rs27 19:f3c41bbc809a 154 }
rs27 19:f3c41bbc809a 155
rs27 19:f3c41bbc809a 156 if (in && !in1.old) { // Öffner im Ruhenzustand 24 V >> durch Rückstellen enteht eine pos. Flanke
rs27 19:f3c41bbc809a 157 in1.old = 1;
rs27 19:f3c41bbc809a 158 in1.aktiv = 0; // Taster ist zurückgesetzt
Sven3010 4:46365f765d30 159
rs27 19:f3c41bbc809a 160 in1.summer = 0;
rs27 19:f3c41bbc809a 161 down_timer.SetCountdownTimer(4,1,AA_DELAY); // Zeit für Entriegelung, Haube innerhalb von 10 Sekunden schließen
rs27 19:f3c41bbc809a 162 DEBUG("\n positve Flanke IN1 \n");
rs27 6:f53dd76c8806 163 }
rs27 6:f53dd76c8806 164
rs27 19:f3c41bbc809a 165 // optischer Alarm ausschalten, wenn IN3 wieder 0 bekommt ==> Quittierung
rs27 19:f3c41bbc809a 166
rs27 20:b85406f52de3 167 if (in1.optischer_alarm && in3.aktiv && !in1.aktiv)
rs27 16:3a4350104b68 168 {
rs27 19:f3c41bbc809a 169 in1.optischer_alarm = 0;
rs27 19:f3c41bbc809a 170 DEBUG("\n IN1 mit IN3 quittiert \n");
rs27 12:d5a745de5380 171 }
rs27 12:d5a745de5380 172
rs27 19:f3c41bbc809a 173
rs27 19:f3c41bbc809a 174 //------------------------------------------------
rs27 19:f3c41bbc809a 175 // IN2 Sabotageschalter, 24V ist Ruhezustand
rs27 19:f3c41bbc809a 176 // wird mit der negativen Flanke aktiviert
rs27 19:f3c41bbc809a 177 // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird
Sven3010 18:939d3df56218 178
rs27 19:f3c41bbc809a 179 in = IN2;
Sven3010 18:939d3df56218 180
Sven3010 18:939d3df56218 181
rs27 19:f3c41bbc809a 182 if(!in && in2.old) // Eingang neg. Flanke
rs27 19:f3c41bbc809a 183 {
rs27 19:f3c41bbc809a 184 in2.old = 0; // 0 im aktivierten Modus
rs27 19:f3c41bbc809a 185 in2.aktiv = 1; // Eingang ist aktiv
rs27 20:b85406f52de3 186 //in2.optischer_alarm = 1;
rs27 20:b85406f52de3 187 in2.summer = 1; // am 11.05.15 entfernt, da Summer weiter untern aktiviert wird
rs27 20:b85406f52de3 188 //down_timer.SetCountdownTimer(3,1,AA_NIN); // Zeit für Softtimer auf 10 Sekunden setzen
rs27 19:f3c41bbc809a 189 DEBUG("\n negative Flanke IN2 \n");
Sven3010 18:939d3df56218 190 }
rs27 19:f3c41bbc809a 191
rs27 19:f3c41bbc809a 192 if (in && !in2.old) // Eingang mit pos. Flanke
rs27 19:f3c41bbc809a 193 {
rs27 19:f3c41bbc809a 194 in2.old = 1; // 1 im Ruhezustand
rs27 19:f3c41bbc809a 195 in2.aktiv = 0; // Eingang ist inaktiv
rs27 19:f3c41bbc809a 196 in2.summer = 0;
rs27 19:f3c41bbc809a 197 DEBUG("\n positve Flanke IN2 \n");
Sven3010 18:939d3df56218 198 }
rs27 20:b85406f52de3 199 /*
rs27 19:f3c41bbc809a 200 if (in2.aktiv && !in2.summer && !in1.summer && (down_timer.GetTimerStatus(4) == 0))
Sven3010 18:939d3df56218 201 {
rs27 19:f3c41bbc809a 202 in2.summer = 1;
rs27 19:f3c41bbc809a 203 down_timer.SetCountdownTimer(3,1,AA_NIN); // Zeit für Softtimer auf 10 Sekunden setzen ( zum Testen auf 2 Sek. gesetzt )
rs27 19:f3c41bbc809a 204 DEBUG("\n IN2 Summer aktiviert \n");
Sven3010 18:939d3df56218 205 }
Sven3010 18:939d3df56218 206
rs27 19:f3c41bbc809a 207 // nur zurückschalten, wenn IN3 wieder 1 ==> Quittierung
rs27 19:f3c41bbc809a 208
rs27 19:f3c41bbc809a 209 if (in2.optischer_alarm && in3.aktiv) {
rs27 19:f3c41bbc809a 210 in2.optischer_alarm = 0;
rs27 19:f3c41bbc809a 211 DEBUG("\n IN2 mit IN3 quittiert \n");
rs27 19:f3c41bbc809a 212 }
rs27 20:b85406f52de3 213 */
rs27 19:f3c41bbc809a 214 //------------------------------------------------
rs27 19:f3c41bbc809a 215 // IN3 Signalstation, Öffner => 1 ist Ruheezustand
rs27 19:f3c41bbc809a 216
rs27 19:f3c41bbc809a 217 in = IN3;
rs27 19:f3c41bbc809a 218
rs27 19:f3c41bbc809a 219 if(in && !in3.old) // Eingang pos. Flanke
rs27 19:f3c41bbc809a 220 {
rs27 19:f3c41bbc809a 221 in3.old = 1;
rs27 19:f3c41bbc809a 222 in3.aktiv = 0; // Eingang ist Ruhezustand
Sven3010 18:939d3df56218 223
Sven3010 18:939d3df56218 224 }
rs27 19:f3c41bbc809a 225
rs27 19:f3c41bbc809a 226 if (!in && in3.old) // Eingang mit neg Flanke
rs27 19:f3c41bbc809a 227 {
rs27 19:f3c41bbc809a 228 in3.old = 0;
rs27 19:f3c41bbc809a 229 in3.aktiv = 1; // Eingang ist aktiv
rs27 19:f3c41bbc809a 230 }
rs27 19:f3c41bbc809a 231
rs27 19:f3c41bbc809a 232
rs27 19:f3c41bbc809a 233 //---------------------------------------------------------------------------------------------------------------------------------------
rs27 19:f3c41bbc809a 234 // Die Eingänge sind nun gelesen, jetzt kommt das Steuern der Ausgaänge
rs27 19:f3c41bbc809a 235 //
Sven3010 18:939d3df56218 236
rs27 19:f3c41bbc809a 237 //------------------------------------------------
rs27 19:f3c41bbc809a 238 // Rot/Grüne LED (verriegelt/entriegelt):
rs27 19:f3c41bbc809a 239 // rot Tor ist verriegelt
rs27 19:f3c41bbc809a 240 // grün Tor ist entriegelt
rs27 19:f3c41bbc809a 241
rs27 19:f3c41bbc809a 242 // 2. IN3 auf 0 = OUT2 aus und OUT3 ein Rot aus / Grün an (entriegelt)
rs27 19:f3c41bbc809a 243 // 3. IN1 auf 1 = OUT2 aus und OUT3 ein Rot aus / Grün an (entriegelt)
rs27 19:f3c41bbc809a 244
rs27 19:f3c41bbc809a 245 if (in3.aktiv || in1.aktiv) {
rs27 19:f3c41bbc809a 246 OUT2 = LED_AUS;
rs27 19:f3c41bbc809a 247 OUT3 = LED_EIN;
rs27 19:f3c41bbc809a 248 }
rs27 20:b85406f52de3 249 else
rs27 20:b85406f52de3 250 // 1. IN3 auf 1 = OUT2 ein und OUT3 aus Rot an / Grün aus (verriegelt)
rs27 20:b85406f52de3 251 {
rs27 20:b85406f52de3 252 OUT2 = LED_EIN;
rs27 20:b85406f52de3 253 OUT3 = LED_AUS;
rs27 20:b85406f52de3 254 }
rs27 19:f3c41bbc809a 255
rs27 19:f3c41bbc809a 256 //------------------------------------------------
rs27 19:f3c41bbc809a 257 // Gelbe LED (optischer Alarm):
rs27 19:f3c41bbc809a 258
rs27 20:b85406f52de3 259 if (in1.optischer_alarm) // sobald der optische Alarm aus Eingang 1 akiviert wurde, diesen in Blinkmode schalten
rs27 19:f3c41bbc809a 260 {
rs27 19:f3c41bbc809a 261 if (down_timer.GetTimerStatus(2) == 0)
rs27 19:f3c41bbc809a 262 {
rs27 19:f3c41bbc809a 263 down_timer.SetCountdownTimer(2,1,OA_PERIODE); // Zeit für Softtimer auf eine Sekunde setzen
rs27 19:f3c41bbc809a 264 OUT4 = !OUT4;
rs27 19:f3c41bbc809a 265 }
rs27 19:f3c41bbc809a 266 }
rs27 19:f3c41bbc809a 267 else
rs27 19:f3c41bbc809a 268 {
rs27 19:f3c41bbc809a 269 OUT4 = LED_AUS;
rs27 19:f3c41bbc809a 270 }
rs27 19:f3c41bbc809a 271
rs27 19:f3c41bbc809a 272 //------------------------------------------------
mauchcontrols 21:07482037ca54 273 // Summer (OUT1 GND)
rs27 19:f3c41bbc809a 274
rs27 20:b85406f52de3 275
rs27 19:f3c41bbc809a 276 if (in1.summer || in2.summer || (down_timer.GetTimerStatus(3) != 0)) // sobald der Eingang 1 oder Eingang 2 akiviert ist oder der Timer
rs27 19:f3c41bbc809a 277 { // noch aktiv ist, den Summer aktivieren
rs27 20:b85406f52de3 278 DEBUG("\n Summer 1 = %d Summer 2 = %d \n",(uint8_t)in1.summer,(uint8_t)in2.summer);
mauchcontrols 21:07482037ca54 279 OUT1 = 1;
rs27 19:f3c41bbc809a 280 }
rs27 19:f3c41bbc809a 281 else
rs27 19:f3c41bbc809a 282 {
mauchcontrols 21:07482037ca54 283 OUT1 = 0;
rs27 19:f3c41bbc809a 284 }
rs27 19:f3c41bbc809a 285
rs27 19:f3c41bbc809a 286 //------------------------------------------------
rs27 19:f3c41bbc809a 287 // Relais K1:
rs27 19:f3c41bbc809a 288 // Der Kontakt des Nottasters wird weitergegeben
rs27 19:f3c41bbc809a 289
rs27 19:f3c41bbc809a 290 if (in1.aktiv) { // 1. IN1 auf 0 = OUT6 (K1) ein
rs27 20:b85406f52de3 291 OUT6 = 1;
rs27 19:f3c41bbc809a 292 } else { // 2. IN1 auf 1 = OUT6 aus
rs27 20:b85406f52de3 293 OUT6 = 0;
rs27 19:f3c41bbc809a 294 }
rs27 19:f3c41bbc809a 295
rs27 19:f3c41bbc809a 296 } // end if (downtimer ...
rs27 19:f3c41bbc809a 297
rs27 0:e248310dfcdb 298 } // end while
rs27 0:e248310dfcdb 299
rs27 19:f3c41bbc809a 300 } // end main
rs27 19:f3c41bbc809a 301