Vissza
Fc5 V7 Em3
FC5 v7 — Emelőmotor 3 integráció
Verzió: v8 | Alap: FC5 v6 (bevált, tesztelt) | Visszafelé kompatibilis: ✅
Mi változott v6-hoz képest?
Az FC5 v6 egy sorral sem változott — csak egy EM3 állapotgép blokkot adtunk elé, és a töltésindítás feltételébe egy extra AND.
Működés (sorrend)
0. EM3 Z-FENTI pozícióban vár → robotkar berakja az üveget
1. Robotkar jelet ad (EM3_robot_jel = TRUE) → EM3 Z-LENTIBE megy
2. Timer lejár (Z-mozgás kész) → TÖLTÉS ENGEDÉLYEZVE (FC5 logika fut)
3. Töltés kész → EM3 Z-FENTIBE megy
4. Timer lejár → ciklus újraindul (0. állapot)
TIA-ban Máténak — "Automatika" DB bővítés
| Név | Típus | Alapérték | Leírás |
|---|---|---|---|
EM3_aktiv |
Bool | FALSE | Ha FALSE → v6 mód, EM3 nem érintett |
EM3_allapat |
DInt | 0 | Belső állapot (0-3) — NE írd felül HMI-ből! |
EM3_Z_felso |
DInt | 10000 | Z felső pozíció (Festo CMMT egység, fogadó) |
EM3_Z_also |
DInt | 5000 | Z alsó pozíció (töltő mélység) |
EM3_robot_jel |
Bool | FALSE | Robotkar "kész, beraktam" jele — bekötés szükséges! |
EM3_Z_ido_ms |
DInt | 2000 | Z mozgás várakozás ms-ban |
EM3_timer |
TON | — | Mozgás timer (mint az Ms_timer!) |
HMI DB (DB8) tagek — már léteznek!
| Tag neve (pontos!) | Típus | Offset |
|---|---|---|
Töltő emelőmotor 3 inditás |
Bool | DB8.DBX16.0 |
Töltő emelőmotor 3 Magasság |
DInt | DB8.DBD18.0 |
Töltő emelőmotor 3 Gyorsaság |
DInt | DB8.DBD22.0 |
Visszafelé kompatibilitás
Ha EM3_aktiv = FALSE → pontosan az FC5 v6 logika fut, az EM3 nem érintett.
FC5 v7 — Teljes kód (TIA-ba másolni)
// FC5 — Töltés automatika v8
// VÁLTOZÁS v6-hoz képest: Emelőmotor 3 (EM3) állapotgép hozzáadva
// Az "Automatika" DB-ben tárolt állapot (visszafelé kompatibilis!)
//
// Szükséges új tagek az "Automatika" DB-ben:
// EM3_aktiv : Bool = FALSE (HMI-ről kapcsolható, ha FALSE → v6 logika)
// EM3_allapat : DInt = 0 (0=Z-fent vár, 1=Z-lentibe, 2=Z-lent/tölt, 3=Z-fentibe)
// EM3_Z_felso : DInt = 10000 (Festo CMMT egység, üveg fogadó pozíció)
// EM3_Z_also : DInt = 5000 (Festo CMMT egység, töltő pozíció)
// EM3_robot_jel : Bool = FALSE (robotkar "kész, beraktam" jele — bekötés Máténak!)
// EM3_Z_ido_ms : DInt = 2000 (mozgás várakozási idő ms-ban)
// EM3_timer : TON (mint Ms_timer — TIA Interface táblában felvenni!)
//
// HMI DB (DB8) tagek — VALÓS NEVEK (Máté exportja alapján):
// "Töltő emelőmotor 3 inditás" : Bool → DB8.DBX16.0 (már létezik!)
// "Töltő emelőmotor 3 Magasság" : DInt → DB8.DBD18.0 (már létezik!)
// "Töltő emelőmotor 3 Gyorsaság": DInt → DB8.DBD22.0 (opcionális, alapértelmezett 70)
// ============================================================
// EMELŐMOTOR 3 — Állapotgép (csak ha EM3_aktiv = TRUE)
// ============================================================
IF "Automatika".EM3_aktiv THEN
CASE "Automatika".EM3_allapat OF
0: // Z-FENT VÁR — EM3 fogadó pozícióban, vár a robotkar jelre
"HMI"."Töltő emelőmotor 3 Magasság" := "Automatika".EM3_Z_felso;
"HMI"."Töltő emelőmotor 3 inditás" := TRUE;
"Automatika".EM3_timer(IN := FALSE, PT := T#0MS); // timer reset
// Robotkar jel érkezik → EM3 indul le
IF "Automatika".EM3_robot_jel THEN
"Automatika".EM3_allapat := 1;
"Automatika".EM3_robot_jel := FALSE; // v8: jel reset — megkaptuk, emelő elindul lefele
END_IF;
1: // Z-LENTIBE MEGY — EM3 süllyedés töltő pozícióba
"HMI"."Töltő emelőmotor 3 Magasság" := "Automatika".EM3_Z_also;
"HMI"."Töltő emelőmotor 3 inditás" := TRUE;
"Automatika".EM3_timer(
IN := TRUE,
PT := DINT_TO_TIME("Automatika".EM3_Z_ido_ms)
);
// Timer lejárt → Z-lent pozícióban van, töltés engedélyezve
IF "Automatika".EM3_timer.Q THEN
"Automatika".EM3_allapat := 2;
"Automatika".EM3_timer(IN := FALSE, PT := T#0MS);
END_IF;
2: // Z-LENT / TÖLTÉS — töltés folyik (FC5 logika kezeli)
"HMI"."Töltő emelőmotor 3 Magasság" := "Automatika".EM3_Z_also;
"HMI"."Töltő emelőmotor 3 inditás" := TRUE;
// Töltés kész → EM3 indul fel
IF "Automatika".toltes_kesz THEN
"Automatika".EM3_allapat := 3;
"Automatika".EM3_timer(IN := FALSE, PT := T#0MS);
END_IF;
3: // Z-FENTIBE MEGY — üveg elmehet, emelkedés fogadó pozícióba
"HMI"."Töltő emelőmotor 3 Magasság" := "Automatika".EM3_Z_felso;
"HMI"."Töltő emelőmotor 3 inditás" := TRUE;
"Automatika".EM3_timer(
IN := TRUE,
PT := DINT_TO_TIME("Automatika".EM3_Z_ido_ms)
);
// Timer lejárt → visszaállt Z-fentbe, ciklus indul újra
IF "Automatika".EM3_timer.Q THEN
"Automatika".EM3_allapat := 0;
"Automatika".EM3_timer(IN := FALSE, PT := T#0MS);
"Automatika".toltes_kesz := FALSE; // üveg mehet
END_IF;
END_CASE;
END_IF;
// ============================================================
// FC5 v6 — EREDETI KÓD (változtatás nélkül)
// ============================================================
#t_most := RUNTIME("Automatika".runtime_mem);
"Automatika".debug_t_delta_ms := LREAL_TO_REAL(#t_most * 1000.0);
#nyomas_raw_int := "HMI"."Nyomásmérő töltőfej 1";
#nyomas_bar := DINT_TO_REAL(#nyomas_raw_int) * 0.001;
IF #nyomas_bar < 0.0 THEN
#nyomas_bar := 0.0;
END_IF;
#cel_ml := DINT_TO_REAL("Automatika".ml_celmennyiseg);
#aktiv_r2 := ("Automatika".Aktiv_rendszer = 2);
// --- FULL AUTO: Set nyomás és tartályszelep kezelés ---
IF "Automatika".Full_auto AND NOT "Automatika".toltes_fut THEN
IF #cel_ml <= 150.0 THEN
"Automatika".Set_nyomas_bar := 0.1;
// 150 ml felett: Set_nyomas_bar-t a HMI állítja be, FC5 nem írja felül
END_IF;
IF #cel_ml <= 150.0
AND #nyomas_bar > 0.1
AND NOT "Automatika".nyomas_csökkentes_kesz THEN
"Automatika".nyomas_csökkentes_fut := TRUE;
"HMI"."Tartály1_szelep" := TRUE;
END_IF;
IF "Automatika".nyomas_csökkentes_fut AND #nyomas_bar < 0.1 THEN
"HMI"."Tartály1_szelep" := FALSE;
"Automatika".nyomas_csökkentes_fut := FALSE;
"Automatika".nyomas_csökkentes_kesz := TRUE;
END_IF;
END_IF;
IF #cel_ml > 150.0 THEN
"Automatika".nyomas_csökkentes_kesz := FALSE;
END_IF;
// --- Nyomás tartomány és K konstans ---
IF "Automatika".Full_auto AND #cel_ml <= 150.0 THEN
IF #nyomas_bar > 0.0 THEN
#k_konstans := "Automatika".K_kis;
#nyomas_ok := TRUE;
ELSE
#k_konstans := 0.0;
#nyomas_ok := FALSE;
END_IF;
ELSIF #nyomas_bar < 0.04 THEN
#k_konstans := 0.0;
#nyomas_ok := FALSE;
ELSIF #nyomas_bar < 0.40 THEN
#k_konstans := "Automatika".K_kis;
#nyomas_ok := (#cel_ml <= 150.0);
ELSE
#k_konstans := "Automatika".K_nagy;
#nyomas_ok := (#cel_ml > 150.0);
END_IF;
IF NOT #aktiv_r2 THEN
#uveg_van := "HMI"."Érzékelő töltőfej 1 inditáshoz";
ELSE
#uveg_van := "HMI"."Érzékelő töltőfej 2 inditásához";
END_IF;
IF NOT "Automatika".toltes_fut THEN
IF NOT #aktiv_r2 THEN
"HMI"."Membránszivattyú 1 bekapcsolás" :=
(#nyomas_bar < "Automatika".Set_nyomas_bar)
AND "HMI"."Tartály 1 alsó szint felett";
"HMI"."Membránszivattyú 2 bekapcsolás" := FALSE;
ELSE
"HMI"."Membránszivattyú 2 bekapcsolás" :=
(#nyomas_bar < "Automatika".Set_nyomas_bar)
AND "HMI"."Tartály 2 alsó szint felett";
"HMI"."Membránszivattyú 1 bekapcsolás" := FALSE;
END_IF;
END_IF;
// --- Auto töltésindítás ---
// v7 MÓDOSÍTÁS: ha EM3 aktív → töltés csak EM3_allapat=2 esetén indul!
IF "Automatika".Auto_uzemmód AND #uveg_van
AND "Automatika".Töltés_aktív
AND NOT "Automatika".toltes_fut
AND NOT "Automatika".toltes_kesz
AND NOT "Automatika".nyomas_csökkentes_fut
AND #cel_ml > 0.0 AND #k_konstans > 0.0
AND (NOT "Automatika".EM3_aktiv OR "Automatika".EM3_allapat = 2) THEN
IF #nyomas_ok THEN
"Automatika".toltes_fut := TRUE;
"Automatika".toltes_kesz := FALSE;
"Automatika".hiba_flag := FALSE;
"Automatika".nyomas_integral := 0.0;
"Automatika".becsult_ml := 0.0;
"Automatika".Töltés_aktív := FALSE;
"Automatika".Toltes_ido_ms := 0;
"Automatika".Ciklus_szam := 0;
"Automatika".Atlag_nyomas := 0.0;
"Automatika".Aktiv_K := #k_konstans;
IF NOT #aktiv_r2 THEN
"HMI"."Töltőfej 1 bekapcsolás" := TRUE;
ELSE
"HMI"."Töltőfej 2 bekapcsolás" := TRUE;
END_IF;
"HMI"."Töltő teszt" := TRUE;
ELSE
"Automatika".hiba_flag := TRUE;
END_IF;
END_IF;
IF "Automatika".toltes_fut AND NOT "Automatika".Ms_uzemmód THEN
#t_delta_ms := LREAL_TO_REAL(#t_most * 1000.0);
IF #t_delta_ms < 0.0 OR #t_delta_ms > 500.0 THEN
#t_delta_ms := 50.0;
END_IF;
IF #nyomas_raw_int > 0 THEN
#sqrt_raw := SQRT(DINT_TO_REAL(#nyomas_raw_int));
"Automatika".nyomas_integral :=
"Automatika".nyomas_integral + (#sqrt_raw * #t_delta_ms);
END_IF;
"Automatika".becsult_ml := "Automatika".Aktiv_K * "Automatika".nyomas_integral;
"Automatika".Ciklus_szam := "Automatika".Ciklus_szam + 1;
"Automatika".Toltes_ido_ms := "Automatika".Ciklus_szam * 50;
"Automatika".Atlag_nyomas :=
"Automatika".Atlag_nyomas +
(#nyomas_bar - "Automatika".Atlag_nyomas) /
DINT_TO_REAL("Automatika".Ciklus_szam);
IF "Automatika".becsult_ml >= #cel_ml THEN
"HMI"."Töltő teszt" := FALSE;
"HMI"."Töltőfej 1 bekapcsolás" := FALSE;
"HMI"."Töltőfej 2 bekapcsolás" := FALSE;
"Automatika".toltes_fut := FALSE;
"Automatika".toltes_kesz := TRUE;
"Automatika"."Töltés_aktív" := FALSE;
END_IF;
END_IF;
IF "Automatika".Ms_uzemmód AND #uveg_van
AND "Automatika".Töltés_aktív
AND NOT "Automatika".toltes_fut
AND NOT "Automatika".toltes_kesz
AND "Automatika".Toltes_ms > 0 THEN
"Automatika".Töltés_aktív := FALSE;
"Automatika".toltes_fut := TRUE;
"Automatika".toltes_kesz := FALSE;
"Automatika".hiba_flag := FALSE;
"Automatika".nyomas_integral := 0.0;
"Automatika".becsult_ml := 0.0;
"Automatika".Ms_timer(IN := FALSE,
PT := T#0MS);
"Automatika".Ms_timer(IN := TRUE,
PT := DINT_TO_TIME("Automatika".Toltes_ms));
IF NOT #aktiv_r2 THEN
"HMI"."Töltőfej 1 bekapcsolás" := TRUE;
ELSE
"HMI"."Töltőfej 2 bekapcsolás" := TRUE;
END_IF;
"HMI"."Töltő teszt" := TRUE;
END_IF;
IF "Automatika".toltes_fut AND "Automatika".Ms_uzemmód THEN
"Automatika".Ms_timer(IN := TRUE,
PT := DINT_TO_TIME("Automatika".Toltes_ms));
"Automatika".Ciklus_szam := "Automatika".Ciklus_szam + 1;
"Automatika".Atlag_nyomas :=
"Automatika".Atlag_nyomas +
(#nyomas_bar - "Automatika".Atlag_nyomas) /
DINT_TO_REAL("Automatika".Ciklus_szam);
IF "Automatika".Ms_timer.Q THEN
"Automatika".Toltes_ido_ms := "Automatika".Toltes_ms;
"HMI"."Töltő teszt" := FALSE;
"HMI"."Töltőfej 1 bekapcsolás" := FALSE;
"HMI"."Töltőfej 2 bekapcsolás" := FALSE;
"Automatika".toltes_fut := FALSE;
"Automatika".toltes_kesz := TRUE;
"Automatika"."Töltés_aktív" := FALSE;
"Automatika".Ms_timer(IN := FALSE,
PT := DINT_TO_TIME("Automatika".Toltes_ms));
END_IF;
END_IF;
IF NOT "Automatika".Auto_uzemmód AND NOT "Automatika".Ms_uzemmód THEN
"Automatika".toltes_kesz := FALSE;
"Automatika".hiba_flag := FALSE;
"HMI"."Töltő teszt" := FALSE;
"HMI"."Töltőfej 1 bekapcsolás" := FALSE;
"HMI"."Töltőfej 2 bekapcsolás" := FALSE;
"Automatika"."Töltés_aktív" := FALSE;
END_IF;
IF "Automatika".toltes_kesz AND NOT #uveg_van THEN
"Automatika".toltes_kesz := FALSE;
END_IF;