Ck2 Scl Program
CsillagKerek_2_FB — SCL Program
Verzió: v1.1 (2026-08-06) — poz1 aktív állomásként, valós DB17 offsetek Motor: Tálcaforgató motor 2 Instance DB: DB17 (TIA Portal-ban assign-olt DB szám) Aktív állomások: Poz 1–7 (mind lehet aktív, recept kapcsolóval)
📥 SCL letöltés: ck2_fb.scl letöltése
Leírás
Shift register alapú tálca pozíciókövetés és vezérlés. 8 pozíciós csillagkerék (0 = infeed, 1–7 = potenciális állomások). CK1-hez képest különbség: poz 1 és poz 7 is lehet aktív állomás (CK1-nél csak poz 2–6).
State machine
| State | Leírás |
|---|---|
| 0 – IDLE | Motor áll, vár az infeed szenzorra |
| 1 – TIMER (1s) | Debounce várakozás |
| 2 – FORGAT | Motor fut, vár a beáll jelre (min. 500ms után) |
| 3 – ÁLLOMÁS VÁR | Vár amíg minden aktív állomás kész |
Bemenetek / Kimenetek
| Változó | Irány | Offset | Leírás |
|---|---|---|---|
ck2_reset |
VAR_INPUT | 0.2 | Azonnali leállítás + IDLE |
ck2_szenzor |
VAR_INPUT | 0.0 | Infeed szenzor (poz0) |
ck2_beall_jel |
VAR_INPUT | 0.1 | Kerék beállt |
ck2_forgat |
VAR_OUTPUT | 2.0 | Tálcaforgató motor 2 forgat parancs |
ck2_poz1_uveg_jel |
VAR_OUTPUT | 2.1 | Poz1: tálca + recept aktív |
ck2_poz2_uveg_jel |
VAR_OUTPUT | 2.2 | Poz2: tálca + recept aktív |
ck2_poz3_uveg_jel |
VAR_OUTPUT | 2.3 | Poz3: tálca + recept aktív |
ck2_poz4_uveg_jel |
VAR_OUTPUT | 2.4 | Poz4: tálca + recept aktív |
ck2_poz5_uveg_jel |
VAR_OUTPUT | 2.5 | Poz5: tálca + recept aktív |
ck2_poz6_uveg_jel |
VAR_OUTPUT | 2.6 | Poz6: tálca + recept aktív |
ck2_poz7_uveg_jel |
VAR_OUTPUT | 2.7 | Poz7: tálca + recept aktív |
ck2_allapot_kimenet |
VAR_OUTPUT | 4.0 | Aktuális state (Int, diagnosztika) |
Static változók — DB17 valós offsetek (Máté TIA Portal képe alapján)
| Változó | Valós offset | Leírás |
|---|---|---|
ck2_uveg[0..7] |
DBX6.0 | Shift register (8 bool) |
ck2_allapot |
DBW8 | State machine (Int) |
ck2_van_aktiv_recept |
DBX46.0 | Van aktív recept segédváltozó |
ck2_forgat_timer |
DBX48.0 | TON (500ms) |
ck2_recept_poz1_aktiv |
DBX64.0 | Poz1 recept aktív (HMI írja) |
ck2_recept_poz2_aktiv |
DBX64.1 | Poz2 recept aktív |
ck2_recept_poz3_aktiv |
DBX64.2 | Poz3 recept aktív |
ck2_recept_poz4_aktiv |
DBX64.3 | Poz4 recept aktív |
ck2_recept_poz5_aktiv |
DBX64.4 | Poz5 recept aktív |
ck2_recept_poz6_aktiv |
DBX64.5 | Poz6 recept aktív |
ck2_recept_poz7_aktiv |
DBX64.6 | Poz7 recept aktív |
ck2_poz1_kesz |
DBX64.7 | Poz1 kész (HMI írja, FB reseteli lépésnél) |
ck2_poz2_kesz |
DBX65.0 | Poz2 kész |
ck2_poz3_kesz |
DBX65.1 | Poz3 kész |
ck2_poz4_kesz |
DBX65.2 | Poz4 kész |
ck2_poz5_kesz |
DBX65.3 | Poz5 kész |
ck2_poz6_kesz |
DBX65.4 | Poz6 kész |
ck2_poz7_kesz |
DBX65.5 | Poz7 kész |
HMI — app.py kapcsolat
A HMI (/csillagkerek2 oldal) DB17-ből olvas 66 byte-ot (0..65).
Recept kapcsolók és Kész gombok közvetlenül a fenti offsetekre írnak.
| HMI akció | DB17 írás |
|---|---|
| Recept toggle poz1-6 | DBX64.0–64.5 |
| Kész gomb poz1 | DBX64.7 |
| Kész gomb poz2-6 | DBX65.0–65.4 |
SCL kód (v1.1)
// =============================================================
// CsillagKerek_2_FB — Csillagkerék 2 vezérlő Function Block
// v1.1 (2026-08-06) — poz1 aktív, valós DB17 offsetek
// Poz 1-7 lehet aktív állomás (vs CK1: poz 2-6)
// =============================================================
FUNCTION_BLOCK "CsillagKerek_2_FB"
TITLE = 'Csillagkerék 2 - Tálca pozíciókövetés és vezérlés'
{ S7_Optimized_Access := 'TRUE' }
VAR_INPUT
ck2_reset : BOOL; // 0.2 — azonnali leállítás + IDLE visszaállítás
ck2_szenzor : BOOL; // 0.0 — infeed szenzor (poz0)
ck2_beall_jel : BOOL; // 0.1 — kerék beállt jel (pozíció elérve)
END_VAR
VAR_OUTPUT
ck2_forgat : BOOL; // 2.0 — tálcaforgató motor 2 forgat parancs
ck2_poz1_uveg_jel : BOOL; // 2.1 — poz1: tálca az állomáson + recept aktív
ck2_poz2_uveg_jel : BOOL; // 2.2
ck2_poz3_uveg_jel : BOOL; // 2.3
ck2_poz4_uveg_jel : BOOL; // 2.4
ck2_poz5_uveg_jel : BOOL; // 2.5
ck2_poz6_uveg_jel : BOOL; // 2.6
ck2_poz7_uveg_jel : BOOL; // 2.7
ck2_allapot_kimenet : INT; // 4.0 — diagnosztika: aktuális state
END_VAR
VAR
ck2_uveg : ARRAY[0..7] OF BOOL; // 6.0 — shift register
ck2_allapot : INT := 0; // 8.0
ck2_szenzor_elozo : BOOL; // 10.0
ck2_beall_elozo : BOOL; // 10.1
ck2_timer_1s : TON_TIME; // 12.0
ck2_forgathato : BOOL; // 28.0
ck2_van_uveg_bent : BOOL; // 28.1
ck2_szenzor_feluto : BOOL; // 28.2
ck2_beall_feluto : BOOL; // 28.3
ck2_allomas_timer : TON_TIME; // 30.0
ck2_van_aktiv_recept : BOOL; // 46.0
ck2_forgat_timer : TON_TIME; // 48.0
// --- Recept bitek (HMI direktben írhatja DB-be) ---
ck2_recept_poz1_aktiv : BOOL; // 64.0
ck2_recept_poz2_aktiv : BOOL; // 64.1
ck2_recept_poz3_aktiv : BOOL; // 64.2
ck2_recept_poz4_aktiv : BOOL; // 64.3
ck2_recept_poz5_aktiv : BOOL; // 64.4
ck2_recept_poz6_aktiv : BOOL; // 64.5
ck2_recept_poz7_aktiv : BOOL; // 64.6
// --- Kész bitek (HMI írja, FB reseteli beall_jelnél) ---
ck2_poz1_kesz : BOOL; // 64.7
ck2_poz2_kesz : BOOL; // 65.0
ck2_poz3_kesz : BOOL; // 65.1
ck2_poz4_kesz : BOOL; // 65.2
ck2_poz5_kesz : BOOL; // 65.3
ck2_poz6_kesz : BOOL; // 65.4
ck2_poz7_kesz : BOOL; // 65.5
END_VAR
// ---------------------------------------------------------
// 0. RESET
// ---------------------------------------------------------
IF ck2_reset THEN
ck2_allapot := 0;
ck2_forgat := FALSE;
ck2_uveg[0] := FALSE;
ck2_uveg[1] := FALSE;
ck2_uveg[2] := FALSE;
ck2_uveg[3] := FALSE;
ck2_uveg[4] := FALSE;
ck2_uveg[5] := FALSE;
ck2_uveg[6] := FALSE;
ck2_uveg[7] := FALSE;
ck2_szenzor_elozo := FALSE;
ck2_beall_elozo := FALSE;
ck2_poz1_kesz := FALSE;
ck2_poz2_kesz := FALSE;
ck2_poz3_kesz := FALSE;
ck2_poz4_kesz := FALSE;
ck2_poz5_kesz := FALSE;
ck2_poz6_kesz := FALSE;
ck2_poz7_kesz := FALSE;
ck2_timer_1s(IN := FALSE, PT := T#1S);
ck2_allomas_timer(IN := FALSE, PT := T#300MS);
ck2_forgat_timer(IN := FALSE, PT := T#500MS);
ck2_allapot_kimenet := 0;
RETURN;
END_IF;
// ---------------------------------------------------------
// 1. FELFUTÓ ÉL DETEKTÁLÁS
// ---------------------------------------------------------
ck2_szenzor_feluto := ck2_szenzor AND NOT ck2_szenzor_elozo;
ck2_beall_feluto := ck2_beall_jel AND NOT ck2_beall_elozo;
ck2_szenzor_elozo := ck2_szenzor;
ck2_beall_elozo := ck2_beall_jel;
// ---------------------------------------------------------
// 2. SZENZOR KEZELÉS
// ---------------------------------------------------------
IF ck2_szenzor_feluto THEN
ck2_uveg[0] := TRUE;
END_IF;
// ---------------------------------------------------------
// 3. SEGÉDVÁLTOZÓK
// ---------------------------------------------------------
ck2_van_uveg_bent :=
ck2_uveg[1] OR ck2_uveg[2] OR ck2_uveg[3] OR
ck2_uveg[4] OR ck2_uveg[5] OR ck2_uveg[6] OR ck2_uveg[7];
ck2_van_aktiv_recept :=
ck2_recept_poz1_aktiv OR ck2_recept_poz2_aktiv OR
ck2_recept_poz3_aktiv OR ck2_recept_poz4_aktiv OR
ck2_recept_poz5_aktiv OR ck2_recept_poz6_aktiv OR
ck2_recept_poz7_aktiv;
ck2_forgathato :=
(NOT ck2_uveg[1] OR NOT ck2_recept_poz1_aktiv OR ck2_poz1_kesz) AND
(NOT ck2_uveg[2] OR NOT ck2_recept_poz2_aktiv OR ck2_poz2_kesz) AND
(NOT ck2_uveg[3] OR NOT ck2_recept_poz3_aktiv OR ck2_poz3_kesz) AND
(NOT ck2_uveg[4] OR NOT ck2_recept_poz4_aktiv OR ck2_poz4_kesz) AND
(NOT ck2_uveg[5] OR NOT ck2_recept_poz5_aktiv OR ck2_poz5_kesz) AND
(NOT ck2_uveg[6] OR NOT ck2_recept_poz6_aktiv OR ck2_poz6_kesz) AND
(NOT ck2_uveg[7] OR NOT ck2_recept_poz7_aktiv OR ck2_poz7_kesz);
// ---------------------------------------------------------
// 4. ÁLLOMÁS JELZÉSEK (kimenet)
// ---------------------------------------------------------
ck2_poz1_uveg_jel := ck2_uveg[1] AND ck2_recept_poz1_aktiv;
ck2_poz2_uveg_jel := ck2_uveg[2] AND ck2_recept_poz2_aktiv;
ck2_poz3_uveg_jel := ck2_uveg[3] AND ck2_recept_poz3_aktiv;
ck2_poz4_uveg_jel := ck2_uveg[4] AND ck2_recept_poz4_aktiv;
ck2_poz5_uveg_jel := ck2_uveg[5] AND ck2_recept_poz5_aktiv;
ck2_poz6_uveg_jel := ck2_uveg[6] AND ck2_recept_poz6_aktiv;
ck2_poz7_uveg_jel := ck2_uveg[7] AND ck2_recept_poz7_aktiv;
// ---------------------------------------------------------
// 5. STATE MACHINE
// ---------------------------------------------------------
CASE ck2_allapot OF
0: // IDLE
ck2_forgat := FALSE;
ck2_timer_1s(IN := FALSE, PT := T#1S);
IF ck2_uveg[0] THEN
ck2_allapot := 1;
END_IF;
1: // TIMER_VAR — 1s várakozás
ck2_forgat := FALSE;
ck2_timer_1s(IN := TRUE, PT := T#1S);
IF ck2_timer_1s.Q THEN
ck2_timer_1s(IN := FALSE, PT := T#1S);
ck2_allapot := 2;
END_IF;
2: // FORGAT
ck2_forgat := TRUE;
ck2_timer_1s(IN := FALSE, PT := T#1S);
ck2_forgat_timer(IN := TRUE, PT := T#500MS);
IF ck2_beall_feluto AND ck2_forgat_timer.Q THEN
ck2_forgat_timer(IN := FALSE, PT := T#500MS);
ck2_uveg[7] := ck2_uveg[6];
ck2_uveg[6] := ck2_uveg[5];
ck2_uveg[5] := ck2_uveg[4];
ck2_uveg[4] := ck2_uveg[3];
ck2_uveg[3] := ck2_uveg[2];
ck2_uveg[2] := ck2_uveg[1];
ck2_uveg[1] := ck2_uveg[0];
ck2_uveg[0] := FALSE;
ck2_forgat := FALSE;
ck2_beall_elozo := FALSE;
ck2_poz1_kesz := FALSE;
ck2_poz2_kesz := FALSE;
ck2_poz3_kesz := FALSE;
ck2_poz4_kesz := FALSE;
ck2_poz5_kesz := FALSE;
ck2_poz6_kesz := FALSE;
ck2_poz7_kesz := FALSE;
ck2_allapot := 3;
END_IF;
3: // ALLOMAS_VAR
ck2_forgat := FALSE;
ck2_timer_1s(IN := FALSE, PT := T#1S);
ck2_forgat_timer(IN := FALSE, PT := T#500MS);
ck2_allomas_timer(IN := ck2_van_aktiv_recept, PT := T#300MS);
IF ck2_allomas_timer.Q AND ck2_forgathato THEN
ck2_allomas_timer(IN := FALSE, PT := T#300MS);
IF ck2_van_uveg_bent OR ck2_uveg[0] THEN
ck2_allapot := 2;
ELSE
ck2_allapot := 0;
END_IF;
ELSIF ck2_beall_feluto AND ck2_forgathato AND NOT ck2_van_aktiv_recept THEN
ck2_allomas_timer(IN := FALSE, PT := T#300MS);
IF ck2_van_uveg_bent OR ck2_uveg[0] THEN
ck2_allapot := 2;
ELSE
ck2_allapot := 0;
END_IF;
END_IF;
ELSE:
ck2_allapot := 0;
ck2_forgat := FALSE;
END_CASE;
// ---------------------------------------------------------
// 6. DIAGNOSZTIKA
// ---------------------------------------------------------
ck2_allapot_kimenet := ck2_allapot;
END_FUNCTION_BLOCK
Betöltési útmutató (Máténak)
- TIA Portal → CsillagKerek_2_FB function block megnyitása
- SCL forrás cseréje a fenti kódra
- Compile → hibamentesnek kell lennie
- Download to device (csak a PLC-re — HMI nem kell újraindítani)
- DB17 Watch Table-ben ellenőrizni az offseteket (táblázat fent)
⚠️ Fontos: A ck2_recept_poz7_aktiv (64.6) és ck2_poz7_kesz (65.5) tagok bent vannak a DB-ben de a HMI jelenleg nem kezeli poz7-et (kiesési pozíció). Ha poz7 is aktív állomás lesz, HMI-n is hozzáadható.