// Pin Definition
// DI
#define S0 43 //Taster Blau (Rack 2) - START-Taster (NO)
#define S1 23 //Kippschalter 1 (Rack 1) - Meldung Behälter leer (NO)
#define S2 27 //Kippschalter 3 (Rack 1) - Meldung Niveau 1 erreicht (NO)
#define S3 31 //Kippschalter 5 (Rack 1) - Meldung Niveau 2 erreicht (NO)
#define S4 35 //Kippschalter 7 (Rack 1) - Meldung Temperatur erreicht (NO)
#define S5 39 //Kippschalter 9 (Rack 1) - Meldung Überdruck erreicht (NO)
#define S6 45 //Taster Grün (Rack 2) - Taster Reset (NO)
//DO
#define Q1 26 //LED Grün 1 (Rack 1) - Zulaufventil 1
#define Q2 30 //LED Gelb 1 (Rack 1) - Zulaufventil 2
#define Q3 22 //LED Blau 1 (Rack 1) - Ablassventil
#define Q4 38 //LED Rot 1 (Rack 1) - Druckablassventil
#define H1 34 //LED Orange 1 (Rack 1) - Heizung
#define M1 24 //LED Blau 2 (Rack 1) - Rührmotor
// ZUSATZ / ERWEITERUNG DOs für LEDs zur Anzeige des aktuellen Schrittes auf Rack 2
#define P0 42 //LED Blau 3 (Rack 2) - Anzeige LED Schritt 0 aktiv
#define P1 44 //LED Grün 3 (Rack 2) - Anzeige LED Schritt 1 aktiv
#define P2 46 //LED Gelb 3 (Rack 2) - Anzeige LED Schritt 2 aktiv
#define P3 48 //LED Rot 3 (Rack 2) - Anzeige LED Schritt 3 aktiv
#define P4 50 //LED Weiß 1 (Rack 2) - Anzeige LED Schritt 4 aktiv
// Hilfsvariablen
//Hilfsvariablen DI
bool S_0 = false;
bool S_1 = false;
bool S_2 = false;
bool S_3 = false;
bool S_4 = false;
bool S_5 = false;
bool S_6 = false;
//Hilfsvariablen DO
bool Q_1 = false;
bool Q_2 = false;
bool Q_3 = false;
bool Q_4 = false;
bool H_1 = false;
bool M_1 = false;
// ZUSATZ / ERWEITERUNG Hilfsvariablen DOs für LEDs zur Anzeige des aktuellen Schrittes auf Rack 2
bool P_0 = false;
bool P_1 = false;
bool P_2 = false;
bool P_3 = false;
bool P_4 = false;
//Variable Timer
long unsigned int Startwert1 = 0; // Startwert Zeit 1 (für 5s)
long unsigned int Startwert2 = 0; // Startwert Zeit 2 (für 10s)
// Variable für Switch/Case Schrittkette
int schritt = 0;
void setup() {
// Pinode DI
pinMode(S0,INPUT);
pinMode(S1,INPUT);
pinMode(S2,INPUT);
pinMode(S3,INPUT);
pinMode(S4,INPUT);
pinMode(S5,INPUT);
pinMode(S6,INPUT);
// Pinmode DO
pinMode(Q1,OUTPUT);
pinMode(Q2,OUTPUT);
pinMode(Q3,OUTPUT);
pinMode(Q4,OUTPUT);
pinMode(H1,OUTPUT);
pinMode(M1,OUTPUT);
// ZUSATZ / ERWEITERUNG PinMode DOs für LEDs zur Anzeige des aktuellen Schrittes auf Rack 2
pinMode(P0,OUTPUT);
pinMode(P1,OUTPUT);
pinMode(P2,OUTPUT);
pinMode(P3,OUTPUT);
pinMode(P4,OUTPUT);
}
void loop() {
// Eingangsabbild
S_0 = digitalRead(S0);
S_1 = digitalRead(S1);
S_2 = digitalRead(S2);
S_3 = digitalRead(S3);
S_4 = digitalRead(S4);
S_5 = digitalRead(S5);
S_6 = digitalRead(S6);
//Rücksetzen der Schrittkette bei Reset
if(S_6)
schritt=0;
//Main / Switch Case Anweisung
switch(schritt) // Anfang der Schrittkette
{
//Grundschritt 0
case 0:
if(S_0 and S_1 and !S_4 and !S_5 and !S_2 and !S_3 ) //Abfrage "Starttaster betätigt (S0)" und "Behälter leer (S1)" und "Temperatur Ok (!S4)" und " Druck Ok (!S5)"
schritt=1; // Zusätzlich werden die Niveauschalter abgefragt (!S_2) / (!S_3),
break; // wenn diese aktiv wären, würden die Kette bei Betätigung des Start-Tasters (S_0) sofort bis zu Schritt 3 durchlaufen!
//Schritt 1
case 1:
if(S_2) //Abfrage "Niveau 1 erreicht (S2)"
schritt=2;
break;
//Schritt 2
case 2:
if(S_3) // Abfrage Niveau 2 erreicht (S3)
schritt=3;
break;
//Schritt 3
case 3:
if(S_4) //Abfrage "Temperatur erreicht (S4)"
schritt=4;
break;
//Schritt 4
case 4:
if(S_1) //Abfrage ob der "Behälter Leer ist (S1)"
schritt=0; //"dann gehe zurück in Schritt 0 (Grundschritt)"
break;
}
// Festlegen der Aktionen
// Zulaufventil 1 (Q1) (nicht speichernde Aktion)
if (schritt==1) // Wenn Schritt 1 aktiv,
Q_1=true; // dann Zulaufventil 1 (Q1) auf.
else // Wenn Schritt 1 inaktiv,
Q_1=false; // dann Zulaufventil 1 (Q1) zu.
// Zulaufventil 2 (Q2) (nicht speichernde Aktion)
if (schritt==2) // Wenn Schritt 2 aktiv,
Q_2=true; // dann Zulaufventil 2 auf (Q2) zu.
else // Wenn Schritt 2 inaktiv,
Q_2=false; // dann Zulaufventil 2 (Q2) zu.
// Zeitverzögerung 1 (5s)
if (schritt==2) // Wenn Schritt 2 aktiv
Startwert1=millis(); // Timer auf 0 setzen (Startwert), für die 5s Zeitverzögerung in Schritt 3
// Heizung (H1) (nicht speichernde Aktion, zeitverzögert)
if (schritt==3 and (millis()>Startwert1+5000)) // Wenn Schritt 3 aktiv und 5s abgelaufen,
H_1=true; // dann Heizung (H1) ein.
else // Wenn Schritt 3 inaktiv oder 5s noch nicht abgelaufen,
H_1=false; // dann Heizung (H1) aus.
// Druckablassventil (Q4) (nicht speichernde, zeitverzögerte, bedingte Aktion)
if ((S_5 and schritt==3 and (millis()>Startwert1+5000)) or (schritt==4 and S_5)) // Wenn Schritt 3 aktiv, Heizvorgang nach 5s begonnen und Druckmelder ausgelöst (S5)
Q_4=true; // dann Druckablassventil (Q4) auf.
else // Wenn Schritt 3 oder Schritt 4 inaktiv oder Druckmelder nicht ausgelöst (S5),
Q_4=false; // dann Druckablassventil (Q4)zu.
// Zeitverzögerung 2 (10s)
if (schritt ==3)
Startwert2=millis(); // Timer auf 0 setzen (Startwert), für die 10s Zeitverzögerung in Schritt 4
// Rühmotor (M1) (speichernde Aktion, Rücksetzdominant)
if (S_6 or (schritt==4 and (millis()>Startwert2+10000))) // Wenn Resettaster (S_6) betätigt oder Schritt 4 aktiv und 10s abgelaufen,
M_1=false; // dann Rührmotor (M1) aus, weil dies die einzige speichernde Aktion in diesem Programm ist!
else if (schritt==2) // Wenn Schritt 2 aktiv,
M_1=true; // dann Rührmotor(M1) ein
// Ablassventil (Q3) (nicht speichernde, bedingte, zeitverzögerte Aktion)
if (schritt==4 and !S_1 and(millis()>Startwert2+10000)) // Wenn Schritt 4 aktiv und Behälter gefüllt (!S1),
Q_3=true; // dann Ablassventil (Q3) auf.
else // Wenn Schritt 4 inaktiv oder Behälter leer (S1),
Q_3=false; // dann Ablassventil (Q3) zu
// ZUSATZ / ERWEITERUNG Aktionen (nicht speichernde Aktionen) für LEDs zur Anzeige des aktuellen Schrittes auf Rack 2
if (schritt==0)
P_0=true;
else
P_0=false;
if (schritt==1)
P_1=true;
else
P_1=false;
if (schritt==2)
P_2=true;
else
P_2=false;
if (schritt==3)
P_3=true;
else
P_3=false;
if (schritt==4)
P_4=true;
else
P_4=false;
// Ausgangsabbild
if (Q_1)
digitalWrite(Q1,HIGH);
else
digitalWrite(Q1,LOW);
if (Q_2)
digitalWrite(Q2,HIGH);
else
digitalWrite(Q2,LOW);
if (Q_3)
digitalWrite(Q3,HIGH);
else
digitalWrite(Q3,LOW);
if (Q_4)
digitalWrite(Q4,HIGH);
else
digitalWrite(Q4,LOW);
if (H_1)
digitalWrite(H1,HIGH);
else
digitalWrite(H1,LOW);
if (M_1)
digitalWrite(M1,HIGH);
else
digitalWrite(M1,LOW);
// ZUSATZ / ERWEITERUNG Aktionen Ausgangsabbild für LEDs zur Anzeige des aktuellen Schrittes auf Rack 2
if (P_0)
digitalWrite(P0,HIGH);
else
digitalWrite(P0,LOW);
if (P_1)
digitalWrite(P1,HIGH);
else
digitalWrite(P1,LOW);
if (P_2)
digitalWrite(P2,HIGH);
else
digitalWrite(P2,LOW);
if (P_3)
digitalWrite(P3,HIGH);
else
digitalWrite(P3,LOW);
if (P_4)
digitalWrite(P4,HIGH);
else
digitalWrite(P4,LOW);
}