070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Files at this revision

API Documentation at this revision

Comitter:
rs27
Date:
Fri May 08 07:48:19 2015 +0000
Parent:
18:939d3df56218
Commit message:
080515

Changed in this revision

Buffer.lib Show diff for this revision Revisions of this file
ConfigFile.lib Show diff for this revision Revisions of this file
FreescaleIAP.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib Show diff for this revision Revisions of this file
Ventiel.lib Show diff for this revision Revisions of this file
info.txt Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
monitor.lib Show annotated file Show diff for this revision Revisions of this file
timer0.lib Show annotated file Show diff for this revision Revisions of this file
--- a/Buffer.lib	Sun Sep 07 12:10:34 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://mbed.org/users/sam_grove/code/Buffer/#cd0a1f4c623f
--- a/ConfigFile.lib	Sun Sep 07 12:10:34 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/shintamainjp/code/ConfigFile/#f6ceafabe9f8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FreescaleIAP.lib	Fri May 08 07:48:19 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/Sissors/code/FreescaleIAP/#186db0d96fcf
--- a/SDFileSystem.lib	Sun Sep 07 12:10:34 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/teams/Temp/code/SDFileSystem/#70db88aa21e3
--- a/Ventiel.lib	Sun Sep 07 12:10:34 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/teams/Temp/code/VentielDisplay/#0b90e095f3b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/info.txt	Fri May 08 07:48:19 2015 +0000
@@ -0,0 +1,15 @@
+1.  Nottaster NICHT gedrückt = Öffner (Klemmen,2,3,4) geschlossen / Summer und Alarm-LED inaktiv
+2.  Nottaster gedrückt = Öffner (Klemmen1,2,3,4) offen / Summer und Alarm-ELD aktiv (bis der Nottaster zurückgestellt wird)
+3.  KABA AML OUT1 NICHT aktiv = Öffner geschlossen / rote LED (Verriegelt) EIN / grüne LED (Entriegelt) AUS
+4.  KABA AML OUT1 aktiv = Öffner offen / rote LED (Verriegelt) AUS / grüne LED (Entriegelt) EIN
+
+IN1 Sabotageschaltet
+IN2 Nottaster
+IN3 Schlüsselschalter S1    LABA ALM OUT1
+IN4 Schlüsselachalter S2
+
+OUT1  Summer
+OUT2  LED rot
+OUT3  LED grün
+OUT4  LED gelb
+OUT5  Relais    KABA ALM  
\ No newline at end of file
--- a/main.cpp	Sun Sep 07 12:10:34 2014 +0000
+++ b/main.cpp	Fri May 08 07:48:19 2015 +0000
@@ -1,606 +1,301 @@
-// Version 17 08.08.2014
-// die Ausgabe auf das Format #nr val umgestellt
-// 03.08.14 Monitorbefehle hinzugefügt
-// 08.08.14 Programm um Tropfenerfassung erweitert
-// 30.08.14 die Temperaturbegrenzung bei ausgeschaltert Tropfensteuerung geändert
+// Version 1.0   erstellt am 25.04.2015
+// 01.05.15 den Eingäng 4 auf 2 verlegt
+//          den Eingang 5 auf 1 verlegt
 
 #include "mbed.h"
-#include "ConfigFile.h"
-#include "SDFileSystem.h"
-//#include "DS2482.h"
+#include "main.h"
 #include "timer0.h"
-#include "Buffer.h"
 #include "monitor.h"
-#include "ventiel.h"
 #include "MODSERIAL.h"
 
-#define CR 13
+// timer 2 => optischer Alarm Periode = 500 entspricht Blinkfrequnz von 1 Selunde
+#define OA_PERIODE 500
+// timer 3 => Minimale Zeit für den akustischen Alarm in ms >> soll 10000 entspricht 10 Sekunden
+#define AA_NIN 10000
+// timer 4 => Verzögerung für des Entriegeln des Tasters. In dieser Zeit wird dann kein neuer
+// akustischer Alarm ausgelöst
+#define AA_DELAY 10000
 
-#define SOLL_WERT 32.0          // Sollwert für den Fühler in der Flüssigkeit
-#define R_TEMP_MAX 60.0         // Maximaltermperatur für den Widerstand
-#define R_OFFSET 0.0            // wird bei abgeschaltetert Trofpensteuerung zum Haltetemperatur addiert
-#define OFFSET_0 28330          // AD Wert für 0° Abgleich Kanal 0
-#define OFFSET_1 28560          // AD Wert für 0° Abgleich Kanal 1
-//#define OFFSET 27100          // AD Wert für 0° Abgleich Steuerung Flosrian
-#define GAIN 113                // Digit pro °C  >> 112.3 Steuerung Florian
-//#define GAIN 112.3            // Digit pro °C  >> 112.3 Steuerung Florian
-
-#define BOOL_FMT(bool_expr)  (bool_expr) ? "ein" : "aus"
+#define NEED_CONSOLE_OUTPUT 1   // Set this if you need debug messages on the console
+                                // mit Debug wird die Programmgröße von 32,8k um ca. 300 Byte vergrößert
+                                // dies ist nicht bedeutend, aber auch die Ausführungszeit der Ausgabebefehle
+                                // benötigt CPU Zeit
+#if NEED_CONSOLE_OUTPUT
+  #define DEBUG(...) { pc.printf(__VA_ARGS__); }
+#else
+  #define DEBUG(...)    // nothing
+#endif                  // #if NEED_CONSOLE_OUTPUT 
 
 //------------------------------------------------------------------------------
 // Anlegen von Klassen
 
-SDFileSystem sd(PTD2, PTD3, PTC5, PTD0, "sd");  // The pinout (MOSI, MISO, SCLK, CS)
 timer0 down_timer;                              // Zeitsteuerung
-Serial pc(USBTX, USBRX);                        // tx, rx
-MODSERIAL com(PTC4, PTC3); 
-//MODSERIAL com(PTC4, PTC3);                         
-Buffer <char> buf;                              // Ringbuffer für ankommende Zeichen
-// DS2482 ow(PTE0,PTE1,0x30);                   //        sda, scl, adr
+MODSERIAL pc(USBTX, USBRX);                     // tx, rx
 
-ventiel magnet;                                 // Klasse Ventiele anlegen
-char lcd_text[25];
+monitor mon;
+
 Timer t;                                        // Zeitmessung für Entprellen
 
 //------------------------------------------------------------------------------
 // Zuordnung von Eingängen und Ausgängen
 
-DigitalIn in1(PTA16);
-InterruptIn tropfen(PTA16);                     // Eingang für Tropfensensor >> nur Port A und D
-
-PwmOut heizung(PTA13);                          // Ausgang für den PWM der die Heizung steuert
-
-DigitalOut r(LED_RED);
-DigitalOut g(LED_GREEN);
-DigitalOut b(LED_BLUE);
-
-DigitalOut led1(LED1);
-//DigitalOut LED2(PTA2);
-DigitalOut LED5(PTA4);
-DigitalOut LED_4(PTA12);
-DigitalOut LED6(PTA5);
-
-// Schalter 4051 weden in der Andwendung nicht benötigt           
-DigitalOut DC_A(PTE2);
-DigitalOut DC_B(PTE3);
-DigitalOut DC_C(PTE4);
-DigitalOut DC_EN(PTE5);
+DigitalOut LED(PTE30);
 
-// PT1000 Karte 1 >> Analogeingänge auf der Grundkarte
-AnalogIn an1(PTC0);
-AnalogIn an2(PTB1);
-AnalogIn an3(PTB2);
-AnalogIn an4(PTB3);
-AnalogIn an5(PTC2);
-AnalogIn an6(PTD5);
-
-// 0 bis 5V 
-// AnalogIn an13(PTD6);
+DigitalOut OUT1(PTC6);      // nicht belegt
+DigitalOut OUT2(PTC5);      // LED Rot
+DigitalOut OUT3(PTC4);      // LED Grün
+DigitalOut OUT4(PTC3);      // LED Gelb
+DigitalOut OUT5(PTC2);      // Summer
+DigitalOut OUT6(PTC1);      // Relais
 
-// Analog pins
-/*
-1   PTE20, ADC0_SE0,  0}, k2.2
-2   PTE22, ADC0_SE3,  0}, k2.3
-3   PTE21, ADC0_SE4a, 0},
-4   PTE29, ADC0_SE4b, 0}, k2,4
-5   PTE30, ADC0_SE23, 0}, k2.5
-6   PTE23, ADC0_SE7a, 0},
-7   PTB0,  ADC0_SE8,  0}, k2.1
-8   PTB1,  ADC0_SE9,  0}, k1.2
-9   PTB2,  ADC0_SE12, 0}, k1.3
-10  PTB3,  ADC0_SE13, 0}, k1.4
-11  PTC0,  ADC0_SE14, 0}, k1.1
-12  PTC1,  ADC0_SE15, 0}, k2.6
-13  PTC2,  ADC0_SE11, 0}, k1.5
-14  PTD1,  ADC0_SE5b, 0},
-15  PTD5,  ADC0_SE6b, 0}, k1.6
-16  PTD6,  ADC0_SE7b, 0}, k3.1
-*/
+DigitalIn IN1(PTC7);        // Notaus, schaltet gegen 24V =>            24V oder 1 ist der Ruhezustand
+DigitalIn IN2(PTD4);        // Sabotageschalter, schaltet gegen 24V =>  24V oder 1 ist Ruhezustand
+DigitalIn IN3(PTD5);        // KABA Türöffner Signal =>                 24V oder 1 ist Ruheezustand
+DigitalIn IN4(PTD6);        // nicht belegt                             
+DigitalIn IN5(PTD7);        // nicht belegt 
 
+DigitalInOut rst(PTA4);     //Connect this to the reset pin
 
 //------------------------------------------------------------------------------
 // Globale Variablen
 
-float temp1, temp_mw, temp_r_max, temp_r_ist;
-uint16_t temp_word;
-uint8_t n, y, status, ds1820_status;
-
-int tropfen_anz = 10;       // zulässige Anzahl Tropfen pro Periode
-int tropfperiode = 60;      // in Sekunden
-bool send_flag = true;
-
-float temp_float, temp_diff, temp_neu, esum, temp_soll, regelwert;
-
-
-//------------------------------------------------------------------------------
-// Definitionen und Variablen für das Config File
-ConfigFile cfg;
-char value[BUFSIZ];         // Variablen für das Config file 
-
-bool t_flag = true;         // Heizung aus / ein
-bool f_flag = true;         // Tropfen sperren / freigeben
-
-int drops = 10;             // Anzahl Tropfen pro Zeiteinheit
-
-//float offset = 0.0;
-float soll_wert = 27.0;     // Sollwert für den Temperaturfühler in der Flüssigkeit
-float korr_wert = R_OFFSET; // Korrekturwert bei abgeschalteter Heizung
+bool in;
 
-//------------------------------------------------------------------------------
-// Interruptroutine wird bei jedem Tropfen aufgerufen
-// Pulse die in einem Abstand kleine 1ms sind werden nicht gezählt
-//
-void tropfen_handler()
-{
-    if(t.read_us() > 10000) //falls Tropfen weniger als 1 ms Lichtschranke blockiert, wird er nicht gewertet.
-    {
-        if (in1 == 0)
-        {
-            tropfen_anz++;
-        }
-    }
-    t.reset();
-    t.start();    
-}
-    
-//------------------------------------------------------------------------------
-// Interruptroutine wird bei jedem ankommenden Zeichen aufgerufen
-void rx_handler(void)
-{
-    // Note: you need to actually read from the serial to clear the RX interrupt
-    
-    char ch;
-    
-    while (pc.readable()) 
-    {   
-      ch = pc.getc();
-      buf.put(ch);
-    }
-}
-
-//------------------------------------------------------------------------------
-// lesen der PT1000 AD-Werte
-//
-// Um Störungen zu reduzieren werden 16 Werte gelesen und daraus wird der
-// Mittelwert berechnet. Eine Messung dauert ca. 30µs. Somit wird für eine Messung
-// ca. eine Zeit von 0,5ms benötigt.
-//
-int read_mw(uint8_t pos)
-{
-    uint8_t n;
-    
-    int val = 0;
-    int mw = 0;
-    
-    LED_4 = 0;
-    
-    // 16 Messungen für eine bessere Mittelung durchführen
-    
-    for (n = 0; n < 16; n++)
-    {
-         switch (pos)
-         {      
-            // PT1000 Karte 1
-            case 0:  val = an1.read_u16(); break;
-            case 1:  val = an2.read_u16(); break;
-            case 2:  val = an3.read_u16(); break;
-            case 3:  val = an4.read_u16(); break;
-            case 4:  val = an5.read_u16(); break;
-            case 5:  val = an6.read_u16(); break;         
-         }
-         mw += val;
-    } // end for
-    
-    // Temperatur berechnen
-    // Wert durch 16 teilen
-    
-    mw = mw >> 4;
-    
-    LED_4 = 1;
-    
-    return mw;
-}
+struct di_struct in1;      // Eingang 1
+struct di_struct in2;      // Eingang 2
+struct di_struct in3;      // Eingang 3
 
 //------------------------------------------------------------------------------
 //
 
-int main() 
+int main()
 {
-    //------------------------------------------------------------------------------
-    
-    heizung.period(0.020);          //  requires a 20ms period
-    heizung.pulsewidth(0.005);
-    esum = 0.0;
-    
-    tropfen.fall(&tropfen_handler);
-    t.reset();
-    t.start();
+    rst.input();     // SW watchdog ist derzeit nicht erforderlich
     
     //------------------------------------------------------------------------------
     // RS232 Schnittstellt welche auf den CMSIS-DAP (USB Port) weitergeleitet wird
     //
-    pc.baud(57600);
-    pc.attach(&rx_handler, Serial::RxIrq);
-    pc.printf("\n V08 was compiled on %s  %s \n", __DATE__,__TIME__);
+    pc.baud(115200);
+    pc.printf("\n N1380 was compiled on %s  %s \n", __DATE__,__TIME__);
 
-    mon_init();
+
+    //--------------------------------------------------------------------
+    //  Anfangswerte setzen
 
-    //------------------------------------------------------------------------------
-    // RS232 Schnittstellt zum Ansteuern der Magnetventile
-    //
-    com.baud(57600);
-    //com.printf("\n V08 was compiled on %s  %s \n", __DATE__,__TIME__);
-        
-    //------------------------------------------------------------------------------
-    // Timer für die Zeitsteuerung
-    //
-    down_timer.SetCountdownTimer(0,1,50);  // Timer für die LED
-    down_timer.SetCountdownTimer(1,1,500); // Timer für die Tropfensteuerung
-    down_timer.SetCountdownTimer(2,1,1000);// Timer für die Ausgabe der Daten
-    down_timer.SetCountdownTimer(3,1,100); // Timer für Taster
+    in1.old = 1;        // 1 im Ruhezustand
+    in1.aktiv = 0;      
+    in1.filter = 0;
+    in1.optischer_alarm = 0;
+    in1.summer = 0;
     
-    r = g = b = 1;                          // RGB LED ausschalten
+    in2.old = 1;        // 1 im Ruhezustand
+    in2.aktiv = 0;      
+    in2.filter = 0;
+    in2.optischer_alarm = 0;
+    in2.summer = 0;
+
+    in3.old = 1;        // 1 im Ruhezustand
+    in3.aktiv = 0;      
+    in3.filter = 0;
     
     //--------------------------------------------------------------------
-    // Variablen von der SD Karte initialisieren
-    
-    cfg.read("/sd/input.cfg");
- 
-    if (cfg.getValue("t_flag", &value[0], sizeof(value))) 
-    {
-        if (atoi(value) == 1)
-        {
-            t_flag = true;
-            pc.printf("\nHeizung aktiviert");    
-        }
-        else
-        {
-            t_flag = false;
-            pc.printf("\nHeizung deaktiviert");             
-        }
-    }
+    // Softwaretimer für die Zeitsteuerung anlegen
 
-    if (cfg.getValue("f_flag", &value[0], sizeof(value))) 
-    {
-        if (atoi(value) == 1)
-        {
-            f_flag = true;
-            pc.printf("\nTrofen aktiviert");    
-        }
-        else
-        {
-            f_flag = false;
-            pc.printf("\nTropfen deaktiviert");             
-        }
-    }
-
-    if (cfg.getValue("drops", &value[0], sizeof(value))) 
-    {
-        drops = atoi(value);
-        pc.printf("\nAnzahl Tropfen = %d", drops); 
-    }
-
-    if (cfg.getValue("cycle", &value[0], sizeof(value))) 
-    {
-        tropfperiode = atoi(value);
-        pc.printf("\nPeriodenzeit fuer die Tropfen = %d", tropfperiode); 
-    } 
-                     
-    if (cfg.getValue("soll", &value[0], sizeof(value))) 
-    {
-        soll_wert = atof(value);
-        pc.printf("\nsoll_wert = %f", soll_wert); 
-    }
-
-    if (cfg.getValue("korr", &value[0], sizeof(value))) 
-    {
-        korr_wert = atof(value);
-        pc.printf("\nkorrektur_wert = %f\n", korr_wert); 
-    }    
-    //--------------------------------------------------------------------
-    // Anfangswert bestimmen
-    
-    temp_mw = read_mw(0);
-    
+    down_timer.SetCountdownTimer(0,1,500);      // 1 ms Timer * 500 => ergibt 500 ms
+    down_timer.SetCountdownTimer(1,1,10);       // 1 ms Timer * 10 => ergibt 10 ms
+    down_timer.SetCountdownTimer(2,1,0);        // 1 ms Timer => reserviert für optischen Alarm
+    down_timer.SetCountdownTimer(3,1,0);        // 1 ms Timer => reserviert für akustischen Alarm
+    down_timer.SetCountdownTimer(4,1,0);        // 1 ms Timer => reserviert für nach Entriegelung
     
     //--------------------------------------------------------------------
     // Schleife fuer die Datenerfassung
-    
+
     while(1) 
     {
-       //-------------------------------------------
-       // Prüfen ob Zeichen eingegeben wurden
-       
-       get_line();
- 
-       //-------------------------------------------
-       // Prüfen ob Tropfenzahl erreicht
-       
-       
-       if (f_flag)
-       {
-           if (tropfen_anz >= drops){
-           
-                // mit einer 9 die Tropfen sperren
-                if(send_flag){   
-                    // com.putc('9');       // Trofensteuerung wird ausgeschaltet
-                    magnet.reset(0);
-                    send_flag = false;      // Flag zur Programmsteuerung
-                    LED6 = 1;               // zeigt Status Tropfensteuerung aus
-                }
-            }
-       }
-                 
-       //-------------------------------------------
-       // timer 0 steuert die LED
-       
-       if (down_timer.GetTimerStatus(0) == 0)
-       {
-          down_timer.SetCountdownTimer(0,1,500);
-          LED5 = !LED5;
-       }
-       
-       //-------------------------------------------
-       // Tropfensteuerung freigeben
-       // down
-       
-       if (down_timer.GetTimerStatus(1) == 0)
-       {
-          //down_timer.SetCountdownTimer(timer nr,Zeiteinheit: 1 = ms o. 2 = s,tropfperiode);
-          down_timer.SetCountdownTimer(1,2,tropfperiode);
-          
-          //-------------------------------------------
-          // nur freigeben, wenn nicht über monitor gesperrt
-          if (f_flag)
-          {
-              tropfen_anz = 0;
-              
-              // mit einer 1 die Tropfen freigeben
-              if (~send_flag){ 
-                //com.putc('1');         // Tropfensteuerung freigeben von Magnetventil 1
-                magnet.set(0);
-                send_flag=true;          // Flag zum Status der Tropfensteuerung
-                LED6 = 0;                // Anzeige zum Status der Tropfensteuerung
-              }
-          }
-       }
-       
-       //-------------------------------------------
-       // timer 2 steuert das Messen der Temperaturen und gibt die Leistung für
-       // die Heizung vor
-       
-       if (down_timer.GetTimerStatus(2) == 0)
-       {
-            down_timer.SetCountdownTimer(2,1,1000);
+        //-------------------------------------------
+        // Prüfen ob Zeichen eingegeben wurden
+        // wird in der aktiven Version ausgeblendet, ist nur zum Testen
+        
+        mon.get_line();
+
+        //-------------------------------------------
+        // timer 0 steuert die LED auf dem Board mit der Takrate 0,5 Sekunden
+
+        if (down_timer.GetTimerStatus(0) == 0) {
+            down_timer.SetCountdownTimer(0,1,500);
+            LED = !LED;
+            
+        }
+
+        //-------------------------------------------
+        // Eingänge abfragen und Aktionen ableiten
+        // down
+
+        if (down_timer.GetTimerStatus(1) == 0) 
+        {
+            //down_timer 1 mit 10 ms gesetzt
+            down_timer.SetCountdownTimer(1,1,10);
 
-            //------------------------------------------------------
-            // PT1000 Kanal 1 ( Fühler in Flüssigkeit) lesen und die Temperatur berechnen
+            //------------------------------------------------
+            // IN1  Nottaster auswerten, null im Ruhezustand
+            // wird mit der negativen Flanke aktiviert
+            // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird
         
-           
-           temp_word = read_mw(1);
-           temp_soll = (temp_word - OFFSET_1);
-           temp_soll /= GAIN;
- 
-            //pc.printf("%d;",temp_word);                           // Rohwert ausgeben
-            pc.printf("Soll %2.2f; Soll ist %2.2f;",soll_wert, temp_soll);                     // Temperaturwert soll Flüssigkeit   
+            in = IN1;
             
-            //------------------------------------------------------
-            // PT1000 Kanal 0 ( Fühler am Heizwiderstand ) lesen und die Temperatur berechnen       
             
-            temp_word = read_mw(0);
-            temp_float = (temp_word - OFFSET_0);
-            temp_r_ist = temp_float / GAIN;  
-            
-            //pc.printf("%d;",temp_word);                           // Rohwert ausgeben
-            pc.printf("Temp-R %0.2f; ",temp_r_ist);                     
-            
-            // die Temperaturregelung ist nur bei aktiver Tropfensteuerung eingeschaltet
-            //
-            if (f_flag)
+            if(!in && in1.old)       // Öffner im Ruhezustand 24 V >> durch Drücken wird eine neg. Flanke erzeugt
             {
-                //------------------------------------------------------
-                // Regelabweichung berechnen
-                
-                temp_diff = (soll_wert - temp_soll);
+                in1.old = 0;
+                in1.aktiv = 1;       // Taster ist betätigt
+                in1.optischer_alarm = 1;
+                in1.summer = 1;
+                down_timer.SetCountdownTimer(3,1,AA_NIN);  // Zeit für Softtimer auf 10 Sekunden setzen
+                DEBUG("\n negative Flanke IN1 \n");
+            }
+
+            if (in && !in1.old) {     // Öffner im Ruhenzustand 24 V >> durch Rückstellen enteht eine pos. Flanke
+                in1.old = 1;
+                in1.aktiv = 0;        // Taster ist zurückgesetzt
                 
-                //------------------------------------------------------
-                // Begrenzen der Eingangsgröße
-                         
-                if(temp_diff > soll_wert)temp_diff = soll_wert;
-                    
-                //temp_neu = ((temp_diff*0.0005) + (temp_alt*0.9));
-     
-                //------------------------------------------------------
-                // bei geringen Abweichungen ein I-Anteil berechnen, damit Regelabweichung
-                // auf 0 gefahren werden 
-                if(temp_diff < 3){
-                    esum += temp_diff * 0.00001;
-                }
-                
-                //------------------------------------------------------
-                // berechnen der Steuergröße
-                
-                temp_neu = (temp_diff*0.0005) + esum;
-                
-                //------------------------------------------------------
-                // Regler nach oben begrezen
-                
-                if(temp_neu > 0.02){
-                    temp_neu = 0.02;
-                }            
-     
-                //------------------------------------------------------
-                // Regler nach unten begrezen       
-                
-                if(temp_soll > soll_wert){
-                    temp_neu = 0.0;
-                    esum = 0.0;
-                }
-                
+                in1.summer = 0;
+                down_timer.SetCountdownTimer(4,1,AA_DELAY);  // Zeit für Entriegelung, Haube innerhalb von 10 Sekunden schließen
+                DEBUG("\n positve Flanke IN1 \n");
             }
             
-            regelwert = temp_neu;
-            
-            //------------------------------------------------------
-            // Zulässige Temperatur für den Heizwiderstand begrezen            
-            // bei eingeschalteter Trofensteuerung wird die Temperatur 
-            // auf T_TEMP_MAX und bei ausgeschalteter Tropfensteuerung 
-            // auf soll_wert begrenzt
-            if (f_flag)
-            {
-                temp_r_max = R_TEMP_MAX;
-            }
-            else
-            {                
-                temp_r_max = soll_wert + korr_wert;
-            }                
-                
-            if(temp_float > temp_r_max)
+            // optischer Alarm ausschalten, wenn IN3 wieder 0 bekommt ==> Quittierung
+
+            if (in1.optischer_alarm && in3.aktiv) 
             {
-                    regelwert = 0.0;
-                    esum = 0.0;
-            }
- 
-            //------------------------------------------------------
-            // Heizwiederstand ansteuern >> 0,02 entspricht 100%
-            
-            if (t_flag)
-            {
-                heizung.pulsewidth(0.0001 + regelwert);
-                //pc.printf("%0.4f;",temp_alt);
-            }
-            else
-            {
-                heizung.pulsewidth(0.000000);      
-            }
-            pc.printf("%0.4f; ",temp_neu); 
-            if(t_flag)
-            pc.printf("on;");
-            else
-            pc.printf("off;");
-            pc.printf(" %d; Magnete :", tropfen_anz);
-            
-            for (uint8_t n = 0; n < 8; n++)
-            {
-                if(magnet.get(n)) pc.putc('1');
-                else              pc.putc('0');              
+                in1.optischer_alarm = 0;
+                DEBUG("\n IN1 mit IN3 quittiert \n");
             }
 
-            pc.printf("; verbleibende Zeit %02d; ",down_timer.GetTimerZeit(1));
-            
-            if(f_flag)
-            pc.printf("on;");
-            else
-            pc.printf("off;");
-            
-            pc.printf("\n");
+
+            //------------------------------------------------
+            // IN2 Sabotageschalter, 24V ist Ruhezustand
+            // wird mit der negativen Flanke aktiviert
+            // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird
             
-            // LCD String zusammensetzen und ausgeben
-            for (int i = 0; i < 25; i++) lcd_text[i] = 0;
-                            //01234567890123456789
-            sprintf(lcd_text,"TR   %3.1f  /  %3.1f ",temp_r_ist,temp_r_max);
-            //sprintf(lcd_text,"erste Zeile");
-            uint8_t len = strlen(lcd_text);
-            uint8_t anz = len + 3;
-            com.printf(":AA%02x020000",anz);    //Zeile 1 Temps
-            for (int i = 0; i < len; i++)
-            {
-               com.printf("%02x",lcd_text[i]); 
-            }
-            com.printf("A5\n");
-            //wait_ms(100);
+            in = IN2;
             
             
-            for (int i = 0; i < 25; i++) lcd_text[i] = 0;
-                            //01234567890123456789
-            sprintf(lcd_text,"TK   %3.1f  /  %3.1f ",temp_soll,soll_wert);
-            //sprintf(lcd_text,"Heizung         %s " ,BOOL_FMT(t_flag));
-            len = strlen(lcd_text);
-            anz = len + 3;
-            com.printf(":AA%02x020001",anz);    //Zeile 2 Heizung (ein/aus)
-            for (int i = 0; i < len; i++)
-            {
-               com.printf("%02x",lcd_text[i]); 
+            if(!in && in2.old)          // Eingang neg. Flanke
+            {    
+                in2.old = 0;            // 0 im aktivierten Modus
+                in2.aktiv = 1;          // Eingang ist aktiv
+                in2.optischer_alarm = 1;
+                in2.summer = 1;
+                down_timer.SetCountdownTimer(3,1,AA_NIN);  // Zeit für Softtimer auf 10 Sekunden setzen
+                DEBUG("\n negative Flanke IN2 \n");
             }
-            com.printf("A5\n");
-            //wait_ms(100);
-             
-            for (int i = 0; i < 25; i++) lcd_text[i] = 0;
-                            //01234567890123456789
-            sprintf(lcd_text,"temp. %s  flow %s ",BOOL_FMT(t_flag) ,BOOL_FMT(f_flag));
-            len = strlen(lcd_text);
-            anz = len + 3;
-            com.printf(":AA%02x020002",anz);    //Zeile 3 Tropfensteuerung (ein/aus)
-            for (int i = 0; i < len; i++)
-            {
-               com.printf("%02x",lcd_text[i]); 
+
+            if (in && !in2.old)         // Eingang mit pos. Flanke
+            {    
+                in2.old = 1;            // 1 im Ruhezustand   
+                in2.aktiv = 0;          // Eingang ist inaktiv
+                in2.summer = 0;
+                DEBUG("\n positve Flanke IN2 \n");
             }
-            com.printf("A5\n");
-            //wait_ms(100);
-            
-            for (int i = 0; i < 25; i++) lcd_text[i] = 0;
-                            //01234567890123456789
-            sprintf(lcd_text,"Zeit %3d Tropfen %3d" ,down_timer.GetTimerZeit(1),tropfen_anz);
-            len = strlen(lcd_text);
-            anz = len + 3;
-            com.printf(":AA%02x020003",anz);    //Zeile 4 Anz. Zeit+Tropfen
-            for (int i = 0; i < len; i++)
+
+            if (in2.aktiv && !in2.summer && !in1.summer && (down_timer.GetTimerStatus(4) == 0))
             {
-               com.printf("%02x",lcd_text[i]); 
+                in2.summer = 1; 
+                down_timer.SetCountdownTimer(3,1,AA_NIN);  // Zeit für Softtimer auf 10 Sekunden setzen ( zum Testen auf 2 Sek. gesetzt )  
+                DEBUG("\n IN2 Summer aktiviert \n");
             }
-            com.printf("A5\n");
-            //wait_ms(100);
-            
-       } // end if(down_timer ...
             
-    
-    // timer 3
-       
+            // nur zurückschalten, wenn IN3 wieder 1 ==> Quittierung
+
+            if (in2.optischer_alarm && in3.aktiv) {
+                in2.optischer_alarm = 0;
+                DEBUG("\n IN2 mit IN3 quittiert \n");
+            }
 
-       
-            if (com.readable()) {
-            
-            int ch = com.getc();
-            // pc.printf("\nzeichen=%c %x",ch,ch);
-            
-            switch (ch){
-                case '1': magnet.toggle (0);
-                break;
-                case '2': magnet.toggle (1);
-                break;
-                case '3': magnet.toggle (2);
-                break;
-                case '4': magnet.toggle (3);
-                break;
-                case '5': if (t_flag)
-                {
-                     t_flag = false; 
-                     pc.printf("\nHeizung durch externen Taster deaktiviert\n");
-                }    
-                else 
-                {
-                    t_flag = true;
-                    pc.printf("\nHeizung durch externen Tastet aktiviert\n");
-                }
-                break;
-                case '6': if (f_flag)
-                {
-                     f_flag = false;
-                     pc.printf("\nTropfensteuerung durch externen Taster deaktiviert\n");
-                }
-                      else
-                {     
-                       f_flag = true;
-                       pc.printf("\nTropfensteuerung durch externen Taster aktiviert\n");
-                }
-                break;
-                }
+            //------------------------------------------------
+            // IN3 Signalstation, Öffner => 1 ist Ruheezustand
+
+            in = IN3;
+
+            if(in && !in3.old)        // Eingang pos. Flanke
+            {   
+                in3.old = 1;
+                in3.aktiv = 0;        // Eingang ist Ruhezustand
                 
             }
+
+            if (!in && in3.old)       // Eingang mit neg Flanke
+            {
+                in3.old = 0;
+                in3.aktiv = 1;        // Eingang ist aktiv    
+            }
+
+
+            //---------------------------------------------------------------------------------------------------------------------------------------
+            // Die Eingänge sind nun gelesen, jetzt kommt das Steuern der Ausgaänge
+            //
             
-       
-       
-                           
+            //------------------------------------------------
+            // Rot/Grüne LED (verriegelt/entriegelt):
+            // rot      Tor ist verriegelt
+            // grün     Tor ist entriegelt
+
+            //  1. IN3 auf 1 = OUT2 ein und OUT3 aus   Rot an / Grün aus   (verriegelt)
+            
+            if(!in3.aktiv) {   
+                OUT2 = LED_EIN;
+                OUT3 = LED_AUS;
+            } 
+            
+            //  2. IN3 auf 0 = OUT2 aus und OUT3 ein   Rot aus / Grün an   (entriegelt)
+            //  3. IN5 auf 1 = OUT2 aus und OUT3 ein   Rot aus / Grün an   (entriegelt)
+            
+            if (in3.aktiv || in1.aktiv) {          
+                OUT2 = LED_AUS;
+                OUT3 = LED_EIN;
+            }
+            
+            //------------------------------------------------
+            //  Gelbe LED (optischer Alarm):
+
+            if (in1.optischer_alarm || in2.optischer_alarm)  // sobald der optische Alarm aus Eingang 1 oder Eingang 2 akiviert wurde, diesen in Blinkmode schalten
+            {    
+                if (down_timer.GetTimerStatus(2) == 0) 
+                {
+                    down_timer.SetCountdownTimer(2,1,OA_PERIODE);  // Zeit für Softtimer auf eine Sekunde setzen
+                    OUT4 = !OUT4;
+                }
+            } 
+            else 
+            {
+                OUT4 = LED_AUS;
+            }
+
+            //------------------------------------------------
+            // Summer (OUT5 +24V)
+
+            if (in1.summer || in2.summer || (down_timer.GetTimerStatus(3) != 0))  // sobald der Eingang 1 oder Eingang 2 akiviert ist oder der Timer
+            {                                                                     // noch aktiv ist, den Summer aktivieren
+                OUT5 = 1;
+            } 
+            else 
+            {
+                OUT5 = 0;
+            }
+            
+            //------------------------------------------------
+            // Relais K1:
+            // Der Kontakt des Nottasters wird weitergegeben
+
+            if (in1.aktiv) {  // 1.  IN1 auf 0 = OUT6 (K1) ein
+                OUT6 = 0;
+            } else {          // 2.  IN1 auf 1 = OUT6 aus
+                OUT6 = 1;
+            }
+
+        } // end if (downtimer ...
+        
     } // end while
-}
 
+} // end main
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Fri May 08 07:48:19 2015 +0000
@@ -0,0 +1,18 @@
+#ifndef MAIN_H
+#define MAIN_H
+
+#define CR 13
+#define LED_AUS 0
+#define LED_EIN 1
+
+#define BOOL_FMT(bool_expr)  (bool_expr) ? "ein" : "aus"
+
+struct di_struct {
+    bool  aktiv;                                // Flag zur Steuerung
+    bool  old;                                  // alter Wert vom Eingang für Flankenerkennung
+    bool  filter;                               // ein Flankengetriggertes Signal muss mindestens 10ms anliegen
+    bool  optischer_alarm;                      // für die Bestätigung von IN3
+    bool  summer;                               // Flag für Zeitsteuerung des Summers
+};
+
+#endif
--- a/mbed.bld	Sun Sep 07 12:10:34 2014 +0000
+++ b/mbed.bld	Fri May 08 07:48:19 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/6213f644d804
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/433970e64889
\ No newline at end of file
--- a/monitor.lib	Sun Sep 07 12:10:34 2014 +0000
+++ b/monitor.lib	Fri May 08 07:48:19 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/teams/Temp/code/monitor/#f5bfddb84d63
+http://mbed.org/teams/Temp/code/monitor/#25b0d4087373
--- a/timer0.lib	Sun Sep 07 12:10:34 2014 +0000
+++ b/timer0.lib	Fri May 08 07:48:19 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/rs27/code/timer0/#45063f72267b
+http://mbed.org/users/rs27/code/timer0/#d8e4c9bfd51d