Menü
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 = FALSEpontosan 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;