16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-19 20:19:18 +02:00

Set dp branch as trunk

This commit is contained in:
ShaXbee
2015-04-03 13:34:06 +00:00
commit 45f4c0d98a
132 changed files with 94789 additions and 0 deletions

590
Mover.cpp Normal file
View File

@@ -0,0 +1,590 @@
//---------------------------------------------------------------------------
#include "Mover.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
// Ra: tu nale¿y przenosiæ funcje z mover.pas, które nie s¹ z niego wywo³ywane.
// Jeœli jakieœ zmienne nie s¹ u¿ywane w mover.pas, te¿ mo¿na je przenosiæ.
// Przeniesienie wszystkiego na raz zrobi³o by zbyt wielki chaos do ogarniêcia.
const dEpsilon=0.01; //1cm (zale¿y od typu sprzêgu...)
__fastcall TMoverParameters::TMoverParameters(double VelInitial,AnsiString TypeNameInit,AnsiString NameInit,
int LoadInitial,AnsiString LoadTypeInitial,int Cab)
: T_MoverParameters(VelInitial,TypeNameInit,NameInit,LoadInitial,LoadTypeInitial,Cab)
{//g³ówny konstruktor
DimHalf.x=0.5*Dim.W; //po³owa szerokoœci, OX jest w bok?
DimHalf.y=0.5*Dim.L; //po³owa d³ugoœci, OY jest do przodu?
DimHalf.z=0.5*Dim.H; //po³owa wysokoœci, OZ jest w górê?
//BrakeLevelSet(-2); //Pascal ustawia na 0, przestawimy na odciêcie (CHK jest jeszcze nie wczytane!)
bPantKurek3=true; //domyœlnie zbiornik pantografu po³¹czony jest ze zbiornikiem g³ównym
iProblem=0; //pojazd w pe³ni gotowy do ruchu
iLights[0]=iLights[1]=0; //œwiat³a zgaszone
};
double __fastcall TMoverParameters::Distance(const TLocation &Loc1,const TLocation &Loc2,const TDimension &Dim1,const TDimension &Dim2)
{//zwraca odleg³oœæ pomiêdzy pojazdami (Loc1) i (Loc2) z uwzglêdnieneim ich d³ugoœci (kule!)
return hypot(Loc2.X-Loc1.X,Loc1.Y-Loc2.Y)-0.5*(Dim2.L+Dim1.L);
};
double __fastcall TMoverParameters::Distance(const vector3 &s1, const vector3 &s2, const vector3 &d1, const vector3 &d2)
{//obliczenie odleg³oœci prostopad³oœcianów o œrodkach (s1) i (s2) i wymiarach (d1) i (d2)
//return 0.0; //bêdzie zg³aszaæ warning - funkcja do usuniêcia, chyba ¿e siê przyda...
};
double __fastcall TMoverParameters::CouplerDist(Byte Coupler)
{//obliczenie odleg³oœci pomiêdzy sprzêgami (kula!)
return Couplers[Coupler].CoupleDist=Distance(Loc,Couplers[Coupler].Connected->Loc,Dim,Couplers[Coupler].Connected->Dim); //odleg³oœæ pomiêdzy sprzêgami (kula!)
};
bool __fastcall TMoverParameters::Attach(Byte ConnectNo,Byte ConnectToNr,TMoverParameters *ConnectTo,Byte CouplingType,bool Forced)
{//³¹czenie do swojego sprzêgu (ConnectNo) pojazdu (ConnectTo) stron¹ (ConnectToNr)
//Ra: zwykle wykonywane dwukrotnie, dla ka¿dego pojazdu oddzielnie
//Ra: trzeba by odró¿niæ wymóg dociœniêcia od uszkodzenia sprzêgu przy podczepianiu AI do sk³adu
if (ConnectTo) //jeœli nie pusty
{
if (ConnectToNr!=2) Couplers[ConnectNo].ConnectedNr=ConnectToNr; //2=nic nie pod³¹czone
TCouplerType ct=ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].CouplerType; //typ sprzêgu pod³¹czanego pojazdu
Couplers[ConnectNo].Connected=ConnectTo; //tak podpi¹æ (do siebie) zawsze mo¿na, najwy¿ej bêdzie wirtualny
CouplerDist(ConnectNo); //przeliczenie odleg³oœci pomiêdzy sprzêgami
if (CouplingType==ctrain_virtual) return false; //wirtualny wiêcej nic nie robi
if (Forced?true:((Couplers[ConnectNo].CoupleDist<=dEpsilon)&&(Couplers[ConnectNo].CouplerType!=NoCoupler)&&(Couplers[ConnectNo].CouplerType==ct)))
{//stykaja sie zderzaki i kompatybilne typy sprzegow, chyba ¿e ³¹czenie na starcie
if (Couplers[ConnectNo].CouplingFlag==ctrain_virtual) //jeœli wczeœniej nie by³o po³¹czone
{//ustalenie z której strony rysowaæ sprzêg
Couplers[ConnectNo].Render=true; //tego rysowaæ
ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].Render=false; //a tego nie
};
Couplers[ConnectNo].CouplingFlag=CouplingType; //ustawienie typu sprzêgu
//if (CouplingType!=ctrain_virtual) //Ra: wirtualnego nie ³¹czymy zwrotnie!
//{//jeœli ³¹czenie sprzêgiem niewirtualnym, ustawiamy po³¹czenie zwrotne
ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag=CouplingType;
ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].Connected=this;
ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].CoupleDist=Couplers[ConnectNo].CoupleDist;
return true;
//}
//pod³¹czenie nie uda³o siê - jest wirtualne
}
}
return false; //brak pod³¹czanego pojazdu, zbyt du¿a odleg³oœæ, niezgodny typ sprzêgu, brak sprzêgu, brak haka
};
bool __fastcall TMoverParameters::Attach(Byte ConnectNo,Byte ConnectToNr,T_MoverParameters *ConnectTo,Byte CouplingType,bool Forced)
{//³¹czenie do (ConnectNo) pojazdu (ConnectTo) stron¹ (ConnectToNr)
return Attach(ConnectNo,ConnectToNr,(TMoverParameters*)ConnectTo,CouplingType,Forced);
};
int __fastcall TMoverParameters::DettachStatus(Byte ConnectNo)
{//Ra: sprawdzenie, czy odleg³oœæ jest dobra do roz³¹czania
//powinny byæ 3 informacje: =0 sprzêg ju¿ roz³¹czony, <0 da siê roz³¹czyæ. >0 nie da siê roz³¹czyæ
if (!Couplers[ConnectNo].Connected)
return 0; //nie ma nic, to roz³¹czanie jest OK
if ((Couplers[ConnectNo].CouplingFlag&ctrain_coupler)==0)
return -Couplers[ConnectNo].CouplingFlag; //hak nie po³¹czony - roz³¹czanie jest OK
if (TestFlag(DamageFlag,dtrain_coupling))
return -Couplers[ConnectNo].CouplingFlag; //hak urwany - roz³¹czanie jest OK
//ABu021104: zakomentowane 'and (CouplerType<>Articulated)' w warunku, nie wiem co to bylo, ale za to teraz dziala odczepianie... :) }
//if (CouplerType==Articulated) return false; //sprzêg nie do rozpiêcia - mo¿e byæ tylko urwany
//Couplers[ConnectNo].CoupleDist=Distance(Loc,Couplers[ConnectNo].Connected->Loc,Dim,Couplers[ConnectNo].Connected->Dim);
CouplerDist(ConnectNo);
if (Couplers[ConnectNo].CouplerType==Screw?Couplers[ConnectNo].CoupleDist<0.0:true)
return -Couplers[ConnectNo].CouplingFlag; //mo¿na roz³¹czaæ, jeœli dociœniêty
return (Couplers[ConnectNo].CoupleDist>0.2)?-Couplers[ConnectNo].CouplingFlag:Couplers[ConnectNo].CouplingFlag;
};
bool __fastcall TMoverParameters::Dettach(Byte ConnectNo)
{//rozlaczanie
if (!Couplers[ConnectNo].Connected) return true; //nie ma nic, to odczepiono
//with Couplers[ConnectNo] do
int i=DettachStatus(ConnectNo); //stan sprzêgu
if (i<0)
{//gdy scisniete zderzaki, chyba ze zerwany sprzeg (wirtualnego nie odpinamy z drugiej strony)
//Couplers[ConnectNo].Connected=NULL; //lepiej zostawic bo przeciez trzeba kontrolowac zderzenia odczepionych
Couplers[ConnectNo].Connected->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag=0; //pozostaje sprzêg wirtualny
Couplers[ConnectNo].CouplingFlag=0; //pozostaje sprzêg wirtualny
return true;
}
else if (i>0)
{//od³¹czamy wê¿e i resztê, pozostaje sprzêg fizyczny, który wymaga dociœniêcia (z wirtualnym nic)
Couplers[ConnectNo].CouplingFlag&=ctrain_coupler;
Couplers[ConnectNo].Connected->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag=Couplers[ConnectNo].CouplingFlag;
}
return false; //jeszcze nie roz³¹czony
};
void __fastcall TMoverParameters::SetCoupleDist()
{//przeliczenie odleg³oœci sprzêgów
if (Couplers[0].Connected)
{
CouplerDist(0);
if (CategoryFlag&2)
{//Ra: dla samochodów zderzanie kul to za ma³o
}
}
if (Couplers[1].Connected)
{
CouplerDist(1);
if (CategoryFlag&2)
{//Ra: dla samochodów zderzanie kul to za ma³o
}
}
};
bool __fastcall TMoverParameters::DirectionForward()
{
if ((MainCtrlPosNo>0)&&(ActiveDir<1)&&(MainCtrlPos==0))
{
++ActiveDir;
DirAbsolute=ActiveDir*CabNo;
if (DirAbsolute)
if (Battery) //jeœli bateria jest ju¿ za³¹czona
BatterySwitch(true); //to w ten oto durny sposób aktywuje siê CA/SHP
SendCtrlToNext("Direction",ActiveDir,CabNo);
return true;
}
else if ((ActiveDir==1)&&(MainCtrlPos==0)&&(TrainType==dt_EZT))
return MinCurrentSwitch(true); //"wysoki rozruch" EN57
return false;
};
// Nastawianie hamulców
void __fastcall TMoverParameters::BrakeLevelSet(double b)
{//ustawienie pozycji hamulca na wartoϾ (b) w zakresie od -2 do BrakeCtrlPosNo
//jedyny dopuszczalny sposób przestawienia hamulca zasadniczego
if (fBrakeCtrlPos==b) return; //nie przeliczaæ, jak nie ma zmiany
fBrakeCtrlPos=b;
BrakeCtrlPosR=b;
if (fBrakeCtrlPos<Handle->GetPos(bh_MIN))
fBrakeCtrlPos=Handle->GetPos(bh_MIN); //odciêcie
else
if (fBrakeCtrlPos>Handle->GetPos(bh_MAX))
fBrakeCtrlPos=Handle->GetPos(bh_MAX);
int x=floor(fBrakeCtrlPos); //jeœli odwo³ujemy siê do BrakeCtrlPos w poœrednich, to musi byæ obciête a nie zaokr¹gone
while ((x>BrakeCtrlPos)&&(BrakeCtrlPos<BrakeCtrlPosNo)) //jeœli zwiêkszy³o siê o 1
if (!T_MoverParameters::IncBrakeLevelOld()) break; //wyjœcie awaryjne
while ((x<BrakeCtrlPos)&&(BrakeCtrlPos>=-1)) //jeœli zmniejszy³o siê o 1
if (!T_MoverParameters::DecBrakeLevelOld()) break;
BrakePressureActual=BrakePressureTable[BrakeCtrlPos+2]; //skopiowanie pozycji
/*
//youBy: obawiam sie, ze tutaj to nie dziala :P
//Ra 2014-03: by³o tak zrobione, ¿e dzia³a³o - po ka¿dej zmianie pozycji by³a wywo³ywana ta funkcja
// if (BrakeSystem==Pneumatic?BrakeSubsystem==Oerlikon:false) //tylko Oerlikon akceptuje u³amki
if(false)
if (fBrakeCtrlPos>0.0)
{//wartoœci poœrednie wyliczamy tylko dla hamowania
double u=fBrakeCtrlPos-double(x); //u³amek ponad wartoœæ ca³kowit¹
if (u>0.0)
{//wyliczamy wartoœci wa¿one
BrakePressureActual.PipePressureVal+=-u*BrakePressureActual.PipePressureVal+u*BrakePressureTable[BrakeCtrlPos+1+2].PipePressureVal;
//BrakePressureActual.BrakePressureVal+=-u*BrakePressureActual.BrakePressureVal+u*BrakePressureTable[BrakeCtrlPos+1].BrakePressureVal; //to chyba nie bêdzie tak dzia³aæ, zw³aszcza w EN57
BrakePressureActual.FlowSpeedVal+=-u*BrakePressureActual.FlowSpeedVal+u*BrakePressureTable[BrakeCtrlPos+1+2].FlowSpeedVal;
}
}
*/
};
bool __fastcall TMoverParameters::BrakeLevelAdd(double b)
{//dodanie wartoœci (b) do pozycji hamulca (w tym ujemnej)
//zwraca false, gdy po dodaniu by³o by poza zakresem
BrakeLevelSet(fBrakeCtrlPos+b);
return b>0.0?(fBrakeCtrlPos<BrakeCtrlPosNo):(BrakeCtrlPos>-1.0); //true, jeœli mo¿na kontynuowaæ
};
bool __fastcall TMoverParameters::IncBrakeLevel()
{//nowa wersja na u¿ytek AI, false gdy osi¹gniêto pozycjê BrakeCtrlPosNo
return BrakeLevelAdd(1.0);
};
bool __fastcall TMoverParameters::DecBrakeLevel()
{//nowa wersja na u¿ytek AI, false gdy osi¹gniêto pozycjê -1
return BrakeLevelAdd(-1.0);
};
bool __fastcall TMoverParameters::ChangeCab(int direction)
{//zmiana kabiny i resetowanie ustawien
if (abs(ActiveCab+direction)<2)
{
// if (ActiveCab+direction=0) then LastCab:=ActiveCab;
ActiveCab=ActiveCab+direction;
if ((BrakeSystem==Pneumatic)&&(BrakeCtrlPosNo>0))
{
// if (BrakeHandle==FV4a) //!!!POBIERAÆ WARTOŒÆ Z KLASY ZAWORU!!!
// BrakeLevelSet(-2); //BrakeCtrlPos=-2;
// else if ((BrakeHandle==FVel6)||(BrakeHandle==St113))
// BrakeLevelSet(2);
// else
// BrakeLevelSet(1);
BrakeLevelSet(Handle->GetPos(bh_NP));
LimPipePress=PipePress;
ActFlowSpeed=0;
}
else
//if (TrainType=dt_EZT) and (BrakeCtrlPosNo>0) then
// BrakeCtrlPos:=5; //z Megapacka
//else
// BrakeLevelSet(0); //BrakeCtrlPos=0;
BrakeLevelSet(Handle->GetPos(bh_NP));
// if not TestFlag(BrakeStatus,b_dmg) then
// BrakeStatus:=b_off; //z Megapacka
MainCtrlPos=0;
ScndCtrlPos=0;
//Ra: to poni¿ej jest bez sensu - mo¿na przejœæ nie wy³¹czaj¹c
//if ((EngineType!=DieselEngine)&&(EngineType!=DieselElectric))
//{
// Mains=false;
// CompressorAllow=false;
// ConverterAllow=false;
//}
//ActiveDir=0;
//DirAbsolute=0;
return true;
}
return false;
};
bool __fastcall TMoverParameters::CurrentSwitch(int direction)
{//rozruch wysoki (true) albo niski (false)
//Ra: przenios³em z Train.cpp, nie wiem czy ma to sens
if (MaxCurrentSwitch(direction))
{if (TrainType!=dt_EZT)
return (MinCurrentSwitch(direction));
}
if (EngineType==DieselEngine) //dla 2Ls150
if (ShuntModeAllow)
if (ActiveDir==0) //przed ustawieniem kierunku
ShuntMode=direction;
return false;
};
void __fastcall TMoverParameters::UpdatePantVolume(double dt)
{//KURS90 - sprê¿arka pantografów; Ra 2014-07: teraz jest to zbiornik rozrz¹du, chocia¿ to jeszcze nie tak
if (EnginePowerSource.SourceType==CurrentCollector) //tylko jeœli pantografuj¹cy
{
//Ra 2014-07: zasadniczo, to istnieje zbiornik rozrz¹du i zbiornik pantografów - na razie mamy razem
//Ra 2014-07: kurek trójdrogowy ³¹czy spr.pom. z pantografami i wy³¹cznikiem ciœnieniowym WS
//Ra 2014-07: zbiornika rozrz¹du nie pompuje siê tu, tylko pantografy; potem mo¿na zamkn¹æ WS i odpaliæ resztê
if ((TrainType==dt_EZT)?(PantPress<ScndPipePress):bPantKurek3) //kurek zamyka po³¹czenie z ZG
{//zbiornik pantografu po³¹czony ze zbiornikiem g³ównym - ma³¹ sprê¿ark¹ siê tego nie napompuje
//Ra 2013-12: Niebugoc³aw mówi, ¿e w EZT nie ma potrzeby odcinaæ kurkiem
PantPress=EnginePowerSource.CollectorParameters.MaxPress; //ograniczenie ciœnienia do MaxPress (tylko w pantografach!)
if (PantPress>ScndPipePress) PantPress=ScndPipePress; //oraz do ScndPipePress
PantVolume=(PantPress+1)*0.1; //objêtoœæ, na wypadek odciêcia kurkiem
}
else
{//zbiornik g³ówny odciêty, mo¿na pompowaæ pantografy
if (PantCompFlag&&Battery) //w³¹czona bateria i ma³a sprê¿arka
PantVolume+=dt*(TrainType==dt_EZT?0.003:0.005)*(2*0.45-((0.1/PantVolume/10)-0.1))/0.45; //nape³nianie zbiornika pantografów
//Ra 2013-12: Niebugoc³aw mówi, ¿e w EZT nabija 1.5 raz wolniej ni¿ jak by³o 0.005
PantPress=(10.0*PantVolume)-1.0; //tu by siê przyda³a objêtoœæ zbiornika
}
if (!PantCompFlag&&(PantVolume>0.1))
PantVolume-=dt*0.0003; //nieszczelnoœci: 0.0003=0.3l/s
if (Mains) //nie wchodziæ w funkcjê bez potrzeby
if (EngineType==ElectricSeriesMotor) //nie dotyczy... czego w³aœciwie?
if (PantPress<EnginePowerSource.CollectorParameters.MinPress)
if ((TrainType&(dt_EZT|dt_ET40|dt_ET41|dt_ET42))?(GetTrainsetVoltage()<EnginePowerSource.CollectorParameters.MinV):true) //to jest trochê proteza; zasilanie cz³onu mo¿e byæ przez sprzêg WN
if (MainSwitch(false))
EventFlag=true; //wywalenie szybkiego z powodu niskiego ciœnienia
if (TrainType!=dt_EZT) //w EN57 pompuje siê tylko w silnikowym
//pierwotnie w CHK pantografy mia³y równie¿ rozrz¹dcze EZT
for (int b=0;b<=1;++b)
if (TestFlag(Couplers[b].CouplingFlag,ctrain_controll))
if (Couplers[b].Connected->PantVolume<PantVolume) //bo inaczej trzeba w obydwu cz³onach przestawiaæ
Couplers[b].Connected->PantVolume=PantVolume; //przekazanie ciœnienia do s¹siedniego cz³onu
//czy np. w ET40, ET41, ET42 pantografy cz³onów maj¹ po³¹czenie pneumatyczne?
//Ra 2014-07: raczej nie - najpierw siê za³¹cza jeden cz³on, a potem mo¿na podnieœæ w drugim
}
else
{//a tu coœ dla SM42 i SM31, aby pokazywaæ na manometrze
PantPress=CntrlPipePress;
}
};
void __fastcall TMoverParameters::UpdateBatteryVoltage(double dt)
{//przeliczenie obci¹¿enia baterii
double sn1,sn2,sn3,sn4,sn5; //Ra: zrobiæ z tego amperomierz NN
if ((BatteryVoltage>0)&&(EngineType!=DieselEngine)&&(EngineType!=WheelsDriven)&&(NominalBatteryVoltage>0))
{
if ((NominalBatteryVoltage/BatteryVoltage<1.22)&&Battery)
{//110V
if (!ConverterFlag)
sn1=(dt*2.0); //szybki spadek do ok 90V
else sn1=0;
if (ConverterFlag)
sn2=-(dt*2.0); //szybki wzrost do 110V
else sn2=0;
if (Mains)
sn3=(dt*0.05);
else sn3=0;
if (iLights[0]&63) //64=blachy, nie ci¹gn¹ pr¹du //rozpisaæ na poszczególne ¿arówki...
sn4=dt*0.003;
else sn4=0;
if (iLights[1]&63) //64=blachy, nie ci¹gn¹ pr¹du
sn5=dt*0.001;
else sn5=0;
};
if ((NominalBatteryVoltage/BatteryVoltage>=1.22)&&Battery)
{//90V
if (PantCompFlag)
sn1=(dt*0.0046);
else sn1=0;
if (ConverterFlag)
sn2=-(dt*50); //szybki wzrost do 110V
else sn2=0;
if (Mains)
sn3=(dt*0.001);
else sn3=0;
if (iLights[0]&63) //64=blachy, nie ci¹gn¹ pr¹du
sn4=(dt*0.0030);
else sn4=0;
if (iLights[1]&63) //64=blachy, nie ci¹gn¹ pr¹du
sn5=(dt*0.0010);
else sn5=0;
};
if (!Battery)
{
if (NominalBatteryVoltage/BatteryVoltage<1.22)
sn1=dt*50;
else
sn1=0;
sn2=dt*0.000001;
sn3=dt*0.000001;
sn4=dt*0.000001;
sn5=dt*0.000001; //bardzo powolny spadek przy wy³¹czonych bateriach
};
BatteryVoltage-=(sn1+sn2+sn3+sn4+sn5);
if (NominalBatteryVoltage/BatteryVoltage>1.57)
if (MainSwitch(false)&&(EngineType!=DieselEngine)&&(EngineType!=WheelsDriven))
EventFlag=true; //wywalanie szybkiego z powodu zbyt niskiego napiecia
if (BatteryVoltage>NominalBatteryVoltage)
BatteryVoltage=NominalBatteryVoltage; //wstrzymanie ³adowania pow. 110V
if (BatteryVoltage<0.01)
BatteryVoltage=0.01;
}
else
if (NominalBatteryVoltage==0)
BatteryVoltage=0;
else
BatteryVoltage=90;
};
/* Ukrotnienie EN57:
1 //uk³ad szeregowy
2 //uk³ad równoleg³y
3 //bocznik 1
4 //bocznik 2
5 //bocznik 3
6 //do przodu
7 //do ty³u
8 //1 przyspieszenie
9 //minus obw. 2 przyspieszenia
10 //jazda na oporach
11 //SHP
12A //podnoszenie pantografu przedniego
12B //podnoszenie pantografu tylnego
13A //opuszczanie pantografu przedniego
13B //opuszczanie wszystkich pantografów
14 //za³¹czenie WS
15 //rozrz¹d (WS, PSR, wa³ ku³akowy)
16 //odblok PN
18 //sygnalizacja przetwornicy g³ównej
19 //luzowanie EP
20 //hamowanie EP
21 //rezerwa** (1900+: zamykanie drzwi prawych)
22 //za³. przetwornicy g³ównej
23 //wy³. przetwornicy g³ównej
24 //za³. przetw. oœwietlenia
25 //wy³. przetwornicy oœwietlenia
26 //sygnalizacja WS
28 //sprê¿arka
29 //ogrzewanie
30 //rezerwa* (1900+: zamykanie drzwi lewych)
31 //otwieranie drzwi prawych
32H //zadzia³anie PN siln. trakcyjnych
33 //sygna³ odjazdu
34 //rezerwa (sygnalizacja poœlizgu)
35 //otwieranie drzwi lewych
ZN //masa
*/
double __fastcall TMoverParameters::ComputeMovement
(double dt,double dt1,
const TTrackShape &Shape,TTrackParam &Track,TTractionParam &ElectricTraction,
const TLocation &NewLoc,TRotation &NewRot
)
{//trzeba po ma³u przenosiæ tu tê funkcjê
double d;
T_MoverParameters::ComputeMovement(dt,dt1,Shape,Track,ElectricTraction,NewLoc,NewRot);
if (Power>1.0) //w rozrz¹dczym nie (jest b³¹d w FIZ!) - Ra 2014-07: teraz we wszystkich
UpdatePantVolume(dt); //Ra 2014-07: obs³uga zbiornika rozrz¹du oraz pantografów
if (EngineType==WheelsDriven)
d=CabNo*dL; //na chwile dla testu
else
d=dL;
DistCounter=DistCounter+fabs(dL)/1000.0;
dL=0;
//koniec procedury, tu nastepuja dodatkowe procedury pomocnicze
//sprawdzanie i ewentualnie wykonywanie->kasowanie poleceñ
if (LoadStatus>0) //czas doliczamy tylko jeœli trwa (roz)³adowanie
LastLoadChangeTime=LastLoadChangeTime+dt; //czas (roz)³adunku
RunInternalCommand();
//automatyczny rozruch
if (EngineType==ElectricSeriesMotor)
if (AutoRelayCheck())
SetFlag(SoundFlag,sound_relay);
/*
else {McZapkie-041003: aby slychac bylo przelaczniki w sterowniczym}
if (EngineType=None) and (MainCtrlPosNo>0) then
for b:=0 to 1 do
with Couplers[b] do
if TestFlag(CouplingFlag,ctrain_controll) then
if Connected^.Power>0.01 then
SoundFlag:=SoundFlag or Connected^.SoundFlag;
*/
if (EngineType==DieselEngine)
if (dizel_Update(dt))
SetFlag(SoundFlag,sound_relay);
//uklady hamulcowe:
if (VeselVolume>0)
Compressor=CompressedVolume/VeselVolume;
else
{
Compressor=0;
CompressorFlag=false;
};
ConverterCheck();
if (CompressorSpeed>0.0) //sprê¿arka musi mieæ jak¹œ niezerow¹ wydajnoœæ
CompressorCheck(dt); //¿eby rozwa¿aæ jej za³¹czenie i pracê
UpdateBrakePressure(dt);
UpdatePipePressure(dt);
UpdateBatteryVoltage(dt);
UpdateScndPipePressure(dt); // druga rurka, youBy
//hamulec antypoœlizgowy - wy³¹czanie
if ((BrakeSlippingTimer>0.8)&&(ASBType!=128)) //ASBSpeed=0.8
Hamulec->ASB(0);
//SetFlag(BrakeStatus,-b_antislip);
BrakeSlippingTimer=BrakeSlippingTimer+dt;
//sypanie piasku - wy³¹czone i piasek siê nie koñczy - b³êdy AI
//if AIControllFlag then
// if SandDose then
// if Sand>0 then
// begin
// Sand:=Sand-NPoweredAxles*SandSpeed*dt;
// if Random<dt then SandDose:=false;
// end
// else
// begin
// SandDose:=false;
// Sand:=0;
// end;
//czuwak/SHP
//if (Vel>10) and (not DebugmodeFlag) then
if (!DebugModeFlag)
SecuritySystemCheck(dt1);
return d;
};
double __fastcall TMoverParameters::FastComputeMovement
(double dt,
const TTrackShape &Shape,TTrackParam &Track,
const TLocation &NewLoc,TRotation &NewRot
)
{//trzeba po ma³u przenosiæ tu tê funkcjê
double d;
T_MoverParameters::FastComputeMovement(dt,Shape,Track,NewLoc,NewRot);
if (Power>1.0) //w rozrz¹dczym nie (jest b³¹d w FIZ!)
UpdatePantVolume(dt); //Ra 2014-07: obs³uga zbiornika rozrz¹du oraz pantografów
if (EngineType==WheelsDriven)
d=CabNo*dL; //na chwile dla testu
else
d=dL;
DistCounter=DistCounter+fabs(dL)/1000.0;
dL=0;
//koniec procedury, tu nastepuja dodatkowe procedury pomocnicze
//sprawdzanie i ewentualnie wykonywanie->kasowanie poleceñ
if (LoadStatus>0) //czas doliczamy tylko jeœli trwa (roz)³adowanie
LastLoadChangeTime=LastLoadChangeTime+dt; //czas (roz)³adunku
RunInternalCommand();
if (EngineType==DieselEngine)
if (dizel_Update(dt))
SetFlag(SoundFlag,sound_relay);
//uklady hamulcowe:
if (VeselVolume>0)
Compressor=CompressedVolume/VeselVolume;
else
{
Compressor=0;
CompressorFlag=false;
};
ConverterCheck();
if (CompressorSpeed>0.0) //sprê¿arka musi mieæ jak¹œ niezerow¹ wydajnoœæ
CompressorCheck(dt); //¿eby rozwa¿aæ jej za³¹czenie i pracê
UpdateBrakePressure(dt);
UpdatePipePressure(dt);
UpdateScndPipePressure(dt); // druga rurka, youBy
UpdateBatteryVoltage(dt);
//hamulec antyposlizgowy - wy³¹czanie
if ((BrakeSlippingTimer>0.8)&&(ASBType!=128)) //ASBSpeed=0.8
Hamulec->ASB(0);
BrakeSlippingTimer=BrakeSlippingTimer+dt;
return d;
};
double __fastcall TMoverParameters::ShowEngineRotation(int VehN)
{//pokazywanie obrotów silnika, równie¿ dwóch dalszych pojazdów (3×SN61)
int b;
switch (VehN)
{//numer obrotomierza
case 1:
return fabs(enrot);
case 2:
for (b=0;b<=1;++b)
if (TestFlag(Couplers[b].CouplingFlag,ctrain_controll))
if (Couplers[b].Connected->Power>0.01)
return fabs(Couplers[b].Connected->enrot);
break;
case 3: //to nie uwzglêdnia ewentualnego odwrócenia pojazdu w œrodku
for (b=0;b<=1;++b)
if (TestFlag(Couplers[b].CouplingFlag,ctrain_controll))
if (Couplers[b].Connected->Power>0.01)
if (TestFlag(Couplers[b].Connected->Couplers[b].CouplingFlag,ctrain_controll))
if (Couplers[b].Connected->Couplers[b].Connected->Power>0.01)
return fabs(Couplers[b].Connected->Couplers[b].Connected->enrot);
break;
};
return 0.0;
};
void __fastcall TMoverParameters::ConverterCheck()
{//sprawdzanie przetwornicy
if (ConverterAllow&&Mains)
ConverterFlag=true;
else
ConverterFlag=false;
};
int __fastcall TMoverParameters::ShowCurrent(Byte AmpN)
{//odczyt ampera¿u
switch (EngineType)
{case ElectricInductionMotor:
switch (AmpN)
{//do asynchronicznych
case 1: return WindingRes*Mm/Vadd;
case 2: return dizel_fill*WindingRes;
default: return T_MoverParameters::ShowCurrent(AmpN);
}
break;
case DieselElectric:
return fabs(Im);
break;
default:
return T_MoverParameters::ShowCurrent(AmpN);
}
};