16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-09-01 15:09:18 +02:00
Files
maszyna/McZapkie/hamulce.pas
firleju c84bf7319b 1. Poprawione asynchrony.
2. Możliwość zdefiniowania koloru tła ekranu ładowania w eu07.ini.
3. Dodanie logowania ruchu ramek WM_COPYDATA do oddzielnego pliku.
4. Dodana ramka skrócona aktywnych AI.
5. Dodana ramka sterowania uszkodzeniami pojazdów.
6. Dodanie kręciołka od świateł (w tym trakcja wielokrotna).
7. Rozbudowa asynchronów, m.in. tempomat, zadawanie siły (w kN), przeciwpoślizg, czyste ED itd.
8. Dodanie animacji drtzwi odskokowo-przesuwnych.
9. Dodanie możliwości uszkadzania pojazdów (EN57).
10. Uruchomienie sprzęgu WN, zwłaszcza w asynchronach - do przejrzenia logowanie braków napięcia.
11. Wyłączanie radiostopu przez wyłączanie radia, a nie przez ruch zaworem maszynisty.
12. Usunięcie wyłącznika ciśnieniowego w EN57 (proteza, trzeba zrobić wpis na to).
13. Wstępna wersja hamowania rekuperacyjnego wraz z przechodzeniem na hamowanie oporowe.
14. Cała masa nowych zmiennych stanu dostępna dla ekranu (Pythona).
15. Nowa stara smuga z dawnego SPKSu.
16. Inne, które mogłem zapomnieć lub nie uszczegółowić.
17. Poprawione wyświetlanie haslera
2016-01-28 22:47:40 +01:00

3049 lines
75 KiB
ObjectPascal
Raw Blame History

unit hamulce; {fizyka hamulcow dla symulatora}
(*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*)
(*
MaSzyna EU07 - SPKS
Brakes.
Copyright (C) 2007-2014 Maciej Cierniak
*)
(*
(C) youBy
Co brakuje:
moze jeszcze jakis SW
*)
(*
Zrobione:
ESt3, ESt3AL2, ESt4R, LSt, FV4a, FD1, EP2, prosty westinghouse
duzo wersji żeliwa
KE
Tarcze od 152A
Magnetyki (implementacja w mover.pas)
Matrosow 394
H14K1 (zasadniczy), H1405 (pomocniczy), St113 (ep)
Knorr/West EP - żeby był
*)
interface
uses mctools,sysutils,friction;
CONST
LocalBrakePosNo=10; {ilosc nastaw hamulca recznego lub pomocniczego}
MainBrakeMaxPos=10; {max. ilosc nastaw hamulca zasadniczego}
{nastawy hamulca}
bdelay_G=1; //G
bdelay_P=2; //P
bdelay_R=4; //R
bdelay_M=8; //Mg
bdelay_GR=128; //G-R
{stan hamulca}
b_off = 0; //luzowanie
b_hld = 1; //trzymanie
b_on = 2; //napelnianie
b_rfl = 4; //uzupelnianie
b_rls = 8; //odluzniacz
b_ep = 16; //elektropneumatyczny
b_asb = 32; //elektropneumatyczny
b_dmg =128; //wylaczony z dzialania
{uszkodzenia hamulca}
df_on = 1; //napelnianie
df_off = 2; //luzowanie
df_br = 4; //wyplyw z ZP
df_vv = 8; //wyplyw z komory wstepnej
df_bc = 16; //wyplyw z silownika
df_cv = 32; //wyplyw z ZS
df_PP = 64; //zawsze niski stopien
df_RR =128; //zawsze wysoki stopien
{indeksy dzwiekow FV4a}
s_fv4a_b = 0; //hamowanie
s_fv4a_u = 1; //luzowanie
s_fv4a_e = 2; //hamowanie nagle
s_fv4a_x = 3; //wyplyw sterujacego fala
s_fv4a_t = 4; //wyplyw z czasowego
{pary cierne}
bp_P10 = 0;
bp_P10Bg = 2; //żeliwo fosforowe P10
bp_P10Bgu = 1;
bp_LLBg = 4; //komp. b.n.t.
bp_LLBgu = 3;
bp_LBg = 6; //komp. n.t.
bp_LBgu = 5;
bp_KBg = 8; //komp. w.t.
bp_KBgu = 7;
bp_D1 = 9; //tarcze
bp_D2 = 10;
bp_FR513 = 11; //Frenoplast FR513
bp_Cosid = 12; //jakistam kompozyt :D
bp_PKPBg = 13; //żeliwo PKP
bp_PKPBgu = 14;
bp_MHS = 128; //magnetyczny hamulec szynowy
bp_P10yBg = 15; //żeliwo fosforowe P10
bp_P10yBgu= 16;
bp_FR510 = 17; //Frenoplast FR510
sf_Acc = 1; //przyspieszacz
sf_BR = 2; //przekladnia
sf_CylB = 4; //cylinder - napelnianie
sf_CylU = 8; //cylinder - oproznianie
sf_rel = 16; //odluzniacz
sf_ep = 32; //zawory ep
bh_MIN= 0; //minimalna pozycja
bh_MAX= 1; //maksymalna pozycja
bh_FS = 2; //napelnianie uderzeniowe //jesli nie ma, to jazda
bh_RP = 3; //jazda
bh_NP = 4; //odciecie - podwojna trakcja
bh_MB = 5; //odciecie - utrzymanie stopnia hamowania/pierwszy 1 stopien hamowania
bh_FB = 6; //pelne
bh_EB = 7; //nagle
bh_EPR= 8; //ep - luzowanie //pelny luz dla ep kštowego
bh_EPN= 9; //ep - utrzymanie //jesli rowne luzowaniu, wtedy sterowanie przyciskiem
bh_EPB=10; //ep - hamowanie //pelne hamowanie dla ep kštowego
SpgD=0.7917;
SpO=0.5067; //przekroj przewodu 1" w l/m
//wyj: jednostka dosyc dziwna, ale wszystkie obliczenia
//i pojemnosci sa podane w litrach (rozsadne wielkosci)
//zas dlugosc pojazdow jest podana w metrach
//a predkosc przeplywu w m/s //3.5
//7//1.5
// BPT: array[-2..6] of array [0..1] of real= ((0, 5.0), (14, 5.4), (9, 5.0), (6, 4.6), (9, 4.5), (9, 4.0), (9, 3.5), (9, 2.8), (34, 2.8));
// BPT: array[-2..6] of array [0..1] of real= ((0, 5.0), (7, 5.0), (2.0, 5.0), (4.5, 4.6), (4.5, 4.2), (4.5, 3.8), (4.5, 3.4), (4.5, 2.8), (8, 2.8));
BPT: array[-2..6] of array [0..1] of real= ((0, 5.0), (7, 5.0), (2.0, 5.0), (4.5, 4.6), (4.5, 4.2), (4.5, 3.8), (4.5, 3.4), (4.5, 2.8), (8, 2.8));
BPT_394: array[-1..5] of array [0..1] of real= ((13, 10.0), (5, 5.0), (0, -1), (5, -1), (5, 0.0), (5, 0.0), (18, 0.0));
// BPT: array[-2..6] of array [0..1] of real= ((0, 5.0), (12, 5.4), (9, 5.0), (9, 4.6), (9, 4.2), (9, 3.8), (9, 3.4), (9, 2.8), (34, 2.8));
// BPT: array[-2..6] of array [0..1] of real= ((0, 0),(0, 0),(0, 0),(0, 0),(0, 0),(0, 0),(0, 0),(0, 0),(0, 0));
i_bcpno= 6;
TYPE
//klasa obejmujaca pojedyncze zbiorniki
TReservoir= class
protected
Cap: real;
Vol: real;
dVol: real;
public
constructor Create;
procedure CreateCap(Capacity: real);
procedure CreatePress(Press: real);
function pa: real; virtual;
function P: real; virtual;
procedure Flow(dv: real);
procedure Act;
end;
PReservoir=^TReservoir;
TBrakeCyl= class(TReservoir)
public
function pa: real; override;
function P: real; override;
end;
//klasa obejmujaca uklad hamulca zespolonego pojazdu
TBrake= class
protected
BrakeCyl: TReservoir; //silownik
BrakeRes: TReservoir; //ZP
ValveRes: TReservoir; //komora wstepna
BCN: byte; //ilosc silownikow
BCM: real; //przekladnia hamulcowa
BCA: real; //laczny przekroj silownikow
BrakeDelays: byte; //dostepne opoznienia
BrakeDelayFlag: byte; //aktualna nastawa
FM: TFricMat; //material cierny
MaxBP: real; //najwyzsze cisnienie
BA: byte; //osie hamowane
NBpA: byte; //klocki na os
SizeBR: real; //rozmiar^2 ZP (w stosunku do 14")
SizeBC: real; //rozmiar^2 CH (w stosunku do 14")
DCV: boolean; //podwojny zawor zwrotny
ASBP: real; //cisnienie hamulca pp
BrakeStatus: byte; //flaga stanu
SoundFlag: byte;
public
constructor Create(i_mbp, i_bcr, i_bcd, i_brc: real;
i_bcn, i_BD, i_mat, i_ba, i_nbpa: byte);
//maksymalne cisnienie, promien, skok roboczy, pojemnosc ZP;
//ilosc cylindrow, opoznienia hamulca, material klockow, osie hamowane, klocki na os;
function GetFC(Vel, N: real): real; virtual; //wspolczynnik tarcia - hamulec wie lepiej
function GetPF(PP, dt, Vel: real): real; virtual; //przeplyw miedzy komora wstepna i PG
function GetBCF: real; //sila tlokowa z tloka
function GetHPFlow(HP, dt: real): real; virtual; //przeplyw - 8 bar
function GetBCP: real; virtual; //cisnienie cylindrow hamulcowych
function GetBRP: real; //cisnienie zbiornika pomocniczego
function GetVRP: real; //cisnienie komory wstepnej rozdzielacza
function GetCRP: real; virtual; //cisnienie zbiornika sterujacego
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); virtual; //inicjalizacja hamulca
function SetBDF(nBDF: byte): boolean; //nastawiacz GPRM
procedure Releaser(state: byte); //odluzniacz
procedure SetEPS(nEPS:real); virtual;//hamulec EP
procedure ASB(state: byte); //hamulec przeciwposlizgowy
function GetStatus(): byte; //flaga statusu, moze sie przydac do odglosow
procedure SetASBP(press: real); //ustalenie cisnienia pp
procedure ForceEmptiness(); virtual;
function GetSoundFlag: byte;
// procedure
end;
TWest= class(TBrake)
private
LBP: real; //cisnienie hamulca pomocniczego
dVP: real; //pobor powietrza wysokiego cisnienia
EPS: real; //stan elektropneumatyka
TareM, LoadM: real; //masa proznego i pelnego
TareBP: real; //cisnienie dla proznego
LoadC: real; //wspolczynnik przystawki wazacej
public
procedure SetLBP(P: real); //cisnienie z hamulca pomocniczego
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
function GetHPFlow(HP, dt: real): real; override;
procedure PLC(mass: real); //wspolczynnik cisnienia przystawki wazacej
procedure SetEPS(nEPS: real); override; //stan hamulca EP
procedure SetLP(TM, LM, TBP: real); //parametry przystawki wazacej
end;
TESt= class(TBrake)
private
CntrlRes: TReservoir; //zbiornik sterujšcy
BVM: real; //przelozenie PG-CH
public
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
procedure EStParams(i_crc: real); //parametry charakterystyczne dla ESt
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
function GetCRP: real; override;
procedure CheckState(BCP: real; var dV1: real); //glowny przyrzad rozrzadczy
procedure CheckReleaser(dt: real); //odluzniacz
function CVs(bp: real): real; //napelniacz sterujacego
function BVs(BCP: real): real; //napelniacz pomocniczego
end;
TESt3= class(TESt)
private
CylFlowSpeed: array[0..1] of array [0..1] of real;
public
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
end;
TESt3AL2= class(TESt3)
private
TareM, LoadM: real; //masa proznego i pelnego
TareBP: real; //cisnienie dla proznego
LoadC: real;
public
ImplsRes: TReservoir; //komora impulsowa
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
procedure PLC(mass: real); //wspolczynnik cisnienia przystawki wazacej
procedure SetLP(TM, LM, TBP: real); //parametry przystawki wazacej
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
end;
TESt4R= class(TESt)
private
RapidStatus: boolean;
RapidTemp: real; //akrualne, zmienne przelozenie
public
ImplsRes: TReservoir; //komora impulsowa
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
end;
TLSt= class(TESt4R)
private
CylFlowSpeed: array[0..1] of array [0..1] of real;
LBP: real; //cisnienie hamulca pomocniczego
RM: real; //przelozenie rapida
EDFlag: real; //luzowanie hamulca z powodu zalaczonego ED
public
procedure SetLBP(P: real); //cisnienie z hamulca pomocniczego
procedure SetRM(RMR: real); //ustalenie przelozenia rapida
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
function GetHPFlow(HP, dt: real): real; override; //przeplyw - 8 bar
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
function GetEDBCP: real; virtual; //cisnienie tylko z hamulca zasadniczego, uzywane do hamulca ED w EP09
procedure SetED(EDstate: real); //stan hamulca ED do luzowania
end;
TEStED= class(TLSt) //zawor z EP09 - Est4 z oddzielnym przekladnikiem, kontrola rapidu i takie tam
private
Nozzles: array[0..10] of real; //dysze
Zamykajacy: boolean; //pamiec zaworka zamykajacego
Przys_blok: boolean; //blokada przyspieszacza
Miedzypoj: TReservoir; //pojemnosc posrednia (urojona) do napelniania ZP i ZS
TareM, LoadM: real; //masa proznego i pelnego
TareBP: real; //cisnienie dla proznego
LoadC: real;
public
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
function GetEDBCP: real; override; //cisnienie tylko z hamulca zasadniczego, uzywane do hamulca ED w EP09
procedure PLC(mass: real); //wspolczynnik cisnienia przystawki wazacej
procedure SetLP(TM, LM, TBP: real); //parametry przystawki wazacej
end;
TEStEP2= class(TLSt)
private
TareM, LoadM: real; //masa proznego i pelnego
TareBP: real; //cisnienie dla proznego
LoadC: real;
EPS: real;
public
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override; //inicjalizacja
procedure PLC(mass: real); //wspolczynnik cisnienia przystawki wazacej
procedure SetEPS(nEPS: real); override; //stan hamulca EP
procedure SetLP(TM, LM, TBP: real); //parametry przystawki wazacej
end;
TCV1= class(TBrake)
private
CntrlRes: TReservoir; //zbiornik sterujšcy
BVM: real; //przelozenie PG-CH
public
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
function GetCRP: real; override;
procedure CheckState(BCP: real; var dV1: real);
function CVs(bp: real): real;
function BVs(BCP: real): real;
public
end;
TCV1R= class(TCV1)
private
ImplsRes: TReservoir; //komora impulsowa
RapidStatus: boolean;
public
// function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
// procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
end;
TCV1L_TR= class(TCV1)
private
ImplsRes: TReservoir; //komora impulsowa
LBP: real; //cisnienie hamulca pomocniczego
public
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
procedure SetLBP(P: real); //cisnienie z hamulca pomocniczego
function GetHPFlow(HP, dt: real): real; override; //przeplyw - 8 bar
end;
TKE= class(TBrake) //Knorr Einheitsbauart <20> jeden do wszystkiego
private
RapidStatus: boolean;
ImplsRes: TReservoir; //komora impulsowa
CntrlRes: TReservoir; //zbiornik sterujšcy
Brak2Res: TReservoir; //zbiornik pomocniczy 2
BVM: real; //przelozenie PG-CH
TareM, LoadM: real; //masa proznego i pelnego
TareBP: real; //cisnienie dla proznego
LoadC: real; //wspolczynnik zaladowania
RM: real; //przelozenie rapida
LBP: real; //cisnienie hamulca pomocniczego
public
procedure SetRM(RMR: real); //ustalenie przelozenia rapida
function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
procedure Init(PP, HPP, LPP, BP: real; BDF: byte); override;
function GetHPFlow(HP, dt: real): real; override; //przeplyw - 8 bar
function GetCRP: real; override;
procedure CheckState(BCP: real; var dV1: real);
procedure CheckReleaser(dt: real); //odluzniacz
function CVs(bp: real): real; //napelniacz sterujacego
function BVs(BCP: real): real; //napelniacz pomocniczego
procedure PLC(mass: real); //wspolczynnik cisnienia przystawki wazacej
procedure SetLP(TM, LM, TBP: real); //parametry przystawki wazacej
procedure SetLBP(P: real); //cisnienie z hamulca pomocniczego
end;
//klasa obejmujaca krany
THandle= class
private
// BCP: integer;
public
Time: boolean;
TimeEP: boolean;
Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; virtual;
procedure Init(press: real); virtual;
function GetCP(): real; virtual;
procedure SetReductor(nAdj: real); virtual;
function GetSound(i: byte): real; virtual;
function GetPos(i: byte): real; virtual;
end;
TFV4a= class(THandle)
private
CP, TP, RP: real; //zbiornik sterujšcy, czasowy, redukcyjny
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
procedure Init(press: real); override;
end;
TFV4aM= class(THandle)
private
CP, TP, RP: real; //zbiornik sterujšcy, czasowy, redukcyjny
XP: real; //komora powietrzna w reduktorze <20> jest potrzebna do odwzorowania fali
RedAdj: real; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
// Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
Fala: boolean;
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
procedure Init(press: real); override;
procedure SetReductor(nAdj: real); override;
function GetSound(i: byte): real; override;
function GetPos(i: byte): real; override;
end;
{ FBS2= class(THandle)
private
CP, TP, RP: real; //zbiornik sterujšcy, czasowy, redukcyjny
XP: real; //komora powietrzna w reduktorze <20> jest potrzebna do odwzorowania fali
RedAdj: real; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
// Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
Fala: boolean;
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
procedure Init(press: real); override;
procedure SetReductor(nAdj: real); override;
function GetSound(i: byte): real; override;
function GetPos(i: byte): real; override;
end; }
{ TD2= class(THandle)
private
CP, TP, RP: real; //zbiornik sterujšcy, czasowy, redukcyjny
XP: real; //komora powietrzna w reduktorze <20> jest potrzebna do odwzorowania fali
RedAdj: real; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
// Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
Fala: boolean;
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
procedure Init(press: real); override;
procedure SetReductor(nAdj: real); override;
function GetSound(i: byte): real; override;
function GetPos(i: byte): real; override;
end;}
TM394= class(THandle)
private
CP: real; //zbiornik sterujšcy, czasowy, redukcyjny
RedAdj: real; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
procedure Init(press: real); override;
procedure SetReductor(nAdj: real); override;
function GetCP: real; override;
function GetPos(i: byte): real; override;
end;
TH14K1= class(THandle)
private
CP: real; //zbiornik sterujšcy, czasowy, redukcyjny
RedAdj: real; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
procedure Init(press: real); override;
procedure SetReductor(nAdj: real); override;
function GetCP: real; override;
function GetPos(i: byte): real; override;
end;
TSt113= class(TH14K1)
private
EPS: real;
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
function GetCP: real; override;
function GetPos(i: byte): real; override;
procedure Init(press: real); override;
end;
Ttest= class(THandle)
private
CP: real;
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
procedure Init(press: real); override;
end;
TFD1= class(THandle)
private
MaxBP: real; //najwyzsze cisnienie
BP: real; //aktualne cisnienie
public
Speed: real; //szybkosc dzialania
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
procedure Init(press: real); override;
function GetCP(): real; override;
procedure SetSpeed(nSpeed: real);
// procedure Init(press: real; MaxBP: real); overload;
end;
TH1405= class(THandle)
private
MaxBP: real; //najwyzsze cisnienie
BP: real; //aktualne cisnienie
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
procedure Init(press: real); override;
function GetCP(): real; override;
// procedure Init(press: real; MaxBP: real); overload;
end;
TFVel6= class(THandle)
private
EPS: real;
public
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
function GetCP(): real; override;
function GetPos(i: byte): real; override;
function GetSound(i: byte): real; override;
procedure Init(press: real); override;
end;
function PF(P1,P2,S:real;DP:real = 0.25):real;
function PF1(P1,P2,S:real):real;
function PFVa(PH,PL,S,LIM:real;DP:real = 0.1):real; //zawor napelniajacy z PH do PL, PL do LIM
function PFVd(PH,PL,S,LIM:real;DP:real = 0.1):real; //zawor wypuszczajacy z PH do PL, PH do LIM
implementation
uses _mover;
//---FUNKCJE OGOLNE---
const DPL=0.25;
function PR(p1,p2:real):real;
var ph,pl: real;
begin
ph:=Max0R(p1,p2)+0.1;
pl:=p1+p2-ph+0.2;
PR:=(p2-p1)/(1.13*ph-pl);
end;
function PF_old(P1,P2,S:real):real;
var ph,pl: real;
begin
PH:=Max0R(P1,P2)+1;
PL:=P1+P2-PH+2;
if PH-PL<0.0001 then PF_old:=0 else
if (PH-PL)<0.05 then
PF_old:=20*(PH-PL)*(PH+1)*222*S*(P2-P1)/(1.13*ph-pl)
else
PF_old:=(PH+1)*222*S*(P2-P1)/(1.13*ph-pl);
end;
function PF(P1,P2,S:real;DP:real = 0.25):real;
var ph,pl,sg,fm: real;
begin
PH:=Max0R(P1,P2)+1; //wyzsze cisnienie absolutne
PL:=P1+P2-PH+2; //nizsze cisnienie absolutne
sg:=PL/PH; //bezwymiarowy stosunek cisnien
fm:=PH*197*S*sign(P2-P1); //najwyzszy mozliwy przeplyw, wraz z kierunkiem
if (SG>0.5) then //jesli ponizej stosunku krytycznego
if (PH-PL)<DP then //niewielka roznica cisnien
PF:=(1-sg)/DPL*fm*2*SQRT((DP)*(PH-DP))
// PF:=1/DPL*(PH-PL)*fm*2*SQRT((sg)*(1-sg))
else
PF:=fm*2*SQRT((sg)*(1-sg))
else //powyzej stosunku krytycznego
PF:=fm;
end;
function PF1(P1,P2,S:real):real;
var ph,pl,sg,fm: real;
const DPS=0.001;
begin
PH:=Max0R(P1,P2)+1; //wyzsze cisnienie absolutne
PL:=P1+P2-PH+2; //nizsze cisnienie absolutne
sg:=PL/PH; //bezwymiarowy stosunek cisnien
fm:=PH*197*S*sign(P2-P1); //najwyzszy mozliwy przeplyw, wraz z kierunkiem
if (SG>0.5) then //jesli ponizej stosunku krytycznego
if (SG<DPS) then //niewielka roznica cisnien
PF1:=(1-SG)/DPS*fm*2*SQRT((DPS)*(1-DPS))
else
PF1:=fm*2*SQRT((sg)*(1-sg))
else //powyzej stosunku krytycznego
PF1:=fm;
end;
function PFVa(PH,PL,S,LIM:real;DP:real = 0.1):real; //zawor napelniajacy z PH do PL, PL do LIM
var sg,fm: real;
begin
if LIM>PL then
begin
LIM:=LIM+1;
PH:=PH+1; //wyzsze cisnienie absolutne
PL:=PL+1; //nizsze cisnienie absolutne
sg:=PL/PH; //bezwymiarowy stosunek cisnien
fm:=PH*197*S; //najwyzszy mozliwy przeplyw, wraz z kierunkiem
if (LIM-PL)<DP then fm:=fm*(LIM-PL)/DP; //jesli jestesmy przy nastawieniu, to zawor sie przymyka
if (SG>0.5) then //jesli ponizej stosunku krytycznego
if (PH-PL)<DPL then //niewielka roznica cisnien
PFVa:=(PH-PL)/DPL*fm*2*SQRT((sg)*(1-sg))
else
PFVa:=fm*2*SQRT((sg)*(1-sg))
else //powyzej stosunku krytycznego
PFVa:=fm;
end
else
PFVa:=0;
end;
function PFVd(PH,PL,S,LIM:real;DP:real = 0.1):real; //zawor wypuszczajacy z PH do PL, PH do LIM
var sg,fm: real;
begin
if LIM<PH then
begin
LIM:=LIM+1;
PH:=PH+1; //wyzsze cisnienie absolutne
PL:=PL+1; //nizsze cisnienie absolutne
sg:=PL/PH; //bezwymiarowy stosunek cisnien
fm:=PH*197*S; //najwyzszy mozliwy przeplyw, wraz z kierunkiem
if (PH-LIM)<0.1 then fm:=fm*(PH-LIM)/DP; //jesli jestesmy przy nastawieniu, to zawor sie przymyka
if (SG>0.5) then //jesli ponizej stosunku krytycznego
if (PH-PL)<DPL then //niewielka roznica cisnien
PFVd:=(PH-PL)/DPL*fm*2*SQRT((sg)*(1-sg))
else
PFVd:=fm*2*SQRT((sg)*(1-sg))
else //powyzej stosunku krytycznego
PFVd:=fm;
end
else
PFVd:=0;
end;
//---ZBIORNIKI---
function TReservoir.pa:real;
begin
pa:=0.1*Vol/Cap;
end;
function TReservoir.P:real;
begin
P:=Vol/Cap;
end;
procedure TReservoir.Flow(dv: real);
begin
dVol:=dVol+dv;
end;
constructor TReservoir.Create;
begin
inherited Create;
Cap:=1;
Vol:=0;
end;
procedure TReservoir.Act;
begin
Vol:=Vol+dVol;
dVol:=0;
end;
procedure TReservoir.CreateCap(Capacity:real);
begin
Cap:=Capacity;
end;
procedure TReservoir.CreatePress(Press:real);
begin
Vol:=Cap*Press;
dVol:=0;
end;
//---SILOWNIK---
function TBrakeCyl.pa:real;
//var VtoC: real;
begin
// VtoC:=Vol/Cap;
pa:=P*0.1
end;
(* NOWSZA WERSJA - maksymalne ci<63>nienie to ok. 4,75 bar, co powoduje
// problemy przy rapidzie w lokomotywach, gdyz jest3
// osiagany wierzcholek paraboli
function TBrakeCyl.P:real;
var VtoC: real;
begin
VtoC:=Vol/Cap;
if VtoC<0.06 then P:=VtoC/4
else if VtoC>0.88 then P:=0.5+(VtoC-0.88)*1.043-0.064*(VtoC-0.88)*(VtoC-0.88)
else P:=0.15+0.35/0.82*(VtoC-0.06);
end; *)
//(* STARA WERSJA
function TBrakeCyl.P:real;
var VtoC: real; //stosunek cisnienia do objetosci
const
VS = 0.005;
pS = 0.05;
VD = 1.40;
cD = 1;
pD = VD-cD;
begin
VtoC:=Vol/Cap;
// P:=VtoC;
if VtoC<VS then P:=VtoC*pS/VS //objetosc szkodliwa
else if VtoC>VD then P:=VtoC-cD //caly silownik
else P:=pS+(VtoC-VS)/(VD-VS)*(pD-pS); //wysuwanie tloka
end; //*)
//---HAMULEC---
(*
constructor TBrake.Create(i_mbp, i_bcr, i_bcd, i_brc: real; i_bcn, i_BD, i_mat, i_ba, i_nbpa: byte);
begin
inherited Create;
MaxBP:=i_mbp;
BCN:=i_bcn;
BCA:=i_bcn*i_bcr*i_bcr*pi;
BA:=i_ba;
NBpA:=i_nbpa;
BrakeDelays:=i_BD;
//tworzenie zbiornikow
BrakeCyl.CreateCap(i_bcd*BCA*1000);
BrakeRes.CreateCap(i_brc);
ValveRes.CreateCap(0.2);
// FM.Free;
//materialy cierne
case i_mat of
bp_P10Bg: FM:=TP10Bg.Create;
bp_P10Bgu: FM:=TP10Bgu.Create;
else //domyslnie
FM:=TP10.Create;
end;
end ; *)
constructor TBrake.Create(i_mbp, i_bcr, i_bcd, i_brc: real; i_bcn, i_BD, i_mat, i_ba, i_nbpa: byte);
begin
inherited Create;
MaxBP:=i_mbp;
BCN:=i_bcn;
BCA:=i_bcn*i_bcr*i_bcr*pi;
BA:=i_ba;
NBpA:=i_nbpa;
BrakeDelays:=i_BD;
//210.88
// SizeBR:=i_bcn*i_bcr*i_bcr*i_bcd*40.17*MaxBP/(5-MaxBP); //objetosc ZP w stosunku do cylindra 14" i cisnienia 4.2 atm
SizeBR:=i_brc*0.0128;
SizeBC:=i_bcn*i_bcr*i_bcr*i_bcd*210.88*MaxBP/4.2; //objetosc CH w stosunku do cylindra 14" i cisnienia 4.2 atm
// BrakeCyl:=TReservoir.Create;
BrakeCyl:=TBrakeCyl.Create;
BrakeRes:=TReservoir.Create;
ValveRes:=TReservoir.Create;
//tworzenie zbiornikow
BrakeCyl.CreateCap(i_bcd*BCA*1000);
BrakeRes.CreateCap(i_brc);
ValveRes.CreateCap(0.25);
// FM.Free;
//materialy cierne
i_mat:=i_mat and (255-bp_MHS);
case i_mat of
bp_P10Bg: FM:=TP10Bg.Create;
bp_P10Bgu: FM:=TP10Bgu.Create;
bp_FR513: FM:=TFR513.Create;
bp_FR510: FM:=TFR510.Create;
bp_Cosid: FM:=TCosid.Create;
bp_P10yBg: FM:=TP10yBg.Create;
bp_P10yBgu: FM:=TP10yBgu.Create;
bp_D1: FM:=TDisk1.Create;
bp_D2: FM:=TDisk2.Create;
else //domyslnie
FM:=TP10.Create;
end;
end;
//inicjalizacja hamulca (stan poczatkowy)
procedure TBrake.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
end;
//pobranie wspolczynnika tarcia materialu
function TBrake.GetFC(Vel, N: real): real;
begin
GetFC:=FM.GetFC(N, Vel);
end;
//cisnienie cylindra hamulcowego
function TBrake.GetBCP: real;
begin
GetBCP:=BrakeCyl.P;
end;
//cisnienie zbiornika pomocniczego
function TBrake.GetBRP: real;
begin
GetBRP:=BrakeRes.P;
end;
//cisnienie komory wstepnej
function TBrake.GetVRP: real;
begin
GetVRP:=ValveRes.P;
end;
//cisnienie zbiornika sterujacego
function TBrake.GetCRP: real;
begin
GetCRP:=0;
end;
//przeplyw z przewodu glowneg
function TBrake.GetPF(PP, dt, Vel: real): real;
begin
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
GetPF:=0;
end;
//przeplyw z przewodu zasilajacego
function TBrake.GetHPFlow(HP, dt: real): real;
begin
GetHPFlow:=0;
end;
function TBrake.GetBCF: real;
begin
GetBCF:=BCA*100*BrakeCyl.P;
end;
function TBrake.SetBDF(nBDF: byte): boolean;
begin
if ((nBDF and BrakeDelays)=nBDF)and(nBDF<>BrakeDelayFlag) then
begin
BrakeDelayFlag:=nBDF;
SetBDF:=true;
end
else
SetBDF:=false;
end;
procedure TBrake.Releaser(state: byte);
begin
BrakeStatus:=(BrakeStatus and 247) or state*b_rls;
end;
procedure TBrake.SetEPS(nEPS: real);
begin
end;
procedure TBrake.ASB(state: byte);
begin //255-b_asb(32)
BrakeStatus:=(BrakeStatus and 223) or state*b_asb;
end;
function TBrake.GetStatus(): byte;
begin
GetStatus:=BrakeStatus;
end;
function TBrake.GetSoundFlag: byte;
begin
GetSoundFlag:=SoundFlag;
SoundFlag:=0;
end;
procedure TBrake.SetASBP(press: real);
begin
ASBP:=press;
end;
procedure TBrake.ForceEmptiness();
begin
ValveRes.CreatePress(0);
BrakeRes.CreatePress(0);
ValveRes.Act();
BrakeRes.Act();
end;
//---WESTINGHOUSE---
procedure TWest.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
ValveRes.CreatePress(PP);
BrakeCyl.CreatePress(BP);
BrakeRes.CreatePress(PP/2+HPP/2);
// BrakeStatus:=3*Byte(BP>0.1);
end;
function TWest.GetPF(PP, dt, Vel: real): real;
var dv, dv1:real;
VVP, BVP, CVP, BCP: real;
temp: real;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
CVP:=BrakeCyl.P;
BCP:=BrakeCyl.P;
if (BrakeStatus and 1)=1 then
if(VVP+0.03<BVP)then
BrakeStatus:=(BrakeStatus or 2)
else if(VVP>BVP+0.1) then
BrakeStatus:=(BrakeStatus and 252)
else if(VVP>BVP) then
BrakeStatus:=(BrakeStatus and 253)
else
else
if(VVP+0.25<BVP) then
BrakeStatus:=(BrakeStatus or 3);
if((BrakeStatus and b_hld)=b_off) and (not DCV) then
dV:=PF(0,CVP,0.0068*sizeBC)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
if(BCP>LBP+0.01) and (DCV) then
dV:=PF(0,CVP,0.1*sizeBC)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
//hamulec EP
temp:=BVP*Byte(EPS>0);
dV:=PF(temp,LBP,0.0015)*dt*EPS*EPS*Byte(LBP*EPS<MaxBP*LoadC);
LBP:=LBP-dV;
dV:=0;
//przeplyw ZP <-> silowniki
if((BrakeStatus and b_on)=b_on)and((TareBP<0.1)or(BCP<MaxBP*LoadC))then
if(BVP>LBP)then
begin
DCV:=false;
dV:=PF(BVP,CVP,0.017*sizeBC)*dt;
end
else dV:=0
else dV:=0;
BrakeRes.Flow(dV);
BrakeCyl.Flow(-dV);
if(DCV)then
dVP:=PF(LBP,BCP,0.01*sizeBC)*dt
else dVP:=0;
BrakeCyl.Flow(-dVP);
if(dVP>0)then dVP:=0;
//przeplyw ZP <-> rozdzielacz
if((BrakeStatus and b_hld)=b_off)then
dV:=PF(BVP,VVP,0.0011*sizeBR)*dt
else dV:=0;
BrakeRes.Flow(dV);
dV1:=dV*0.95;
ValveRes.Flow(-0.05*dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01*sizeBR)*dt;
ValveRes.Flow(-dV);
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
GetPF:=dV-dV1;
end;
function TWest.GetHPFlow(HP, dt: real): real;
begin
GetHPFlow:=dVP;
end;
procedure TWest.SetLBP(P: real);
begin
LBP:=P;
if P>BrakeCyl.P then
// begin
DCV:=true;
// end
// else
// LBP:=P;
end;
procedure TWest.SetEPS(nEPS: real);
var
BCP: real;
begin
BCP:=BrakeCyl.P;
if nEPS>0 then
DCV:=true
else if nEPS=0 then
begin
if(EPS<>0)then
begin
if(LBP>0.4)then
LBP:=BrakeCyl.P;
if(LBP<0.15)then
LBP:=0;
end;
end;
EPS:=nEPS;
end;
procedure TWest.PLC(mass: real);
begin
LoadC:=1+Byte(Mass<LoadM)*((TareBP+(MaxBP-TareBP)*(mass-TareM)/(LoadM-TareM))/MaxBP-1);
end;
procedure TWest.SetLP(TM, LM, TBP: real);
begin
TareM:=TM;
LoadM:=LM;
TareBP:=TBP;
end;
//---OERLIKON EST4---
procedure TESt.CheckReleaser(dt: real);
var VVP, BVP, CVP: real;
begin
VVP:=Min0R(ValveRes.P,BrakeRes.P+0.05);
CVP:=CntrlRes.P-0.0;
//odluzniacz
if(BrakeStatus and b_rls=b_rls)then
if(CVP-VVP<0)then
BrakeStatus:=BrakeStatus and 247
else
begin
CntrlRes.Flow(+PF(CVP,0,0.1)*dt);
end;
end;
procedure TESt.CheckState(BCP: real; var dV1: real);
var VVP, BVP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
// if (BVP<VVP) then
// VVP:=(BVP+VVP)/2;
CVP:=CntrlRes.P-0.0;
//sprawdzanie stanu
if ((BrakeStatus and 1)=1)and(BCP>0.25)then
if(VVP+0.003+BCP/BVM<CVP)then
BrakeStatus:=(BrakeStatus or 2) //hamowanie stopniowe
else if(VVP-0.003+(BCP-0.1)/BVM>CVP) then
BrakeStatus:=(BrakeStatus and 252) //luzowanie
else if(VVP+BCP/BVM>CVP) then
BrakeStatus:=(BrakeStatus and 253) //zatrzymanie napelaniania
else
else
if(VVP+0.10<CVP)and(BCP<0.25)then //poczatek hamowania
begin
if (BrakeStatus and 1)=0 then
begin
ValveRes.CreatePress(0.02*VVP);
SoundFlag:=SoundFlag or sf_Acc;
ValveRes.Act;
end;
BrakeStatus:=(BrakeStatus or 3);
// ValveRes.CreatePress(0);
// dV1:=1;
end
else if(VVP+(BCP-0.1)/BVM<CVP)and((CVP-VVP)*BVM>0.25)and(BCP>0.25)then //zatrzymanie luzowanie
BrakeStatus:=(BrakeStatus or 1);
if (BrakeStatus and 1)=0 then
SoundFlag:=SoundFlag or sf_CylU;
end;
function TESt.CVs(bp: real): real;
var VVP, BVP, CVP: real;
begin
BVP:=BrakeRes.P;
CVP:=CntrlRes.P;
VVP:=ValveRes.P;
//przeplyw ZS <-> PG
if(VVP<CVP-0.12)or(BVP<CVP-0.3)or(bp>0.4)then
CVs:=0
else
if(VVP>CVP+0.4)then
if(BVP>CVP+0.2)then
CVs:=0.23
else
CVs:=0.05
else
if(BVP>CVP-0.1)then
CVs:=1
else
CVs:=0.3;
end;
function TESt.BVs(BCP: real): real;
var VVP, BVP, CVP: real;
begin
BVP:=BrakeRes.P;
CVP:=CntrlRes.P;
VVP:=ValveRes.P;
//przeplyw ZP <-> rozdzielacz
if(BVP<CVP-0.3)then
BVs:=0.6
else
if(BCP<0.5) then
if(VVP>CVP+0.4)then
BVs:=0.1
else
BVs:=0.3
else
BVs:=0;
end;
function TESt.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
BCP:=BrakeCyl.P;
CVP:=CntrlRes.P-0.0;
dV:=0; dV1:=0;
//sprawdzanie stanu
CheckState(BCP, dV1);
CheckReleaser(dt);
CVP:=CntrlRes.P;
VVP:=ValveRes.P;
//przeplyw ZS <-> PG
temp:=CVs(BCP);
dV:=PF(CVP,VVP,0.0015*temp)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.04*dV);
dV1:=dV1-0.96*dV;
//luzowanie
if(BrakeStatus and b_hld)=b_off then
dV:=PF(0,BCP,0.0058*sizeBC)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> silowniki
if(BrakeStatus and b_on)=b_on then
dV:=PF(BVP,BCP,0.016*sizeBC)*dt
else dV:=0;
BrakeRes.Flow(dV);
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> rozdzielacz
temp:=BVs(BCP);
// if(BrakeStatus and b_hld)=b_off then
if(VVP-0.05>BVP)then
dV:=PF(BVP,VVP,0.02*sizeBR*temp/1.87)*dt
else dV:=0;
BrakeRes.Flow(dV);
dV1:=dV1+dV*0.96;
ValveRes.Flow(-0.04*dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01)*dt;
ValveRes.Flow(-dV);
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
GetPF:=dV-dV1;
end;
procedure TESt.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
ValveRes.CreatePress(PP);
BrakeCyl.CreatePress(BP);
BrakeRes.CreatePress(PP);
CntrlRes:=TReservoir.Create;
CntrlRes.CreateCap(15);
CntrlRes.CreatePress(HPP);
BrakeStatus:=0;
BVM:=1/(HPP-LPP)*MaxBP;
BrakeDelayFlag:=BDF;
end;
procedure TESt.EStParams(i_crc: real);
begin
end;
function TESt.GetCRP: real;
begin
GetCRP:=CntrlRes.P;
end;
//---EP2---
procedure TEStEP2.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
inherited;
ImplsRes.CreateCap(1);
ImplsRes.CreatePress(BP);
BrakeRes.CreatePress(PP);
BrakeDelayFlag:=bdelay_P;
BrakeDelays:=bdelay_P;
end;
function TEStEP2.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
BCP:=ImplsRes.P;
CVP:=CntrlRes.P; //110115 - konsultacje warszawa1
dV:=0; dV1:=0;
//odluzniacz
CheckReleaser(dt);
//sprawdzanie stanu
if ((BrakeStatus and 1)=1)and(BCP>0.25) then
if(VVP+0.003+BCP/BVM<CVP-0.12)then
BrakeStatus:=(BrakeStatus or 2) //hamowanie stopniowe
else if(VVP-0.003+BCP/BVM>CVP-0.12) then
BrakeStatus:=(BrakeStatus and 252) //luzowanie
else if(VVP+BCP/BVM>CVP-0.12) then
BrakeStatus:=(BrakeStatus and 253) //zatrzymanie napelaniania
else
else
if(VVP+0.10<CVP-0.12)and(BCP<0.25) then //poczatek hamowania
begin
if (BrakeStatus and 1)=0 then
begin
// ValveRes.CreatePress(0.5*VVP); //110115 - konsultacje warszawa1
// SoundFlag:=SoundFlag or sf_Acc;
// ValveRes.Act;
end;
BrakeStatus:=(BrakeStatus or 3);
end
else if(VVP+BCP/BVM<CVP-0.12)and(BCP>0.25) then //zatrzymanie luzowanie
BrakeStatus:=(BrakeStatus or 1);
//przeplyw ZS <-> PG
if(BVP<CVP-0.2)or(BrakeStatus>0)or(BCP>0.25)then
temp:=0
else
if(VVP>CVP+0.4)then
temp:=0.1
else
temp:=0.5;
dV:=PF(CVP,VVP,0.0015*temp/1.8)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.04*dV);
dV1:=dV1-0.96*dV;
//hamulec EP
temp:=BVP*Byte(EPS>0);
dV:=PF(temp,LBP,0.00053+0.00060*Byte(EPS<0))*dt*EPS*EPS*Byte(LBP*EPS<MaxBP*LoadC);
LBP:=LBP-dV;
//luzowanie KI
if(BrakeStatus and b_hld)=b_off then
dV:=PF(0,BCP,0.00083)*dt
else dV:=0;
ImplsRes.Flow(-dV);
//przeplyw ZP <-> KI
if ((BrakeStatus and b_on)=b_on) and (BCP<MaxBP*LoadC) then
dV:=PF(BVP,BCP,0.0006)*dt
else dV:=0;
BrakeRes.Flow(dV);
ImplsRes.Flow(-dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01*sizeBR)*dt;
ValveRes.Flow(-dV);
GetPF:=dV-dV1;
temp:=Max0R(BCP,LBP);
if(ImplsRes.P>LBP+0.01)then
LBP:=0;
//luzowanie CH
if(BrakeCyl.P>temp+0.005)or(Max0R(ImplsRes.P,8*LBP)<0.05) then
dV:=PF(0,BrakeCyl.P,0.25*sizeBC*(0.01+(BrakeCyl.P-temp)))*dt
else dV:=0;
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> CH
if(BrakeCyl.P<temp-0.005)and(Max0R(ImplsRes.P,8*LBP)>0.10)and(Max0R(BCP,LBP)<MaxBP*LoadC)then
dV:=PF(BVP,BrakeCyl.P,0.35*sizeBC*(0.01-(BrakeCyl.P-temp)))*dt
else dV:=0;
BrakeRes.Flow(dV);
BrakeCyl.Flow(-dV);
ImplsRes.Act;
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
end;
procedure TEStEP2.PLC(mass: real);
begin
LoadC:=1+Byte(Mass<LoadM)*((TareBP+(MaxBP-TareBP)*(mass-TareM)/(LoadM-TareM))/MaxBP-1);
end;
procedure TEStEP2.SetEPS(nEPS: real);
begin
EPS:=nEPS;
if (EPS>0) and (LBP+0.01<BrakeCyl.P) then
LBP:=BrakeCyl.P
end;
procedure TEStEP2.SetLP(TM, LM, TBP: real);
begin
TareM:=TM;
LoadM:=LM;
TareBP:=TBP;
end;
//---EST3--
function TESt3.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
BCP:=BrakeCyl.P;
CVP:=CntrlRes.P-0.0;
dV:=0; dV1:=0;
//sprawdzanie stanu
CheckState(BCP, dV1);
CheckReleaser(dt);
CVP:=CntrlRes.P;
VVP:=ValveRes.P;
//przeplyw ZS <-> PG
temp:=CVs(BCP);
dV:=PF(CVP,VVP,0.0015*temp)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.04*dV);
dV1:=dV1-0.96*dV;
//luzowanie
if(BrakeStatus and b_hld)=b_off then
dV:=PF(0,BCP,0.0042*(1.37-Byte(BrakeDelayFlag=bdelay_G))*sizeBC)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> silowniki
if(BrakeStatus and b_on)=b_on then
dV:=PF(BVP,BCP,0.017*(1+Byte((BCP<0.58)and(BrakeDelayFlag=bdelay_G)))*(1.13-Byte((BCP>0.6)and(BrakeDelayFlag=bdelay_G)))*sizeBC)*dt
else dV:=0;
BrakeRes.Flow(dV);
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> rozdzielacz
temp:=BVs(BCP);
if(VVP-0.05>BVP)then
dV:=PF(BVP,VVP,0.02*sizeBR*temp/1.87)*dt
else dV:=0;
BrakeRes.Flow(dV);
dV1:=dV1+dV*0.96;
ValveRes.Flow(-0.04*dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01)*dt;
ValveRes.Flow(-dV);
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
GetPF:=dV-dV1;
end;
//---EST4-RAPID---
function TESt4R.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
BCP:=ImplsRes.P;
CVP:=CntrlRes.P-0.0;
dV:=0; dV1:=0;
//sprawdzanie stanu
CheckState(BCP, dV1);
CheckReleaser(dt);
CVP:=CntrlRes.P;
VVP:=ValveRes.P;
//przeplyw ZS <-> PG
temp:=CVs(BCP);
dV:=PF(CVP,VVP,0.0015*temp/1.8)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.04*dV);
dV1:=dV1-0.96*dV;
//luzowanie KI
if(BrakeStatus and b_hld)=b_off then
dV:=PF(0,BCP,0.00037*1.14*15/19)*dt
else dV:=0;
ImplsRes.Flow(-dV);
//przeplyw ZP <-> KI
if(BrakeStatus and b_on)=b_on then
dV:=PF(BVP,BCP,0.0014)*dt
else dV:=0;
// BrakeRes.Flow(dV);
ImplsRes.Flow(-dV);
//przeplyw ZP <-> rozdzielacz
temp:=BVs(BCP);
if(BVP<VVP-0.05)then //or((PP<CVP)and(CVP<PP-0.1)
dV:=PF(BVP,VVP,0.02*sizeBR*temp/1.87)*dt
else dV:=0;
BrakeRes.Flow(dV);
dV1:=dV1+dV*0.96;
ValveRes.Flow(-0.04*dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01*sizeBR)*dt;
ValveRes.Flow(-dV);
GetPF:=dV-dV1;
RapidStatus:=(BrakeDelayFlag=bdelay_R)and(((Vel>55)and(RapidStatus))or(Vel>70));
RapidTemp:=RapidTemp+(0.9*Byte(RapidStatus)-RapidTemp)*dt/2;
temp:=1.9-RapidTemp;
if((BrakeStatus and b_asb)=b_asb)then
temp:=1000;
//luzowanie CH
if(BrakeCyl.P*temp>ImplsRes.P+0.005)or(ImplsRes.P<0.25) then
if((BrakeStatus and b_asb)=b_asb)then
dV:=PFVd(BrakeCyl.P,0,0.115*sizeBC*4,ImplsRes.P/temp)*dt
else
dV:=PFVd(BrakeCyl.P,0,0.115*sizeBC,ImplsRes.P/temp)*dt
// dV:=PF(0,BrakeCyl.P,0.115*sizeBC/2)*dt
// dV:=PFVd(BrakeCyl.P,0,0.015*sizeBC/2,ImplsRes.P/temp)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> CH
if(BrakeCyl.P*temp<ImplsRes.P-0.005)and(ImplsRes.P>0.3) then
// dV:=PFVa(BVP,BrakeCyl.P,0.020*sizeBC,ImplsRes.P/temp)*dt
dV:=PFVa(BVP,BrakeCyl.P,0.60*sizeBC,ImplsRes.P/temp)*dt
else dV:=0;
BrakeRes.Flow(-dV);
BrakeCyl.Flow(+dV);
ImplsRes.Act;
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
end;
procedure TESt4R.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
inherited;
ImplsRes:=TReservoir.Create;
ImplsRes.CreateCap(1);
ImplsRes.CreatePress(BP);
BrakeDelayFlag:=bdelay_R;
end;
//---EST3/AL2---
function TESt3AL2.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
BCP:=ImplsRes.P;
CVP:=CntrlRes.P-0.0;
dV:=0; dV1:=0;
//sprawdzanie stanu
CheckState(BCP, dV1);
CheckReleaser(dt);
VVP:=ValveRes.P;
//przeplyw ZS <-> PG
temp:=CVs(BCP);
dV:=PF(CVP,VVP,0.0015*temp)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.04*dV);
dV1:=dV1-0.96*dV;
//luzowanie KI
if(BrakeStatus and b_hld)=b_off then
dV:=PF(0,BCP,0.00017*(1.37-Byte(BrakeDelayFlag=bdelay_G)))*dt
else dV:=0;
ImplsRes.Flow(-dV);
//przeplyw ZP <-> KI
if ((BrakeStatus and b_on)=b_on) and (BCP<MaxBP) then
dV:=PF(BVP,BCP,0.0008*(1+Byte((BCP<0.58)and(BrakeDelayFlag=bdelay_G)))*(1.13-Byte((BCP>0.6)and(BrakeDelayFlag=bdelay_G))))*dt
else dV:=0;
BrakeRes.Flow(dV);
ImplsRes.Flow(-dV);
//przeplyw ZP <-> rozdzielacz
temp:=BVs(BCP);
if(VVP-0.05>BVP)then
dV:=PF(BVP,VVP,0.02*sizeBR*temp/1.87)*dt
else dV:=0;
BrakeRes.Flow(dV);
dV1:=dV1+dV*0.96;
ValveRes.Flow(-0.04*dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01)*dt;
ValveRes.Flow(-dV);
GetPF:=dV-dV1;
//luzowanie CH
if(BrakeCyl.P>ImplsRes.P*LoadC+0.005)or(ImplsRes.P<0.15) then
dV:=PF(0,BrakeCyl.P,0.015*sizeBC)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> CH
if(BrakeCyl.P<ImplsRes.P*LoadC-0.005)and(ImplsRes.P>0.15) then
dV:=PF(BVP,BrakeCyl.P,0.020*sizeBC)*dt
else dV:=0;
BrakeRes.Flow(dV);
BrakeCyl.Flow(-dV);
ImplsRes.Act;
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
end;
procedure TESt3AL2.PLC(mass: real);
begin
LoadC:=1+Byte(Mass<LoadM)*((TareBP+(MaxBP-TareBP)*(mass-TareM)/(LoadM-TareM))/MaxBP-1);
end;
procedure TESt3AL2.SetLP(TM, LM, TBP: real);
begin
TareM:=TM;
LoadM:=LM;
TareBP:=TBP;
end;
procedure TESt3AL2.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
inherited;
ImplsRes:=TReservoir.Create;
ImplsRes.CreateCap(1);
ImplsRes.CreatePress(BP);
end;
//---LSt---
function TLSt.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, CVP: real;
begin
// ValveRes.CreatePress(LBP);
// LBP:=0;
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
BCP:=ImplsRes.P;
CVP:=CntrlRes.P;
dV:=0; dV1:=0;
//sprawdzanie stanu
if(BrakeStatus and b_rls=b_rls)then
if(CVP<1*0)then
BrakeStatus:=BrakeStatus and 247
else
begin //008
dV:=PF1(CVP,BCP,0.024)*dt;
CntrlRes.Flow(+dV);
// dV1:=+dV; //minus potem jest
// ImplsRes.Flow(-dV1);
end;
VVP:=ValveRes.P;
//przeplyw ZS <-> PG
if((CVP-BCP)*BVM>0.5)then
temp:=0
else
if(VVP>CVP+0.4)then
temp:=0.5
else
temp:=0.5;
dV:=PF1(CVP,VVP,0.0015*temp/1.8/2)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.04*dV);
dV1:=dV1-0.96*dV;
//luzowanie KI {G}
// if VVP>BCP then
// dV:=PF(VVP,BCP,0.00004)*dt
// else if (CVP-BCP)<1.5 then
// dV:=PF(VVP,BCP,0.00020*(1.33-Byte((CVP-BCP)*BVM>0.65)))*dt
// else dV:=0; 0.00025 P
{P}
if VVP>BCP then
dV:=PF(VVP,BCP,0.00043*(1.5-Byte(((CVP-BCP)*BVM>1)and(BrakeDelayFlag=bdelay_G))),0.1)*dt
else if (CVP-BCP)<1.5 then
dV:=PF(VVP,BCP,0.001472*(1.36-Byte(((CVP-BCP)*BVM>1)and(BrakeDelayFlag=bdelay_G))),0.1)*dt
else dV:=0;
ImplsRes.Flow(-dV);
ValveRes.Flow(+dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01,0.1)*dt;
ValveRes.Flow(-dV);
GetPF:=dV-dV1;
// if Vel>55 then temp:=0.72 else
// temp:=1;{R}
//cisnienie PP
RapidTemp:=RapidTemp+(RM*Byte((Vel>55)and(BrakeDelayFlag=bdelay_R))-RapidTemp)*dt/2;
temp:=1-RapidTemp;
if EDFlag>0.2 then temp:=10000;
//powtarzacz <20> podwojny zawor zwrotny
temp:=Max0R(((CVP-BCP)*BVM+ASBP*Byte((BrakeStatus and b_asb)=b_asb))/temp,LBP);
//luzowanie CH
if(BrakeCyl.P>temp+0.005)or(temp<0.28) then
// dV:=PF(0,BrakeCyl.P,0.0015*3*sizeBC)*dt
// dV:=PF(0,BrakeCyl.P,0.005*3*sizeBC)*dt
dV:=PFVd(BrakeCyl.P,0,0.005*7*sizeBC,temp)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> CH
if(BrakeCyl.P<temp-0.005)and(temp>0.29) then
// dV:=PF(BVP,BrakeCyl.P,0.002*3*sizeBC*2)*dt
dV:=-PFVa(BVP,BrakeCyl.P,0.002*7*sizeBC*2,temp)*dt
else dV:=0;
BrakeRes.Flow(dV);
BrakeCyl.Flow(-dV);
ImplsRes.Act;
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
// LBP:=ValveRes.P;
// ValveRes.CreatePress(ImplsRes.P);
end;
procedure TLSt.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
inherited;
ValveRes.CreateCap(1);
ImplsRes.CreateCap(8);
ImplsRes.CreatePress(PP);
BrakeRes.CreatePress(8);
ValveRes.CreatePress(PP);
EDFlag:=0;
BrakeDelayFlag:=BDF;
end;
procedure TLSt.SetLBP(P: real);
begin
LBP:=P;
end;
function TLSt.GetEDBCP: real;
var CVP, BCP: real;
begin
CVP:=CntrlRes.P;
BCP:=ImplsRes.P;
GetEDBCP:=(CVP-BCP)*BVM;
end;
procedure TLSt.SetED(EDstate: real);
begin
EDFlag:=EDstate;
end;
procedure TLSt.SetRM(RMR: real);
begin
RM:=1-RMR;
end;
function TLSt.GetHPFlow(HP, dt: real): real;
var dV: real;
begin
dV:=Min0R(PF(HP,BrakeRes.P,0.01*dt),0);
BrakeRes.Flow(-dV);
GetHPFlow:=dV;
end;
//---EStED---
function TEStED.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, CVP, MPP, nastG: real;
i: byte;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
BCP:=ImplsRes.P;
CVP:=CntrlRes.P-0.0;
MPP:=Miedzypoj.P;
dV1:=0;
nastG:=(BrakeDelayFlag and bdelay_G);
//sprawdzanie stanu
if(BCP<0.25)and(VVP+0.08>CVP)then Przys_blok:=false;
//sprawdzanie stanu
if(VVP+0.002+BCP/BVM<CVP-0.05)and(Przys_blok)then
BrakeStatus:=(BrakeStatus or 3) //hamowanie stopniowe
else if(VVP-0.002+(BCP-0.1)/BVM>CVP-0.05) then
BrakeStatus:=(BrakeStatus and 252) //luzowanie
else if(VVP+BCP/BVM>CVP-0.05) then
BrakeStatus:=(BrakeStatus and 253) //zatrzymanie napelaniania
else if(VVP+(BCP-0.1)/BVM<CVP-0.05)and(BCP>0.25)then //zatrzymanie luzowania
BrakeStatus:=(BrakeStatus or 1);
if(VVP+0.10<CVP)and(BCP<0.25)then //poczatek hamowania
if (not Przys_blok) then
begin
ValveRes.CreatePress(0.75*VVP);
SoundFlag:=SoundFlag or sf_Acc;
ValveRes.Act;
Przys_blok:=true;
end;
if(BCP>0.5)then
Zamykajacy:=true
else if(VVP-0.6<MPP) then
Zamykajacy:=false;
if(BrakeStatus and b_rls=b_rls)then
begin
dV:=PF(CVP,BCP,0.024)*dt;
CntrlRes.Flow(+dV);
end;
//luzowanie
if(BrakeStatus and b_hld)=b_off then
dV:=PF(0,BCP,Nozzles[3]*nastG+(1-nastG)*Nozzles[1])*dt
else dV:=0;
ImplsRes.Flow(-dV);
if((BrakeStatus and b_on)=b_on)and(BCP<MaxBP)then
dV:=PF(BVP,BCP,Nozzles[2]*(nastG+2*Byte(BCP<0.8))+Nozzles[0]*(1-nastG))*dt
else dV:=0;
ImplsRes.Flow(-dV);
BrakeRes.Flow(dV);
//przeplyw testowy miedzypojemnosci
if(MPP<CVP-0.3)then
temp:=Nozzles[4]
else
if(BCP<0.5) then
if(Zamykajacy)then
temp:=Nozzles[8] //1.25
else
temp:=Nozzles[7]
else
temp:=0;
dV:=PF(MPP,VVP,temp);
if(MPP<CVP-0.17)then
temp:=0
else
if(MPP>CVP-0.08)then
temp:=Nozzles[5]
else
temp:=Nozzles[6];
dV:=dV+PF(MPP,CVP,temp);
if(MPP-0.05>BVP)then
dV:=dV+PF(MPP-0.05,BVP,Nozzles[10]*nastG+(1-nastG)*Nozzles[9]);
if MPP>VVP then dV:=dV+PF(MPP,VVP,0.02);
Miedzypoj.Flow(dV*dt*0.15);
RapidTemp:=RapidTemp+(RM*Byte((Vel>55)and(BrakeDelayFlag=bdelay_R))-RapidTemp)*dt/2;
temp:=Max0R(1-RapidTemp,0.001);
// if EDFlag then temp:=1000;
// temp:=temp/(1-);
//powtarzacz <20> podwojny zawor zwrotny
temp:=Max0R(LoadC*BCP/temp*Min0R(Max0R(1-EDFlag,0),1),LBP);
if(BrakeCyl.P>temp)then
dV:=-PFVd(BrakeCyl.P,0,0.02*sizeBC,temp)*dt
else
if(BrakeCyl.P<temp)then
dV:=PFVa(BVP,BrakeCyl.P,0.02*sizeBC,temp)*dt
else dV:=0;
BrakeCyl.Flow(dV);
if dV>0 then
BrakeRes.Flow(-dV);
//przeplyw ZS <-> PG
if(MPP<CVP-0.17)then
temp:=0
else
if(MPP>CVP-0.08)then
temp:=Nozzles[5]
else
temp:=Nozzles[6];
dV:=PF(CVP,MPP,temp)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.02*dV);
dV1:=dV1+0.98*dV;
//przeplyw ZP <-> MPJ
if(MPP-0.05>BVP)then
dV:=PF(BVP,MPP-0.05,Nozzles[10]*nastG+(1-nastG)*Nozzles[9])*dt
else dV:=0;
BrakeRes.Flow(dV);
dV1:=dV1+dV*0.98;
ValveRes.Flow(-0.02*dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.005)*dt; //0.01
ValveRes.Flow(-dV);
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
Miedzypoj.Act;
ImplsRes.Act;
GetPF:=dV-dV1;
end;
procedure TEStED.Init(PP, HPP, LPP, BP: real; BDF: byte);
var i:integer;
begin
inherited;
ValveRes.CreatePress(1*PP);
BrakeCyl.CreatePress(1*BP);
// CntrlRes:=TReservoir.Create;
// CntrlRes.CreateCap(15);
// CntrlRes.CreatePress(1*HPP);
BrakeStatus:=Byte(BP>1)*1;
Miedzypoj:=TReservoir.Create;
Miedzypoj.CreateCap(5);
Miedzypoj.CreatePress(PP);
ImplsRes.CreateCap(1);
ImplsRes.CreatePress(BP);
BVM:=1/(HPP-0.05-LPP)*MaxBP;
BrakeDelayFlag:=BDF;
Zamykajacy:=false;
EDFlag:=0;
Nozzles[0]:=1.250/1.7;
Nozzles[1]:=0.907;
Nozzles[2]:=0.510/1.7;
Nozzles[3]:=0.524/1.17;
Nozzles[4]:=7.4;
Nozzles[7]:=5.3;
Nozzles[8]:=2.5;
Nozzles[9]:=7.28;
Nozzles[10]:=2.96;
Nozzles[5]:=1.1;
Nozzles[6]:=0.9;
for i:=0 to 10 do
begin
Nozzles[i]:=Nozzles[i]*Nozzles[i]*3.14159/4000;
end;
end;
function TEStED.GetEDBCP: real;
begin
GetEDBCP:=ImplsRes.P*LoadC;
end;
procedure TEStED.PLC(mass: real);
begin
LoadC:=1+Byte(Mass<LoadM)*((TareBP+(MaxBP-TareBP)*(mass-TareM)/(LoadM-TareM))/MaxBP-1);
end;
procedure TEStED.SetLP(TM, LM, TBP: real);
begin
TareM:=TM;
LoadM:=LM;
TareBP:=TBP;
end;
//---DAKO CV1---
procedure TCV1.CheckState(BCP: real; var dV1: real);
var VVP, BVP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=Min0R(ValveRes.P,BVP+0.05);
CVP:=CntrlRes.P-0.0;
//odluzniacz
if(BrakeStatus and b_rls=b_rls)and(CVP-VVP<0)then
BrakeStatus:=BrakeStatus and 247;
//sprawdzanie stanu
if (BrakeStatus and 1)=1 then
if(VVP+0.003+BCP/BVM<CVP)then
BrakeStatus:=(BrakeStatus or 2) //hamowanie stopniowe
else if(VVP-0.003+BCP/BVM>CVP) then
BrakeStatus:=(BrakeStatus and 252) //luzowanie
else if(VVP+BCP/BVM>CVP) then
BrakeStatus:=(BrakeStatus and 253) //zatrzymanie napelaniania
else
else
if(VVP+0.10<CVP)and(BCP<0.1) then //poczatek hamowania
begin
BrakeStatus:=(BrakeStatus or 3);
dV1:=1.25;
end
else if(VVP+BCP/BVM<CVP)and(BCP>0.25) then //zatrzymanie luzowanie
BrakeStatus:=(BrakeStatus or 1);
end;
function TCV1.CVs(bp: real): real;
begin
//przeplyw ZS <-> PG
if(bp>0.05)then
CVs:=0
else
CVs:=0.23
end;
function TCV1.BVs(BCP: real): real;
var VVP, BVP, CVP: real;
begin
BVP:=BrakeRes.P;
CVP:=CntrlRes.P;
VVP:=ValveRes.P;
//przeplyw ZP <-> rozdzielacz
if(BVP<CVP-0.1)then
BVs:=1
else
if(BCP>0.05)then
BVs:=0
else
BVs:=0.2*(1.5-Byte(BVP>VVP));
end;
function TCV1.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=Min0R(ValveRes.P,BVP+0.05);
BCP:=BrakeCyl.P;
CVP:=CntrlRes.P-0.0;
dV:=0; dV1:=0;
//sprawdzanie stanu
CheckState(BCP, dV1);
VVP:=ValveRes.P;
//przeplyw ZS <-> PG
temp:=CVs(BCP);
dV:=PF(CVP,VVP,0.0015*temp)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.04*dV);
dV1:=dV1-0.96*dV;
//luzowanie
if(BrakeStatus and b_hld)=b_off then
dV:=PF(0,BCP,0.0042*(1.37-Byte(BrakeDelayFlag=bdelay_G))*sizeBC)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> silowniki
if(BrakeStatus and b_on)=b_on then
dV:=PF(BVP,BCP,0.017*(1+Byte((BCP<0.58)and(BrakeDelayFlag=bdelay_G)))*(1.13-Byte((BCP>0.6)and(BrakeDelayFlag=bdelay_G)))*sizeBC)*dt
else dV:=0;
BrakeRes.Flow(dV);
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> rozdzielacz
temp:=BVs(BCP);
if(VVP+0.05>BVP)then
dV:=PF(BVP,VVP,0.02*sizeBR*temp/1.87)*dt
else dV:=0;
BrakeRes.Flow(dV);
dV1:=dV1+dV*0.96;
ValveRes.Flow(-0.04*dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01)*dt;
ValveRes.Flow(-dV);
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
GetPF:=dV-dV1;
end;
procedure TCV1.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
ValveRes.CreatePress(PP);
BrakeCyl.CreatePress(BP);
BrakeRes.CreatePress(PP);
CntrlRes:=TReservoir.Create;
CntrlRes.CreateCap(15);
CntrlRes.CreatePress(HPP);
BrakeStatus:=0;
BVM:=1/(HPP-LPP)*MaxBP;
BrakeDelayFlag:=BDF;
end;
function TCV1.GetCRP: real;
begin
GetCRP:=CntrlRes.P;
end;
//---CV1-L-TR---
procedure TCV1L_TR.SetLBP(P: real);
begin
LBP:=P;
end;
function TCV1L_TR.GetHPFlow(HP, dt: real): real;
var dV: real;
begin
dV:=PF(HP,BrakeRes.P,0.01)*dt;
dV:=Min0R(0,dV);
BrakeRes.Flow(-dV);
GetHPFlow:=dV;
end;
procedure TCV1L_TR.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
inherited;
ImplsRes:=TReservoir.Create;
ImplsRes.CreateCap(2.5);
ImplsRes.CreatePress(BP);
end;
function TCV1L_TR.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=Min0R(ValveRes.P,BVP+0.05);
BCP:=ImplsRes.P;
CVP:=CntrlRes.P-0.0;
dV:=0; dV1:=0;
//sprawdzanie stanu
CheckState(BCP, dV1);
VVP:=ValveRes.P;
//przeplyw ZS <-> PG
temp:=CVs(BCP);
dV:=PF(CVP,VVP,0.0015*temp)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.04*dV);
dV1:=dV1-0.96*dV;
//luzowanie KI
if(BrakeStatus and b_hld)=b_off then
dV:=PF(0,BCP,0.000425*(1.37-Byte(BrakeDelayFlag=bdelay_G)))*dt
else dV:=0;
ImplsRes.Flow(-dV);
//przeplyw ZP <-> KI
if ((BrakeStatus and b_on)=b_on) and (BCP<MaxBP) then
dV:=PF(BVP,BCP,0.002*(1+Byte((BCP<0.58)and(BrakeDelayFlag=bdelay_G)))*(1.13-Byte((BCP>0.6)and(BrakeDelayFlag=bdelay_G))))*dt
else dV:=0;
BrakeRes.Flow(dV);
ImplsRes.Flow(-dV);
//przeplyw ZP <-> rozdzielacz
temp:=BVs(BCP);
if(VVP+0.05>BVP)then
dV:=PF(BVP,VVP,0.02*sizeBR*temp/1.87)*dt
else dV:=0;
BrakeRes.Flow(dV);
dV1:=dV1+dV*0.96;
ValveRes.Flow(-0.04*dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01)*dt;
GetPF:=dV-dV1;
temp:=Max0R(BCP,LBP);
//luzowanie CH
if(BrakeCyl.P>temp+0.005)or(Max0R(ImplsRes.P,8*LBP)<0.25) then
dV:=PF(0,BrakeCyl.P,0.015*sizeBC)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
//przeplyw ZP <-> CH
if(BrakeCyl.P<temp-0.005)and(Max0R(ImplsRes.P,8*LBP)>0.3)and(Max0R(BCP,LBP)<MaxBP)then
dV:=PF(BVP,BrakeCyl.P,0.020*sizeBC)*dt
else dV:=0;
BrakeRes.Flow(dV);
BrakeCyl.Flow(-dV);
ImplsRes.Act;
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
end;
//--- KNORR KE ---
procedure TKE.CheckReleaser(dt: real);
var VVP, CVP: real;
begin
VVP:=ValveRes.P;
CVP:=CntrlRes.P;
//odluzniacz
if(BrakeStatus and b_rls=b_rls)then
if(CVP-VVP<0)then
BrakeStatus:=BrakeStatus and 247
else
begin
CntrlRes.Flow(+PF(CVP,0,0.1)*dt);
end;
end;
procedure TKE.CheckState(BCP: real; var dV1: real);
var VVP, BVP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
CVP:=CntrlRes.P;
//sprawdzanie stanu
if (BrakeStatus and 1)=1 then
if(VVP+0.003+BCP/BVM<CVP)then
BrakeStatus:=(BrakeStatus or 2) //hamowanie stopniowe
else if(VVP-0.003+BCP/BVM>CVP) then
BrakeStatus:=(BrakeStatus and 252) //luzowanie
else if(VVP+BCP/BVM>CVP) then
BrakeStatus:=(BrakeStatus and 253) //zatrzymanie napelaniania
else
else
if(VVP+0.10<CVP)and(BCP<0.1)then //poczatek hamowania
begin
BrakeStatus:=(BrakeStatus or 3);
ValveRes.CreatePress(0.8*VVP); //przyspieszacz
end
else if(VVP+BCP/BVM<CVP)and((CVP-VVP)*BVM>0.25) then //zatrzymanie luzowanie
BrakeStatus:=(BrakeStatus or 1);
end;
function TKE.CVs(bp: real): real;
var VVP, BVP, CVP: real;
begin
BVP:=BrakeRes.P;
CVP:=CntrlRes.P;
VVP:=ValveRes.P;
//przeplyw ZS <-> PG
if(bp>0.2)then
CVs:=0
else
if(VVP>CVP+0.4)then
CVs:=0.05
else
CVs:=0.23
end;
function TKE.BVs(BCP: real): real;
var VVP, BVP, CVP: real;
begin
BVP:=BrakeRes.P;
CVP:=CntrlRes.P;
VVP:=ValveRes.P;
//przeplyw ZP <-> rozdzielacz
if (BVP>VVP) then
BVs:=0
else
if(BVP<CVP-0.3)then
BVs:=0.6
else
BVs:=0.13
end;
function TKE.GetPF(PP, dt, Vel: real): real;
var dv, dv1, temp:real;
VVP, BVP, BCP, IMP, CVP: real;
begin
BVP:=BrakeRes.P;
VVP:=ValveRes.P;
BCP:=BrakeCyl.P;
IMP:=ImplsRes.P;
CVP:=CntrlRes.P;
dV:=0; dV1:=0;
//sprawdzanie stanu
CheckState(IMP, dV1);
CheckReleaser(dt);
//przeplyw ZS <-> PG
temp:=CVs(IMP);
dV:=PF(CVP,VVP,0.0015*temp)*dt;
CntrlRes.Flow(+dV);
ValveRes.Flow(-0.04*dV);
dV1:=dV1-0.96*dV;
//luzowanie
if(BrakeStatus and b_hld)=b_off then
begin
if ((BrakeDelayFlag and bdelay_G)=0) then
temp:=0.283+0.139
else
temp:=0.139;
dV:=PF(0,IMP,0.001*temp)*dt
end
else dV:=0;
ImplsRes.Flow(-dV);
//przeplyw ZP <-> silowniki
if((BrakeStatus and b_on)=b_on)and(IMP<MaxBP)then
begin
temp:=0.113;
if ((BrakeDelayFlag and bdelay_G)=0) then
temp:=temp+0.636;
if (BCP<0.5) then
temp:=temp+0.785;
dV:=PF(BVP,IMP,0.001*temp)*dt
end
else dV:=0;
BrakeRes.Flow(dV);
ImplsRes.Flow(-dV);
//rapid
if not ((FM is TDisk1) or (FM is TDisk2)) then //jesli zeliwo to schodz
RapidStatus:=((BrakeDelayFlag and bdelay_R)=bdelay_R)and(((Vel>50)and(RapidStatus))or(Vel>70))
else //jesli tarczowki, to zostan
RapidStatus:=((BrakeDelayFlag and bdelay_R)=bdelay_R);
// temp:=1.9-0.9*Byte(RapidStatus);
if(RM*RM>0.1)then //jesli jest rapid
if(RM>0)then //jesli dodatni (naddatek);
temp:=1-RM*Byte(RapidStatus)
else
temp:=1-RM*(1-Byte(RapidStatus))
else
temp:=1;
temp:=temp/LoadC;
//luzowanie CH
// temp:=Max0R(BCP,LBP);
IMP:=Max0R(IMP/temp,Max0R(LBP,ASBP*Byte((BrakeStatus and b_asb)=b_asb)));
//luzowanie CH
if(BCP>IMP+0.005)or(Max0R(ImplsRes.P,8*LBP)<0.25) then
dV:=PFVd(BCP,0,0.05,IMP)*dt
else dV:=0;
BrakeCyl.Flow(-dV);
if(BCP<IMP-0.005)and(Max0R(ImplsRes.P,8*LBP)>0.3) then
dV:=PFVa(BVP,BCP,0.05,IMP)*dt
else dV:=0;
BrakeRes.Flow(-dV);
BrakeCyl.Flow(+dV);
//przeplyw ZP <-> rozdzielacz
temp:=BVs(IMP);
// if(BrakeStatus and b_hld)=b_off then
if(IMP<0.25)or(VVP+0.05>BVP)then
dV:=PF(BVP,VVP,0.02*sizeBR*temp/1.87)*dt
else dV:=0;
BrakeRes.Flow(dV);
dV1:=dV1+dV*0.96;
ValveRes.Flow(-0.04*dV);
//przeplyw PG <-> rozdzielacz
dV:=PF(PP,VVP,0.01)*dt;
ValveRes.Flow(-dV);
ValveRes.Act;
BrakeCyl.Act;
BrakeRes.Act;
CntrlRes.Act;
ImplsRes.Act;
GetPF:=dV-dV1;
end;
procedure TKE.Init(PP, HPP, LPP, BP: real; BDF: byte);
begin
ValveRes.CreatePress(PP);
BrakeCyl.CreatePress(BP);
BrakeRes.CreatePress(PP);
CntrlRes:=TReservoir.Create; //komora sterujaca
CntrlRes.CreateCap(5);
CntrlRes.CreatePress(HPP);
ImplsRes:=TReservoir.Create; //komora zastepcza silownika
ImplsRes.CreateCap(1);
ImplsRes.CreatePress(BP);
BrakeStatus:=0;
BVM:=1/(HPP-LPP)*MaxBP;
BrakeDelayFlag:=BDF;
end;
function TKE.GetCRP: real;
begin
GetCRP:=CntrlRes.P;
end;
function TKE.GetHPFlow(HP, dt: real): real;
var dV: real;
begin
dV:=PF(HP,BrakeRes.P,0.01)*dt;
dV:=Min0R(0,dV);
BrakeRes.Flow(-dV);
GetHPFlow:=dV;
end;
procedure TKE.PLC(mass: real);
begin
LoadC:=1+Byte(Mass<LoadM)*((TareBP+(MaxBP-TareBP)*(mass-TareM)/(LoadM-TareM))/MaxBP-1);
end;
procedure TKE.SetLP(TM, LM, TBP: real);
begin
TareM:=TM;
LoadM:=LM;
TareBP:=TBP;
end;
procedure TKE.SetRM(RMR: real);
begin
RM:=1-RMR;
end;
procedure TKE.SetLBP(P: real);
begin
LBP:=P;
end;
//---KRANY---
function THandle.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
begin
GetPF:=0;
end;
procedure THandle.Init(press: real);
begin
Time:=false;
TimeEP:=false;
end;
procedure THandle.SetReductor(nAdj: real);
begin
end;
function THandle.GetCP: real;
begin
GetCP:=0;
end;
function THandle.GetSound(i: byte): real;
begin
GetSound:=0;
end;
function THandle.GetPos(i: byte): real;
begin
GetPos:=0;
end;
//---FV4a---
function TFV4a.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
const
LBDelay = 100;
var
LimPP, dpPipe, dpMainValve, ActFlowSpeed: real;
begin
ep:=pp; //SPKS!!
Limpp:=Min0R(BPT[Round(i_bcp)][1],HP);
ActFlowSpeed:=BPT[Round(i_bcp)][0];
if(i_bcp=i_bcpNo)then limpp:=2.9;
cp:=cp+20*Min0R(abs(Limpp-cp),0.05)*PR(cp,Limpp)*dt/1;
rp:=rp+20*Min0R(abs(ep-rp),0.05)*PR(rp,ep)*dt/2.5;
Limpp:=cp;
dpPipe:=Min0R(HP,Limpp);
dpMainValve:=PF(dpPipe,pp,ActFlowSpeed/(LBDelay))*dt;
if(cp>rp+0.05)then
dpMainValve:=PF(Min0R(cp+0.1,HP),pp,1.1*(ActFlowSpeed)/(LBDelay))*dt;
if(cp<rp-0.05)then
dpMainValve:=PF(cp-0.1,pp,1.1*(ActFlowSpeed)/(LBDelay))*dt;
if Round(i_bcp)=-1 then
begin
cp:=cp+5*Min0R(abs(Limpp-cp),0.2)*PR(cp,Limpp)*dt/2;
if(cp<rp+0.03)then
if(tp<5)then tp:=tp+dt;
// if(cp+0.03<5.4)then
if(rp+0.03<5.4)or(cp+0.03<5.4)then //fala
dpMainValve:=PF(Min0R(HP,17.1),pp,(ActFlowSpeed)/(LBDelay))*dt
// dpMainValve:=20*Min0R(abs(ep-7.1),0.05)*PF(HP,pp,(ActFlowSpeed)/(LBDelay))*dt
else
begin
rp:=5.45;
if (cp<pp-0.01) then //: /34*9
dpMainValve:=PF(dpPipe,pp,(ActFlowSpeed)/34*9/(LBDelay))*dt
else
dpMainValve:=PF(dpPipe,pp,(ActFlowSpeed)/(LBDelay))*dt
end;
end;
if(Round(i_bcp)=0)then
begin
if(tp>0.1)then
begin
cp:=5+(tp-0.1)*0.08;
tp:=tp-dt/12/2;
end;
if(cp>rp+0.1)and(cp<=5)then
dpMainValve:=PF(Min0R(cp+0.25,HP),pp,2*(ActFlowSpeed)/(LBDelay))*dt
else
if cp>5 then
dpMainValve:=PF(Min0R(cp,HP),pp,2*(ActFlowSpeed)/(LBDelay))*dt
else
dpMainValve:=PF(dpPipe,pp,(ActFlowSpeed)/(LBDelay))*dt
end;
if(Round(i_bcp)=i_bcpNo)then
begin
dpMainValve:=PF(0,pp,(ActFlowSpeed)/(LBDelay))*dt;
end;
GetPF:=dpMainValve;
end;
procedure TFV4a.Init(press: real);
begin
CP:= press;
TP:= 0;
RP:= press;
Time:= false;
TimeEP:=false;
end;
//---FV4a/M--- nowonapisany kran bez poprawki IC
function TFV4aM.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
function LPP_RP(pos: real): real; //cisnienie z zaokraglonej pozycji;
var i_pos: integer;
begin
i_pos:=Round(pos-0.5); //zaokraglone w dol
LPP_RP:=BPT[i_pos][1]+(BPT[i_pos+1][1]-BPT[i_pos][1])*(pos-i_pos); //interpolacja liniowa
end;
function EQ(pos: real; i_pos: real): boolean;
begin
EQ:=(pos<=i_pos+0.5)and(pos>i_pos-0.5);
end;
const
LBDelay = 100;
xpM = 0.3; //mnoznik membrany komory pod
var
LimPP, dpPipe, dpMainValve, ActFlowSpeed, dp: real;
pom: real;
i: byte;
begin
ep:=pp/2*1.5+ep/2*0.5; //SPKS!!
// ep:=pp;
// ep:=cp/3+pp/3+ep/3;
// ep:=cp;
for i:=0 to 4 do
Sounds[i]:=0;
dp:=0;
i_bcp:=Max0R(Min0R(i_bcp,5.999),-1.999); //na wszelki wypadek, zeby nie wyszlo poza zakres
if(tp>0)then
begin //jesli czasowy jest niepusty
// dp:=0.07; //od cisnienia 5 do 0 w 60 sekund ((5-0)*dt/75)
dp:=0.045; //2.5 w 55 sekund (5,35->5,15 w PG)
tp:=tp-dp*dt;
Sounds[s_fv4a_t]:=dp;
end
else //.08
begin
tp:=0;
end;
if(xp>0)then //jesli komora pod niepusta jest niepusty
begin
dp:=2.5;
Sounds[s_fv4a_x]:=dp*xp;
xp:=xp-dt*dp*2; //od cisnienia 5 do 0 w 10 sekund ((5-0)*dt/10)
end
else //.75
xp:=0; //jak pusty, to pusty
Limpp:=Min0R(LPP_RP(i_bcp)+tp*0.08+RedAdj,HP); //pozycja + czasowy lub zasilanie
ActFlowSpeed:=BPT[Round(i_bcp)][0];
if(EQ(i_bcp,-1))then pom:=Min0R(HP,5.4+RedAdj) else pom:=Min0R(cp,HP);
if(pom>rp+0.25)then Fala:=true;
if(Fala)then
if(pom>rp+0.3)then
// if(ep>rp+0.11)then
xp:=xp-20*PR(pom,xp)*dt
// else
// xp:=xp-16*(ep-(ep+0.01))/(0.1)*PR(ep,xp)*dt
else Fala:=false;
if(Limpp>cp)then //podwyzszanie szybkie
cp:=cp+5*60*Min0R(abs(Limpp-cp),0.05)*PR(cp,Limpp)*dt //zbiornik sterujacy
else
cp:=cp+13*Min0R(abs(Limpp-cp),0.05)*PR(cp,Limpp)*dt; //zbiornik sterujacy
Limpp:=pom; //cp
dpPipe:=Min0R(HP,Limpp+xp*xpM);
if dpPipe>pp then
dpMainValve:=-PFVa(HP,pp,ActFlowSpeed/(LBDelay),dpPipe,0.4)
else
dpMainValve:=PFVd(pp,0,ActFlowSpeed/(LBDelay),dpPipe,0.4);
if EQ(i_bcp,-1) then
begin
if(tp<5)then tp:=tp+dt; //5/10
if(tp<1)then tp:=tp-0.5*dt; //5/10
// dpMainValve:=dpMainValve*2;//+1*PF(dpPipe,pp,(ActFlowSpeed)/(LBDelay))//coby nie przeszkadzal przy ladowaniu z zaworu obok
end;
if EQ(i_bcp,0) then
begin
if(tp>2)then
dpMainValve:=dpMainValve*1.5;//+0.5*PF(dpPipe,pp,(ActFlowSpeed)/(LBDelay))//coby nie przeszkadzal przy ladowaniu z zaworu obok
end;
ep:=dpPipe;
if(EQ(i_bcp,0)or(rp>ep))then
rp:=rp+PF(rp,ep,0.0007)*dt //powolne wzrastanie, ale szybsze na jezdzie
else
rp:=rp+PF(rp,ep,0.000093/2*2)*dt; //powolne wzrastanie i to bardzo //jednak trzeba wydluzyc, bo obecnie zle dziala
if (rp<ep) and (rp<BPT[Round(i_bcpNo)][1])then //jesli jestesmy ponizej cisnienia w sterujacym (2.9 bar)
rp:=rp+PF(rp,cp,0.005)*dt; //przypisz cisnienie w PG - wydluzanie napelniania o czas potrzebny do napelnienia PG
if(EQ(i_bcp,i_bcpNo))or(EQ(i_bcp,-2))then
begin
dp:=PF(0,pp,(ActFlowSpeed)/(LBDelay));
dpMainValve:=dp;
Sounds[s_fv4a_e]:=dp;
Sounds[s_fv4a_u]:=0;
Sounds[s_fv4a_b]:=0;
Sounds[s_fv4a_x]:=0;
end
else
begin
if dpMainValve>0 then
Sounds[s_fv4a_b]:=dpMainValve
else
Sounds[s_fv4a_u]:=-dpMainValve;
end;
GetPF:=dpMainValve*dt;
end;
procedure TFV4aM.Init(press: real);
begin
CP:= press;
TP:= 0;
RP:= press;
XP:= 0;
Time:=false;
TimeEP:=false;
end;
procedure TFV4aM.SetReductor(nAdj: real);
begin
RedAdj:= nAdj;
end;
function TFV4aM.GetSound(i: byte): real;
begin
if i>4 then
GetSound:=0
else
GetSound:=Sounds[i];
end;
function TFV4aM.GetPos(i: byte): real;
const
table: array[0..10] of real = (-2,6,-1,0,-2,1,4,6,0,0,0);
begin
GetPos:=table[i];
end;
//---M394--- Matrosow
function TM394.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
const
LBDelay = 65;
var
LimPP, dpPipe, dpMainValve, ActFlowSpeed: real;
bcp: integer;
begin
bcp:=Round(i_bcp);
if bcp<-1 then bcp:=1;
Limpp:=Min0R(BPT_394[bcp][1],HP);
ActFlowSpeed:=BPT_394[bcp][0];
if (bcp=1)or(bcp=i_bcpNo) then
Limpp:=pp;
if (bcp=0) then
Limpp:=Limpp+RedAdj;
if (bcp<>2) then
if cp<Limpp then
cp:=cp+4*Min0R(abs(Limpp-cp),0.05)*PR(cp,Limpp)*dt //zbiornik sterujacy
// cp:=cp+6*(2+Byte(bcp<0))*Min0R(abs(Limpp-cp),0.05)*PR(cp,Limpp)*dt //zbiornik sterujacy
else
if bcp=0 then
cp:=cp-0.2*dt/100
else
cp:=cp+4*(1+Byte(bcp<>3)+Byte(bcp>4))*Min0R(abs(Limpp-cp),0.05)*PR(cp,Limpp)*dt; //zbiornik sterujacy
Limpp:=cp;
dpPipe:=Min0R(HP,Limpp);
// if(dpPipe>pp)then //napelnianie
// dpMainValve:=PF(dpPipe,pp,ActFlowSpeed/(LBDelay))*dt
// else //spuszczanie
dpMainValve:=PF(dpPipe,pp,ActFlowSpeed/(LBDelay))*dt;
if bcp=-1 then
// begin
dpMainValve:=PF(HP,pp,(ActFlowSpeed)/(LBDelay))*dt;
// end;
if bcp=i_bcpNo then
// begin
dpMainValve:=PF(0,pp,(ActFlowSpeed)/(LBDelay))*dt;
// end;
GetPF:=dpMainValve;
end;
procedure TM394.Init(press: real);
begin
CP:= press;
RedAdj:= 0;
Time:=true;
TimeEP:=false;
end;
procedure TM394.SetReductor(nAdj: real);
begin
RedAdj:= nAdj;
end;
function TM394.GetCP: real;
begin
GetCP:= CP;
end;
function TM394.GetPos(i: byte): real;
const
table: array[0..10] of real = (-1,5,-1,0,1,2,4,5,0,0,0);
begin
GetPos:=table[i];
end;
//---H14K1-- Knorr
function TH14K1.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
const
LBDelay = 100; //szybkosc + zasilanie sterujacego
BPT_K: array[-1..4] of array [0..1] of real= ((10, 0), (4, 1), (0, 1), (4, 0), (4, -1), (15, -1));
NomPress = 5.0;
var
LimPP, dpPipe, dpMainValve, ActFlowSpeed: real;
bcp: integer;
begin
bcp:=Round(i_bcp);
if i_bcp<-1 then bcp:=1;
Limpp:=BPT_K[bcp][1];
if Limpp<0 then
Limpp:=0.5*pp
else if Limpp>0 then
Limpp:=pp
else
Limpp:=cp;
ActFlowSpeed:=BPT_K[bcp][0];
cp:=cp+6*Min0R(abs(Limpp-cp),0.05)*PR(cp,Limpp)*dt; //zbiornik sterujacy
dpMainValve:=0;
if bcp=-1 then
dpMainValve:=PF(HP,pp,(ActFlowSpeed)/(LBDelay))*dt;
if(bcp=0)then
dpMainValve:=-PFVa(HP,pp,(ActFlowSpeed)/(LBDelay),NomPress+RedAdj)*dt;
if (bcp>1)and(pp>cp) then
dpMainValve:=PFVd(pp,0,(ActFlowSpeed)/(LBDelay),cp)*dt;
if bcp=i_bcpNo then
dpMainValve:=PF(0,pp,(ActFlowSpeed)/(LBDelay))*dt;
GetPF:=dpMainValve;
end;
procedure TH14K1.Init(press: real);
begin
CP:= press;
RedAdj:= 0;
Time:=true;
TimeEP:=true;
end;
procedure TH14K1.SetReductor(nAdj: real);
begin
RedAdj:= nAdj;
end;
function TH14K1.GetCP: real;
begin
GetCP:= CP;
end;
function TH14K1.GetPos(i: byte): real;
const
table: array[0..10] of real = (-1,4,-1,0,1,2,3,4,0,0,0);
begin
GetPos:=table[i];
end;
//---St113-- Knorr EP
function TSt113.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
const
LBDelay = 100; //szybkosc + zasilanie sterujacego
BPT_K: array[-1..4] of array [0..1] of real= ((10, 0), (4, 1), (0, 1), (4, 0), (4, -1), (15, -1));
BEP_K: array[-1..5] of real= (0, -1, 1, 0, 0, 0, 0);
NomPress = 5.0;
var
LimPP, dpPipe, dpMainValve, ActFlowSpeed: real;
bcp: integer;
begin
bcp:=Round(i_bcp);
EPS:=BEP_K[bcp];
if bcp>0 then bcp:=bcp-1;
if bcp<-1 then bcp:=1;
Limpp:=BPT_K[bcp][1];
if Limpp<0 then
Limpp:=0.5*pp
else if Limpp>0 then
Limpp:=pp
else
Limpp:=cp;
ActFlowSpeed:=BPT_K[bcp][0];
cp:=cp+6*Min0R(abs(Limpp-cp),0.05)*PR(cp,Limpp)*dt; //zbiornik sterujacy
dpMainValve:=0;
if bcp=-1 then
dpMainValve:=PF(HP,pp,(ActFlowSpeed)/(LBDelay))*dt;
if(bcp=0)then
dpMainValve:=-PFVa(HP,pp,(ActFlowSpeed)/(LBDelay),NomPress+RedAdj)*dt;
if (bcp>1)and(pp>cp) then
dpMainValve:=PFVd(pp,0,(ActFlowSpeed)/(LBDelay),cp)*dt;
if bcp=i_bcpNo then
dpMainValve:=PF(0,pp,(ActFlowSpeed)/(LBDelay))*dt;
GetPF:=dpMainValve;
end;
function TSt113.GetCP: real;
begin
GetCP:=EPS;
end;
function TSt113.GetPos(i: byte): real;
const
table: array[0..10] of real = (-1,5,-1,0,2,3,4,5,0,0,1);
begin
GetPos:=table[i];
end;
procedure TSt113.Init(press: real);
begin
Time:=true;
TimeEP:=true;
end;
//--- test ---
function Ttest.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
const
LBDelay = 100;
var
LimPP, dpPipe, dpMainValve, ActFlowSpeed: real;
begin
Limpp:=BPT[Round(i_bcp)][1];
ActFlowSpeed:=BPT[Round(i_bcp)][0];
if(i_bcp=i_bcpNo)then limpp:=0.0;
if(i_bcp=-1)then limpp:=7;
cp:=cp+20*Min0R(abs(Limpp-cp),0.05)*PR(cp,Limpp)*dt/1;
Limpp:=cp;
dpPipe:=Min0R(HP,Limpp);
dpMainValve:=PF(dpPipe,pp,ActFlowSpeed/(LBDelay))*dt;
if(Round(i_bcp)=i_bcpNo)then
begin
dpMainValve:=PF(0,pp,(ActFlowSpeed)/(LBDelay))*dt;
end;
GetPF:=dpMainValve;
end;
procedure Ttest.Init(press: real);
begin
CP:= press;
end;
//---FD1---
function TFD1.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
var dp, temp: real;
begin
// MaxBP:=4;
// temp:=Min0R(i_bcp*MaxBP,Min0R(5.0,HP));
temp:=Min0R(i_bcp*MaxBP,HP); //0011
dp:=10*Min0R(abs(temp-BP),0.1)*PF(temp,BP,0.0006*(2+Byte(temp>BP)))*dt*Speed;
BP:=BP-dp;
GetPF:=-dp;
end;
procedure TFD1.Init(press: real);
begin
BP:=0;
MaxBP:=press;
Time:=false;
TimeEP:=false;
Speed:=1;
end;
function TFD1.GetCP: real;
begin
GetCP:=BP;
end;
procedure TFD1.SetSpeed(nSpeed: real);
begin
Speed:=nSpeed;
end;
//---KNORR---
function TH1405.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
var dp, temp, A: real;
begin
pp:=Min0R(pp,MaxBP);
if i_bcp>0.5 then
begin
temp:=Min0R(MaxBP,HP);
A:=2*(i_bcp-0.5)*0.0011;
BP:=Max0R(BP,pp);
end
else
begin
temp:=0;
A:=0.2*(0.5-i_bcp)*0.0033;
BP:=Min0R(BP,pp);
end;
dp:=PF(temp,BP,A)*dt;
BP:=BP-dp;
GetPF:=-dp;
end;
procedure TH1405.Init(press: real);
begin
BP:=0;
MaxBP:=press;
Time:=true;
TimeEP:=false;
end;
function TH1405.GetCP: real;
begin
GetCP:=BP;
end;
//---FVel6---
function TFVel6.GetPF(i_bcp:real; pp, hp, dt, ep: real): real;
const
LBDelay = 100;
var
LimPP, dpPipe, dpMainValve, ActFlowSpeed: real;
begin
Limpp:=Min0R(5*Byte(i_bcp<3.5),hp);
if (i_bcp>=3.5) and ((i_bcp<4.3)or(i_bcp>5.5)) then
ActFlowSpeed:=0
else if (i_bcp>4.3) and (i_bcp<4.8) then
ActFlowSpeed:=4*(i_bcp-4.3) //konsultacje wawa1 - bylo 8
else if (i_bcp<4) then
ActFlowSpeed:=2
else
ActFlowSpeed:=4;
dpMainValve:=PF(Limpp,pp,ActFlowSpeed/(LBDelay))*dt;
Sounds[s_fv4a_e]:=0;
Sounds[s_fv4a_u]:=0;
Sounds[s_fv4a_b]:=0;
if(i_bcp<3.5)then Sounds[s_fv4a_u]:=-dpMainValve else
if(i_bcp<4.8)then Sounds[s_fv4a_b]:=dpMainValve else
if(i_bcp<5.5)then Sounds[s_fv4a_e]:=dpMainValve;
GetPF:=dpMainValve;
if(i_bcp<-0.5)then
EPS:=-1
else if(i_bcp>0.5)and(i_bcp<4.7)then
EPS:=1
else
EPS:=0;
// EPS:=i_bcp*Byte(i_bcp<2)
end;
function TFVel6.GetCP: real;
begin
GetCP:=EPS;
end;
function TFVel6.GetPos(i: byte): real;
const
table: array[0..10] of real = (-1,6,-1,0,6,4,4.7,5,-1,0,1);
begin
GetPos:=table[i];
end;
function TFVel6.GetSound(i: byte): real;
begin
if i>2 then
GetSound:=0
else
GetSound:=Sounds[i];
end;
procedure TFVel6.Init(press: real);
begin
Time:=true;
TimeEP:=true;
end;
end.