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(vagyTö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ás → Bool → DB8.DBX16.0
- Emelőmotor 3 magasság → DInt → 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;