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 : Boolhozzá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