Menü
Vissza

Ck1 Scl Program

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