Menü
Vissza

Fb Toltes Auto

FB_Toltes_Auto — Paraméteres töltőrendszer

Verzió: v1.1 (2026-07-21) | OB30, 50ms ciklus | State machine: VAR → Z_LE → TÖLTÉS → Z_FEL → KÉSZ


⚠️ TIA Portal import instrukció

FONTOS: Az alábbi kódot NEM kell egészben beilleszteni!

1. lépés — Új FB létrehozása TIA-ban

  • Project tree → Program blocks → Add new block → Function Block
  • Név: FB_Toltes_Auto (vagy Töltés_Auto)
  • Language: SCL
  • OK

2. lépés — Interface táblában definiálni a változókat

Az FB megnyitásakor a kódszerkesztő FÖLÖTT van az Interface tábla. Ide kell beírni:

Input: | Neve | Típus | Default | |------|-------|---------| | Rendszer | Int | 1 | | Cel_ml | Real | 0.0 | | Set_nyomas_bar | Real | 1.0 | | Z_felso | DInt | 0 | | Z_also | DInt | 0 | | Indit | Bool | — | | Z_ido_ms | DInt | 2000 |

Output: | Neve | Típus | |------|-------| | Toltes_var | Bool | | Toltes_kesz | Bool | | Hiba | Bool |

Static (VAR): | Neve | Típus | Default | |------|-------|---------| | Allapat | Int | 0 | | indit_prev | Bool | — | | aktiv_r2 | Bool | — | | nyomas_integral | Real | — | | becsult_ml | Real | — | | Aktiv_K | Real | — | | Ciklus_szam | DInt | — | | Toltes_ido_ms_int | DInt | — | | Atlag_nyomas | Real | — | | Z_timer | TON | — |

Temp (VAR_TEMP): | Neve | Típus | |------|-------| | nyomas_raw_int | DInt | | nyomas_bar | Real | | uveg_van | Bool | | k_konstans | Real | | nyomas_ok | Bool | | t_most | LReal | | t_delta_ms | Real | | sqrt_raw | Real |

3. lépés — HMI DB-be felvenni 2 új taget

Máté: a HMI DB-be (DB8) fel kell venni: - Emelőmotor 3 indításBool → DB8.DBX16.0 - Emelőmotor 3 magasságDInt → DB8.DBD18

(Ha más névvel már létezik, azt kell használni a kódban.)

4. lépés — Csak a kód törzsét illeszteni be

A kódszerkesztőbe (az interface tábla ALÁ) csak ezt illeszd be:


Kód törzs (ez megy a TIA kódszerkesztőbe)

// ============================================================
// FB_Toltes_Auto — törzs kód (TIA Portal SCL FB)
// Interface változók: ld. fent (Rendszer, Cel_ml, Z_felso, stb.)
// ============================================================

// --- KÖZÖS MÉRÉSEK ---
#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;

#aktiv_r2 := (#Rendszer = 2);
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;

// K konstans
IF #nyomas_bar < 0.04 THEN
    #k_konstans := 0.0;
    #nyomas_ok  := FALSE;
ELSIF #nyomas_bar < 0.80 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;

// --- SZIVATTYÚ VEZÉRLÉS (töltésen kívül) ---
IF #Allapat < 2 THEN
    IF NOT #aktiv_r2 THEN
        "HMI"."Membránszivattyú 1 bekapcsolás" :=
            (#nyomas_bar < #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 < #Set_nyomas_bar)
            AND "HMI"."Tartály 2 alsó szint felett";
        "HMI"."Membránszivattyú 1 bekapcsolás" := FALSE;
    END_IF;
END_IF;

// --- STATE MACHINE ---
CASE #Allapat OF

    0:  // TÖLTÉSRE VÁR (Z fent)
        #Toltes_var  := TRUE;
        #Toltes_kesz := FALSE;
        #Hiba        := FALSE;
        "HMI"."Töltő teszt"            := FALSE;
        "HMI"."Töltőfej 1 bekapcsolás" := FALSE;
        "HMI"."Töltőfej 2 bekapcsolás" := FALSE;
        "HMI"."Emelőmotor 3 magasság"  := #Z_felso;

        IF #Indit AND NOT #indit_prev AND #uveg_van
            AND #Cel_ml > 0.0 AND #k_konstans > 0.0 THEN
            IF #nyomas_ok THEN
                #Toltes_var := FALSE;
                #Allapat    := 1;
            ELSE
                #Hiba := TRUE;
            END_IF;
        END_IF;

    1:  // Z LEFELÉ
        "HMI"."Emelőmotor 3 magasság" := #Z_also;
        "HMI"."Emelőmotor 3 indítás"  := TRUE;
        #Z_timer(IN := TRUE, PT := DINT_TO_TIME(#Z_ido_ms));
        IF #Z_timer.Q THEN
            #Z_timer(IN := FALSE, PT := DINT_TO_TIME(#Z_ido_ms));
            #nyomas_integral   := 0.0;
            #becsult_ml        := 0.0;
            #Ciklus_szam       := 0;
            #Toltes_ido_ms_int := 0;
            #Atlag_nyomas      := 0.0;
            #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;
            "Automatika".toltes_fut   := TRUE;
            "Automatika".toltes_kesz  := FALSE;
            "Automatika".Aktiv_K      := #Aktiv_K;
            "Automatika".Töltés_aktív := FALSE;
            #Allapat := 2;
        END_IF;

    2:  // TÖLTÉS
        #t_most := RUNTIME("Automatika".runtime_mem);
        #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));
            #nyomas_integral := #nyomas_integral + (#sqrt_raw * #t_delta_ms);
        END_IF;
        #becsult_ml        := #Aktiv_K * #nyomas_integral;
        #Ciklus_szam       := #Ciklus_szam + 1;
        #Toltes_ido_ms_int := #Ciklus_szam * 50;
        #Atlag_nyomas      := #Atlag_nyomas +
            (#nyomas_bar - #Atlag_nyomas) / DINT_TO_REAL(#Ciklus_szam);
        "Automatika".nyomas_integral := #nyomas_integral;
        "Automatika".becsult_ml      := #becsult_ml;
        "Automatika".Ciklus_szam     := #Ciklus_szam;
        "Automatika".Toltes_ido_ms   := #Toltes_ido_ms_int;
        "Automatika".Atlag_nyomas    := #Atlag_nyomas;
        IF #becsult_ml >= #Cel_ml THEN
            "HMI"."Töltőfej 1 bekapcsolás" := FALSE;
            "HMI"."Töltőfej 2 bekapcsolás" := FALSE;
            "HMI"."Töltő teszt"            := FALSE;
            "Automatika".toltes_fut        := FALSE;
            #Allapat := 3;
        END_IF;

    3:  // Z FELFELÉ
        "HMI"."Emelőmotor 3 magasság" := #Z_felso;
        #Z_timer(IN := TRUE, PT := DINT_TO_TIME(#Z_ido_ms));
        IF #Z_timer.Q THEN
            #Z_timer(IN := FALSE, PT := DINT_TO_TIME(#Z_ido_ms));
            "HMI"."Emelőmotor 3 indítás" := FALSE;
            "Automatika".toltes_kesz     := TRUE;
            #Toltes_kesz                 := TRUE;
            #Allapat                     := 4;
        END_IF;

    4:  // KÉSZ
        #Toltes_kesz := TRUE;
        IF NOT #uveg_van THEN
            #Toltes_kesz             := FALSE;
            "Automatika".toltes_kesz := FALSE;
            #Allapat                 := 0;
        END_IF;

END_CASE;

// Él memória
#indit_prev := #Indit;