CsillagKerek_1_FB — SCL Program
Verzió: v1.8 (2026-07-31)
Motor: Tálcaforgató motor 1
Instance DB: DB5
Aktív állomások: Poz 2–6
Leírás
Shift register alapú üveg/tálca pozíciókövetés és vezérlés.
8 pozíciós csillagkerék (0 = infeed, 1–7 = állomások/transit, poz7 = kilép).
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 |
Leírás |
ck1_reset |
VAR_INPUT |
Azonnali leállítás + IDLE |
ck1_szenzor |
VAR_INPUT |
Infeed szenzor (poz0) |
ck1_beall_jel |
VAR_INPUT |
Kerék beállt |
ck1_forgat |
VAR_OUTPUT |
Motor forgat parancs |
ck1_poz2..6_uveg_jel |
VAR_OUTPUT |
Tálca az állomáson + recept aktív |
ck1_allapot_kimenet |
VAR_OUTPUT |
Aktuális state (diagnosztika) |
Static változók (HMI direktben írhatja)
| Változó |
Offset |
Leírás |
ck1_recept_poz2_aktiv |
DBX64.0 |
Poz2 állomás aktív-e |
ck1_recept_poz3_aktiv |
DBX64.1 |
Poz3 állomás aktív-e |
ck1_recept_poz4_aktiv |
DBX64.2 |
Poz4 állomás aktív-e |
ck1_recept_poz5_aktiv |
DBX64.3 |
Poz5 állomás aktív-e |
ck1_recept_poz6_aktiv |
DBX64.4 |
Poz6 állomás aktív-e |
ck1_poz2_kesz |
DBX64.5 |
Poz2 állomás kész (HMI írja, FB reseteli) |
ck1_poz3_kesz |
DBX64.6 |
Poz3 állomás kész |
ck1_poz4_kesz |
DBX64.7 |
Poz4 állomás kész |
ck1_poz5_kesz |
DBX65.0 |
Poz5 állomás kész |
ck1_poz6_kesz |
DBX65.1 |
Poz6 állomás kész |
SCL kód (v1.8)
// =============================================================
// CsillagKerek_1_FB — Csillagkerék 1 vezérlő Function Block
// v1.8 (2026-07-31) — poz_kesz bitek Static-ba + auto-reset beall_jelnél
// =============================================================
FUNCTION_BLOCK "CsillagKerek_1_FB"
TITLE = 'Csillagkerék 1 - Üveg pozíciókövetés és vezérlés'
{ S7_Optimized_Access := 'TRUE' }
VAR_INPUT
ck1_reset : BOOL; // azonnali leállítás + IDLE visszaállítás
ck1_szenzor : BOOL;
ck1_beall_jel : BOOL;
// NINCS TÖBB: poz_kesz bitek kivéve (Static-ba kerültek)
END_VAR
VAR_OUTPUT
ck1_forgat : BOOL;
ck1_poz2_uveg_jel : BOOL;
ck1_poz3_uveg_jel : BOOL;
ck1_poz4_uveg_jel : BOOL;
ck1_poz5_uveg_jel : BOOL;
ck1_poz6_uveg_jel : BOOL;
ck1_allapot_kimenet : INT;
END_VAR
VAR
ck1_uveg : ARRAY[0..7] OF BOOL;
ck1_allapot : INT := 0;
ck1_szenzor_elozo : BOOL;
ck1_beall_elozo : BOOL;
ck1_timer_1s : TON;
ck1_allomas_timer : TON;
ck1_forgat_timer : TON;
ck1_forgathato : BOOL;
ck1_van_aktiv_recept : BOOL;
ck1_van_uveg_bent : BOOL;
ck1_szenzor_feluto : BOOL;
ck1_beall_feluto : BOOL;
// --- v1.7: Recept bitek (Static — HMI direktben írhatja DB-be) ---
ck1_recept_poz2_aktiv : BOOL;
ck1_recept_poz3_aktiv : BOOL;
ck1_recept_poz4_aktiv : BOOL;
ck1_recept_poz5_aktiv : BOOL;
ck1_recept_poz6_aktiv : BOOL;
// --- v1.8: Kész bitek (Static — HMI írja, FB reseteli beall_jelnél) ---
ck1_poz2_kesz : BOOL;
ck1_poz3_kesz : BOOL;
ck1_poz4_kesz : BOOL;
ck1_poz5_kesz : BOOL;
ck1_poz6_kesz : BOOL;
END_VAR
IF ck1_reset THEN
ck1_allapot := 0; ck1_forgat := FALSE;
ck1_uveg[0] := FALSE; ck1_uveg[1] := FALSE; ck1_uveg[2] := FALSE;
ck1_uveg[3] := FALSE; ck1_uveg[4] := FALSE; ck1_uveg[5] := FALSE;
ck1_uveg[6] := FALSE; ck1_uveg[7] := FALSE;
ck1_szenzor_elozo := FALSE; ck1_beall_elozo := FALSE;
ck1_poz2_kesz := FALSE; ck1_poz3_kesz := FALSE; ck1_poz4_kesz := FALSE;
ck1_poz5_kesz := FALSE; ck1_poz6_kesz := FALSE;
ck1_timer_1s(IN := FALSE, PT := T#1S);
ck1_allomas_timer(IN := FALSE, PT := T#300MS);
ck1_forgat_timer(IN := FALSE, PT := T#500MS);
ck1_allapot_kimenet := 0;
RETURN;
END_IF;
ck1_szenzor_feluto := ck1_szenzor AND NOT ck1_szenzor_elozo;
ck1_beall_feluto := ck1_beall_jel AND NOT ck1_beall_elozo;
ck1_szenzor_elozo := ck1_szenzor;
ck1_beall_elozo := ck1_beall_jel;
IF ck1_szenzor_feluto THEN ck1_uveg[0] := TRUE; END_IF;
ck1_van_uveg_bent :=
ck1_uveg[1] OR ck1_uveg[2] OR ck1_uveg[3] OR
ck1_uveg[4] OR ck1_uveg[5] OR ck1_uveg[6];
ck1_van_aktiv_recept :=
ck1_recept_poz2_aktiv OR ck1_recept_poz3_aktiv OR
ck1_recept_poz4_aktiv OR ck1_recept_poz5_aktiv OR
ck1_recept_poz6_aktiv;
ck1_forgathato :=
(NOT ck1_uveg[2] OR NOT ck1_recept_poz2_aktiv OR ck1_poz2_kesz) AND
(NOT ck1_uveg[3] OR NOT ck1_recept_poz3_aktiv OR ck1_poz3_kesz) AND
(NOT ck1_uveg[4] OR NOT ck1_recept_poz4_aktiv OR ck1_poz4_kesz) AND
(NOT ck1_uveg[5] OR NOT ck1_recept_poz5_aktiv OR ck1_poz5_kesz) AND
(NOT ck1_uveg[6] OR NOT ck1_recept_poz6_aktiv OR ck1_poz6_kesz);
ck1_poz2_uveg_jel := ck1_uveg[2] AND ck1_recept_poz2_aktiv;
ck1_poz3_uveg_jel := ck1_uveg[3] AND ck1_recept_poz3_aktiv;
ck1_poz4_uveg_jel := ck1_uveg[4] AND ck1_recept_poz4_aktiv;
ck1_poz5_uveg_jel := ck1_uveg[5] AND ck1_recept_poz5_aktiv;
ck1_poz6_uveg_jel := ck1_uveg[6] AND ck1_recept_poz6_aktiv;
CASE ck1_allapot OF
0: ck1_forgat := FALSE; ck1_timer_1s(IN := FALSE, PT := T#1S);
IF ck1_uveg[0] THEN ck1_allapot := 1; END_IF;
1: ck1_forgat := FALSE; ck1_timer_1s(IN := TRUE, PT := T#1S);
IF ck1_timer_1s.Q THEN ck1_timer_1s(IN := FALSE, PT := T#1S); ck1_allapot := 2; END_IF;
2: ck1_forgat := TRUE; ck1_timer_1s(IN := FALSE, PT := T#1S);
ck1_forgat_timer(IN := TRUE, PT := T#500MS);
IF ck1_beall_feluto AND ck1_forgat_timer.Q THEN
ck1_forgat_timer(IN := FALSE, PT := T#500MS);
ck1_uveg[7] := ck1_uveg[6]; ck1_uveg[6] := ck1_uveg[5];
ck1_uveg[5] := ck1_uveg[4]; ck1_uveg[4] := ck1_uveg[3];
ck1_uveg[3] := ck1_uveg[2]; ck1_uveg[2] := ck1_uveg[1];
ck1_uveg[1] := ck1_uveg[0]; ck1_uveg[0] := FALSE;
ck1_forgat := FALSE; ck1_beall_elozo := FALSE;
ck1_poz2_kesz := FALSE; ck1_poz3_kesz := FALSE; ck1_poz4_kesz := FALSE;
ck1_poz5_kesz := FALSE; ck1_poz6_kesz := FALSE;
ck1_allapot := 3;
END_IF;
3: ck1_forgat := FALSE; ck1_timer_1s(IN := FALSE, PT := T#1S);
ck1_forgat_timer(IN := FALSE, PT := T#500MS);
ck1_allomas_timer(IN := ck1_van_aktiv_recept, PT := T#300MS);
IF ck1_allomas_timer.Q AND ck1_forgathato THEN
ck1_allomas_timer(IN := FALSE, PT := T#300MS);
IF ck1_van_uveg_bent OR ck1_uveg[0] THEN ck1_allapot := 2;
ELSE ck1_allapot := 0; END_IF;
ELSIF ck1_beall_feluto AND ck1_forgathato AND NOT ck1_van_aktiv_recept THEN
ck1_allomas_timer(IN := FALSE, PT := T#300MS);
IF ck1_van_uveg_bent OR ck1_uveg[0] THEN ck1_allapot := 2;
ELSE ck1_allapot := 0; END_IF;
END_IF;
ELSE: ck1_allapot := 0; ck1_forgat := FALSE;
END_CASE;
ck1_allapot_kimenet := ck1_allapot;
END_FUNCTION_BLOCK
Verzióhistória
| Verzió |
Dátum |
Változás |
| v1.8 |
2026-07-31 |
poz_kesz bitek Static-ba, auto-reset beall_jelnél |
| v1.7 |
2026-07-31 |
recept bitek VAR_INPUT → VAR (Static), OB30 nem írja felül |
| v1.6.1 |
2026-07-31 |
STATE 2 végén ck1_beall_elozo := FALSE fix |
| v1.6 |
2026-07-31 |
ck1_reset VAR_INPUT hozzáadva |
| v1.4 |
2026-07-31 |
ck1_van_aktiv_recept segédváltozó, timer fix |