Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FreescaleIAP MODSERIAL mbed monitor timer0
Fork of 17_PT1000 by
Revision 19:8e4e6fe34857, committed 2015-05-08
- Comitter:
- rs27
- Date:
- Fri May 08 07:48:19 2015 +0000
- Parent:
- 18:939d3df56218
- Commit message:
- 080515
Changed in this revision
--- 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
