#define S0 43 // Taster Blau - START
#define S1 23 // Kippschalter 1 - Werkstück vorhanden
#define S2 27 // Kippschalter 3 - Klemme geschlossen
#define S3 31 // Kippschalter 5 - Stempel unten
#define S4 35 // Kippschalter 7 - Stempel oben
#define S5 39 // Kippschalter 9 - Druck OK
#define S6 45 // Taster Grün - Reset
// DO
#define Q1 26 // LED Grün 1 - Zuführ/Spann-Zylinder vor
#define Q2 30 // LED Gelb 1 - Stempel abwärts
#define Q3 22 // LED Blau 1 - Stempel aufwärts
#define Q4 38 // LED Rot 1 - Ausschleuser vor
#define H1 34 // LED Orange - Zyklus läuft / Maschine an
#define M1 24 // LED Weiß 1 - Serie fertig
// Schritt-Anzeige (Erweiterung)
#define P0 42 // LED Blau 3 - Schritt 0
#define P1 44 // LED Grün 3 - Schritt 1
#define P2 46 // LED Gelb 3 - Schritt 2
#define P3 48 // LED Rot 3 - Schritt 3
#define P4 50 // LED Weiß 3 - Schritt 4 (Serie fertig)
// ---------- 1b) Hilfsvariablen ----------
// Eingänge
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;
// Ausgänge (logische Abbild-Variablen)
bool Q_1 = false;
bool Q_2 = false;
bool Q_3 = false;
bool Q_4 = false;
bool H_1 = false;
bool M_1 = false;
// Schritt-Anzeige
bool P_0 = false;
bool P_1 = false;
bool P_2 = false;
bool P_3 = false;
bool P_4 = false;
// Timer-Variablen
unsigned long PressStart = 0; // für Presszeit (z.B. 3 s)
unsigned long EjectStart = 0; // optional für Ausschleuszeit
// Schrittkette und Teilezähler
int schritt = 0; // 0..4
int teileZaehler = 0; // 0..5
// ---------- 2) setup() ----------
void setup() {
// DI
pinMode(S0, INPUT);
pinMode(S1, INPUT);
pinMode(S2, INPUT);
pinMode(S3, INPUT);
pinMode(S4, INPUT);
pinMode(S5, INPUT);
pinMode(S6, INPUT);
// DO
pinMode(Q1, OUTPUT);
pinMode(Q2, OUTPUT);
pinMode(Q3, OUTPUT);
pinMode(Q4, OUTPUT);
pinMode(H1, OUTPUT);
pinMode(M1, OUTPUT);
pinMode(P0, OUTPUT);
pinMode(P1, OUTPUT);
pinMode(P2, OUTPUT);
pinMode(P3, OUTPUT);
pinMode(P4, OUTPUT);
}
// ---------- 3) loop() ----------
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);
// ---------- 4) Reset-Behandlung ----------
if (S_6) {
schritt = 0;
teileZaehler = 0;
}
// ---------- 5) Schrittkette (Grafcet) ----------
switch (schritt) {
// Schritt 0: Grundstellung
case 0:
// Übergangsbedingung: Start, Werkstück da, Druck OK, Stempel oben,
// Serie noch nicht fertig (weniger als 5 Teile)
if (S_0 && S_1 && S_5 && S_4 && (teileZaehler < 5)) {
schritt = 1;
}
break;
// Schritt 1: Zufahren & Klemmen
case 1:
if (S_2) { // Klemme geschlossen
schritt = 2;
PressStart = millis(); // Start der Presszeit vorbereiten
}
break;
// Schritt 2: Prägen
case 2:
// Warten, bis Stempel unten und Presszeit vergangen
if (S_3 && (millis() > PressStart + 3000)) { // 3 s Presszeit
schritt = 3;
EjectStart = millis(); // optional für Auswurfzeit
}
break;
// Schritt 3: Entspannen & Ausschleusen
case 3:
// Bedingung: Stempel oben, Werkstück weg (S1 = 0)
if (S_4 && !S_1 && (millis() > EjectStart + 1000)) {
// Ein Werkstück fertig → Zähler erhöhen
teileZaehler++;
if (teileZaehler >= 5) {
schritt = 4; // Serie fertig
} else {
schritt = 0; // nächstes Werkstück
}
}
break;
// Schritt 4: Serie fertig (5 Teile)
case 4:
// bleibt hier stehen, bis Reset gedrückt wird (schritt = 0 im Reset-Teil)
break;
}
// ---------- 6) Aktionen festlegen ----------
// Standard: alles aus
Q_1 = false;
Q_2 = false;
Q_3 = false;
Q_4 = false;
H_1 = false;
M_1 = false;
// Schrittabhängige Aktionen
switch (schritt) {
case 0:
// Grundstellung, Maschine wartet
H_1 = false;
break;
case 1:
// Zufahren & Klemmen
Q_1 = true; // Spannzylinder vor
H_1 = true; // Zyklus läuft
break;
case 2:
// Prägen
Q_1 = true; // Klemme hält weiter
Q_2 = true; // Stempel abwärts
H_1 = true;
break;
case 3:
// Entspannen & Ausschleusen
Q_3 = true; // Stempel aufwärts
Q_4 = true; // Ausschleuser vor
H_1 = true;
break;
case 4:
// Serie fertig
M_1 = true; // Fertiglampe
// alle Bewegungen bleiben aus
break;
}
// ---------- 6b) Schritt-Anzeige ----------
P_0 = (schritt == 0);
P_1 = (schritt == 1);
P_2 = (schritt == 2);
P_3 = (schritt == 3);
P_4 = (schritt == 4);
// ---------- 7) Ausgangsabbild ----------
digitalWrite(Q1, Q_1 ? HIGH : LOW);
digitalWrite(Q2, Q_2 ? HIGH : LOW);
digitalWrite(Q3, Q_3 ? HIGH : LOW);
digitalWrite(Q4, Q_4 ? HIGH : LOW);
digitalWrite(H1, H_1 ? HIGH : LOW);
digitalWrite(M1, M_1 ? HIGH : LOW);
digitalWrite(P0, P_0 ? HIGH : LOW);
digitalWrite(P1, P_1 ? HIGH : LOW);
digitalWrite(P2, P_2 ? HIGH : LOW);
digitalWrite(P3, P_3 ? HIGH : LOW);
digitalWrite(P4, P_4 ? HIGH : LOW);
}