Menü
Vissza

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)

  1. TIA Portal → CsillagKerek_2_FB function block megnyitása
  2. SCL forrás cseréje a fenti kódra
  3. Compile → hibamentesnek kell lennie
  4. Download to device (csak a PLC-re — HMI nem kell újraindítani)
  5. 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ó.