Menü
Vissza

Ck1 Csillagkerek

CsillagKerek_1_FB — Csillagkerék 1 vezérlő

Verzió: v1.7 (2026-07-31) | Function Block (FB) | SCL | TIA Portal | Shift register alapú üveg-pozíciókövetés


Rendszer áttekintés

A csillagkerék (más néven csillagtárcsás elosztó / star wheel) egy 8 nuttal rendelkező forgótárca, amely 45°-onként lép. Az infeed pályáról érkező üvegeket fogadja, és sorban elvezeti az egyes feldolgozó állomásokra, végül az outfeed pályára.

Pozíciótérkép

Pozíció Funkció DB jel az állomásnak
0 Infeed — szenzor érzékeli az üveg beérkezését
1 Üres pozíció
2 1. állomás — Robotkaros kupakoló ck1_poz2_uveg_jel
3 2. állomás — Kupakcsavaró ck1_poz3_uveg_jel
4 3. állomás — TBD ck1_poz4_uveg_jel
5 4. állomás — TBD ck1_poz5_uveg_jel
6 Outfeed pálya ck1_poz6_uveg_jel
7 Üres (elvesző bit)

Működési logika

Shift register

A rendszer egy 8 bites shift register (ck1_uveg[0..7]) segítségével követi nyomon, hogy melyik pozícióban van fizikailag üveg:

  • Infeed szenzor felfutó él → ck1_uveg[0] := TRUE
  • Minden 45° fordulat után a bitek tolódnak: [7]←[6]←[5]←[4]←[3]←[2]←[1]←[0]←FALSE
  • ck1_uveg[7] eldobásra kerül (üres pozíció, nincs állomás)

Az utolsó üveg automatikusan kijön — ha ck1_uveg[1..6] összes bitje FALSE → a csillagkerék megáll.

State machine (4 állapot)

IDLE (0)
  └─ szenzor felfutó él → TIMER_VAR (1)

TIMER_VAR (1)
  └─ 1s lejárt → FORGAT (2)

FORGAT (2)
  └─ ck1_forgat := TRUE
  └─ min. 500ms után fogadja el a beáll_jelt (ck1_forgat_timer)
  └─ beáll_jel felfutó él (≥500ms) → SHIFT regiszter tolás → ALLOMAS_VAR (3)

ALLOMAS_VAR (3)
  └─ ck1_forgat := FALSE
  └─ [AUTO MÓD] 300ms várakozás (recept aktív) + forgathato=TRUE → FORGAT (2)
  └─ [KÉZI MÓD] beáll_jel felfutó él + forgathato + nincs recept → FORGAT (2)

RESET (bármely állapotból)
  └─ ck1_reset = TRUE → IDLE (0), ck1_forgat=FALSE, shift register törlése  ← v1.6

⚠️ v1.7 — Recept bitek Static-ba (2026-07-31)

Probléma: A recept bitek -ban voltak → az OB30 minden PLC scan-ben felülírta a HMI által DB-be írt értéket → a recept kapcsoló bekapcsol, majd visszaáll.

Megoldás: A recept bitek (..) átkerültek → (Static) szekcióba. - Static tagokat az OB30-ban nem kell bekötni (nincs felülírás) - A HMI direktben írhatja a DB-t → az érték megmarad

Máténak — TIA Portal v1.7 frissítés: 1. Input szekcióból KITÖRÖLNI az 5 recept bitet (poz2..poz6) 2. Static szekcióba HOZZÁADNI az 5 recept bitet (típus: Bool) 3. OB30-ban az FB hívásból KITÖRÖLNI a recept input sorokat (nincs többé input paraméter) 4. Kód törzs: NEM változott — a recept bitek neve ugyanaz marad


⚠️ v1.6 — Reset input (2026-07-31)

Probléma: Ha a beáll szenzor (%M21.5) nem érkezik meg (pl. motor ellentétes irányba forog, vagy szenzor nem ad jelet), az FB STATE 2-ben (FORGAT) ragad → ck1_forgat TRUE marad → motor folyamatosan forog. Az előző verziókban nem volt reset input.

Megoldás — v1.6: ck1_reset : BOOL input hozzáadva. Ha TRUE: azonnal leáll minden, IDLE-ba visszaáll, shift register nullázódik.

OB30-ban a reset bekötése (pl. HMI reset gombhoz):

"CsillagKerek_1_DB"(
    ck1_reset  := %M30.0,   // ← HMI reset gomb / vészleállítás
    ck1_szenzor := ...,
    ...
);

Interface táblázat — Input szekcióba hozzáadandó (v1.6 ÚJ):

Név Típus Leírás
ck1_reset Bool Azonnali leállítás + IDLE visszaállítás

⚠️ MÁTÉ TEENDŐ: Input szekcióba ck1_reset : Bool hozzáadása (legelső sor), OB30-ban bekötni egy M bit-hez vagy HMI reset gombhoz.


Tagok — teljes összefoglaló

Bemenetek (VAR_INPUT)

Tag neve Típus Leírás
ck1_reset Bool v1.6 ÚJ — Azonnali leállítás
ck1_szenzor Bool Infeed szenzor (0. pozíció)
ck1_beall_jel Bool Csillagkerék pozíciószenzor (45°-ba állt)
ck1_poz2_kesz Bool Robotkaros kupakoló: kész
ck1_poz3_kesz Bool Kupakcsavaró: kész
ck1_poz4_kesz Bool TBD állomás: kész
ck1_poz5_kesz Bool TBD állomás: kész
ck1_poz6_kesz Bool Outfeed: kész

Kimenetek (VAR_OUTPUT)

Tag neve Típus Leírás
ck1_forgat Bool Forgás parancs a motornak
ck1_poz2_uveg_jel Bool Van üveg poz2-ben ÉS recept aktív
ck1_poz3_uveg_jel Bool Van üveg poz3-ban ÉS recept aktív
ck1_poz4_uveg_jel Bool Van üveg poz4-ben ÉS recept aktív
ck1_poz5_uveg_jel Bool Van üveg poz5-ben ÉS recept aktív
ck1_poz6_uveg_jel Bool Van üveg poz6-ban ÉS recept aktív
ck1_allapot_kimenet Int Aktuális állapot (0=IDLE, 1=TIMER, 2=FORGAT, 3=ALLOMAS_VAR)

Statikus változók (VAR — Instance DB-ben)

Tag neve Típus Leírás
ck1_uveg[0..7] Array[0..7] of Bool Shift register
ck1_allapot Int (default: 0) State machine állapot
ck1_szenzor_elozo Bool Felfutó él detektáláshoz
ck1_beall_elozo Bool Felfutó él detektáláshoz
ck1_timer_1s TON 1s timer (infeed után)
ck1_allomas_timer TON 300ms várakozás ALLOMAS_VAR-ban
ck1_forgat_timer TON 500ms min. forgási idő (v1.5+)
ck1_forgathato Bool Segédváltozó
ck1_van_aktiv_recept Bool Segédváltozó (v1.4+)
ck1_van_uveg_bent Bool Segédváltozó
ck1_szenzor_feluto Bool Felfutó él (1 scan)
ck1_beall_feluto Bool Felfutó él (1 scan)
ck1_recept_poz2_aktiv Bool v1.7 Recept poz2 — Static, HMI direktben írhatja
ck1_recept_poz3_aktiv Bool v1.7 Recept poz3 — Static, HMI direktben írhatja
ck1_recept_poz4_aktiv Bool v1.7 Recept poz4 — Static, HMI direktben írhatja
ck1_recept_poz5_aktiv Bool v1.7 Recept poz5 — Static, HMI direktben írhatja
ck1_recept_poz6_aktiv Bool v1.7 Recept poz6 — Static, HMI direktben írhatja

Máténak — TIA Portal teendők (v1.6 frissítés)

Meglévő: FB = FB2, Instance DB = DB22

v1.6 frissítés lépései

1. Input szekcióba hozzáadni (legelső sorba!):

Név Típus
ck1_reset Bool

2. Kód törzset cserélni az alábbi v1.6 kód törzzsel.

3. OB30-ban az FB hívást kiegészíteni:

"CsillagKerek_1_DB"(
    ck1_reset               := %M30.0,        // ← ÚJ: reset bit (pl. HMI gombhoz)
    ck1_szenzor             := ...,
    ck1_beall_jel           := %M21.5,        // Csillagkerék 1 poz ok
    ...
);

4. Azonnali leállítás teszt: TIA Portalban %M30.0-t manuálisan TRUE-ra állítani → motor megáll, allapot=0.


Kód törzs — ✅ EZT illeszd be a TIA Portal kód ablakba (v1.6)

// ---------------------------------------------------------
// 0. RESET — v1.6: azonnali leállítás minden állapotból
// ---------------------------------------------------------
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_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;

// ---------------------------------------------------------
// 1. FELFUTÓ ÉL DETEKTÁLÁS
// ---------------------------------------------------------
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;

// ---------------------------------------------------------
// 2. SZENZOR KEZELÉS — minden állapotban aktív
// ---------------------------------------------------------
IF ck1_szenzor_feluto THEN
    ck1_uveg[0] := TRUE;
END_IF;

// ---------------------------------------------------------
// 3. SEGÉDVÁLTOZÓK
// ---------------------------------------------------------
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);

// ---------------------------------------------------------
// 4. ÁLLOMÁS JELZÉSEK
// ---------------------------------------------------------
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;

// ---------------------------------------------------------
// 5. STATE MACHINE
// ---------------------------------------------------------
CASE ck1_allapot OF

    0: // IDLE
        ck1_forgat := FALSE;
        ck1_timer_1s(IN := FALSE, PT := T#1S);
        IF ck1_uveg[0] THEN
            ck1_allapot := 1;
        END_IF;

    1: // TIMER_VAR — 1s várakozás
        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: // FORGAT — motor fut
        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;  // v1.6.1: STATE 3-ban újra felismeri a felfutó élt
            ck1_allapot     := 3;
        END_IF;

    3: // ALLOMAS_VAR
        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;

// ---------------------------------------------------------
// 6. DIAGNOSZTIKA
// ---------------------------------------------------------
ck1_allapot_kimenet := ck1_allapot;

HMI Teszt API — DB22 (arpad-hmi Flask)

Endpoint Metódus Leírás
GET /api/csillagkerek/status GET DB22 állapot olvasás
POST /api/csillagkerek/szenzor_impulzus POST Szenzor felfutó él szimuláció
POST /api/csillagkerek/beall_impulzus POST Beáll jel felfutó él szimuláció
POST /api/csillagkerek/reset_plc POST DB22 teljes reset
POST /api/csillagkerek/recept/<poz> POST Recept bit írás

Verziótörténet

Verzió Dátum Változás
v1.7 2026-07-31
v1.6.1 2026-07-31
v1.6 2026-07-31 ck1_reset input hozzáadva — azonnali leállítás + IDLE visszaállítás + shift register törlése
v1.5 2026-07-31 ck1_forgat_timer (500ms min. forgási idő), ALLOMAS_VAR kézi mód Beáll gombbal
v1.4 2026-07-31 ck1_van_aktiv_recept segédváltozó, ALLOMAS_VAR timer csak ha van aktív recept
v1.3 2026-07-30 ALLOMAS_VAR 300ms timer, HMI teszt API

Frissítve: 2026-07-31 v1.6 | Giorgio (AI asszisztens) | arpad.karlwood.hu/docs/ck1-csillagkerek