📄 fgturboprop.cpp
字号:
EngPower_HP *= EnginePowerVC->GetValue(); if (EngPower_HP > MaxPower) EngPower_HP = MaxPower; eff_coef = 9.333 - (N1)/12; // 430%Fuel at 60%N1 FuelFlow_pph = PSFC * EngPower_HP * eff_coef; Eng_Temperature = ExpSeek(&Eng_Temperature,Eng_ITT_degC,300,400); double ITT_goal = ITT_N1->GetValue((N1-old_N1)*300+N1,1); Eng_ITT_degC = ExpSeek(&Eng_ITT_degC,ITT_goal,ITT_Delay,ITT_Delay*1.2); OilPressure_psi = (N1/100.0*0.25+(0.1-(OilTemp_degK-273.15)*0.1/80.0)*N1/100.0) / 7692.0e-6; //from MPa to psi//--- EPR = 1.0 + thrust/MilThrust; OilTemp_degK = Seek(&OilTemp_degK, 353.15, 0.4-N1*0.001, 0.04); ConsumeFuel(); if (Cutoff) phase = tpOff; if (Starved) phase = tpOff; return EngPower_HP;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGTurboProp::SpinUp(void){ double EngPower_HP; Running = false; EngStarting = true; FuelFlow_pph = 0.0; if (!GeneratorPower) { EngStarting=false; phase=tpOff; StartTime = -1; return 0.0; } N1 = ExpSeek(&N1, StarterN1, Idle_Max_Delay * 6, Idle_Max_Delay * 2.4); Eng_Temperature = ExpSeek(&Eng_Temperature,TAT,300,400); double ITT_goal = ITT_N1->GetValue(N1,0.1) + ((N1>20) ? 0.0 : (20-N1)/20.0 * Eng_Temperature); Eng_ITT_degC = ExpSeek(&Eng_ITT_degC,ITT_goal,ITT_Delay,ITT_Delay*1.2); OilTemp_degK = ExpSeek(&OilTemp_degK,273.15 + TAT, 400 , 400); OilPressure_psi = (N1/100.0*0.25+(0.1-(OilTemp_degK-273.15)*0.1/80.0)*N1/100.0) / 7692.0e-6; //from MPa to psi NozzlePosition = 1.0; EngPower_HP = EnginePowerRPM_N1->GetValue(Prop_RPM,N1); EngPower_HP *= EnginePowerVC->GetValue(); if (EngPower_HP > MaxPower) EngPower_HP = MaxPower; if (StartTime>=0) StartTime+=dt; if (StartTime > MaxStartingTime && MaxStartingTime > 0) { //start failed due timeout phase = tpOff; StartTime = -1; } ConsumeFuel(); // for possible setting Starved = false when fuel tank // is refilled (fuel crossfeed etc.) return EngPower_HP;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGTurboProp::Start(void){ double EngPower_HP,eff_coef; EngStarting = false; if ((N1 > 15.0) && !Starved) { // minimum 15% N2 needed for start double old_N1 = N1; Cranking = true; // provided for sound effects signal if (N1 < IdleN1) { EngPower_HP = EnginePowerRPM_N1->GetValue(Prop_RPM,N1); EngPower_HP *= EnginePowerVC->GetValue(); if (EngPower_HP > MaxPower) EngPower_HP = MaxPower; N1 = ExpSeek(&N1, IdleN1*1.1, Idle_Max_Delay*4, Idle_Max_Delay * 2.4); eff_coef = 9.333 - (N1)/12; // 430%Fuel at 60%N1 FuelFlow_pph = PSFC * EngPower_HP * eff_coef; Eng_Temperature = ExpSeek(&Eng_Temperature,Eng_ITT_degC,300,400); double ITT_goal = ITT_N1->GetValue((N1-old_N1)*300+N1,1); Eng_ITT_degC = ExpSeek(&Eng_ITT_degC,ITT_goal,ITT_Delay,ITT_Delay*1.2); OilPressure_psi = (N1/100.0*0.25+(0.1-(OilTemp_degK-273.15)*0.1/80.0)*N1/100.0) / 7692.0e-6; //from MPa to psi OilTemp_degK = Seek(&OilTemp_degK, 353.15, 0.4-N1*0.001, 0.04); } else { phase = tpRun; Running = true; Starter = false; Cranking = false; FuelFlow_pph = 0; EngPower_HP=0.0; } } else { // no start if N2 < 15% or Starved phase = tpOff; Starter = false; } ConsumeFuel(); return EngPower_HP;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGTurboProp::CalcFuelNeed(void){ double dT = State->Getdt() * Propulsion->GetRate(); FuelFlowRate = FuelFlow_pph / 3600.0; FuelExpended = FuelFlowRate * dT; return FuelExpended;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGTurboProp::Seek(double *var, double target, double accel, double decel){ double v = *var; if (v > target) { v -= dt * decel; if (v < target) v = target; } else if (v < target) { v += dt * accel; if (v > target) v = target; } return v;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGTurboProp::ExpSeek(double *var, double target, double accel_tau, double decel_tau){// exponential delay instead of the linear delay used in Seek double v = *var; if (v > target) { v = (v - target) * exp ( -dt / decel_tau) + target; } else if (v < target) { v = (target - v) * (1 - exp ( -dt / accel_tau)) + v; } return v;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGTurboProp::SetDefaults(void){ Name = "Not defined"; N1 = N2 = 0.0; Type = etTurboprop; MilThrust = 10000.0; IdleN1 = 30.0; IdleN2 = 60.0; MaxN1 = 100.0; MaxN2 = 100.0; ThrottleCmd = 0.0; InletPosition = 1.0; NozzlePosition = 1.0; Reversed = false; Cutoff = true; phase = tpOff; Stalled = false; Seized = false; Overtemp = false; Fire = false; Eng_ITT_degC = 0.0; GeneratorPower=true; Condition = 0; Ielu_intervent=false; Idle_Max_Delay = 1.0;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%string FGTurboProp::GetEngineLabels(string delimeter){ std::ostringstream buf; buf << Name << "_N1[" << EngineNumber << "]" << delimeter << Name << "_N2[" << EngineNumber << "]" << delimeter << Name << "__PwrAvailJVK[" << EngineNumber << "]" << delimeter << Thruster->GetThrusterLabels(EngineNumber, delimeter); return buf.str();}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%string FGTurboProp::GetEngineValues(string delimeter){ std::ostringstream buf; buf << N1 << delimeter << N2 << delimeter << Thruster->GetThrusterValues(EngineNumber,delimeter); return buf.str();}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%int FGTurboProp::InitRunning(void) { State->SuspendIntegration(); Cutoff=false; Running=true; N2=16.0; Calculate(); State->ResumeIntegration(); return phase==tpRun;}void FGTurboProp::bindmodel(){ char property_name[80];// ToDo: Do a proper Tie here, this should be read only. snprintf(property_name, 80, "propulsion/engine[%u]/n1", EngineNumber); PropertyManager->Tie( property_name, &N1); snprintf(property_name, 80, "propulsion/engine[%u]/n2", EngineNumber); PropertyManager->Tie( property_name, &N2); snprintf(property_name, 80, "propulsion/engine[%u]/reverser", EngineNumber); PropertyManager->Tie( property_name, &Reversed);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%// The bitmasked value choices are as follows:// unset: In this case (the default) JSBSim would only print// out the normally expected messages, essentially echoing// the config files as they are read. If the environment// variable is not set, debug_lvl is set to 1 internally// 0: This requests JSBSim not to output any messages// whatsoever.// 1: This value explicity requests the normal JSBSim// startup messages// 2: This value asks for a message to be printed out when// a class is instantiated// 4: When this value is set, a message is displayed when a// FGModel object executes its Run() method// 8: When this value is set, various runtime state variables// are printed out periodically// 16: When set various parameters are sanity checked and// a message is printed out when they go out of boundsvoid FGTurboProp::Debug(int from){ if (debug_lvl <= 0) return; if (debug_lvl & 1) { // Standard console startup message output if (from == 0) { // Constructor } if (from == 2) { // called from Load() cout << "\n ****MUJ MOTOR TURBOPROP****\n"; cout << "\n Engine Name: " << Name << endl; cout << " MilThrust: " << MilThrust << endl; cout << " IdleN1: " << IdleN1 << endl; cout << " MaxN1: " << MaxN1 << endl; cout << endl; } } if (debug_lvl & 2 ) { // Instantiation/Destruction notification if (from == 0) cout << "Instantiated: FGTurboProp" << endl; if (from == 1) cout << "Destroyed: FGTurboProp" << endl; } if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects } if (debug_lvl & 8 ) { // Runtime state variables } if (debug_lvl & 16) { // Sanity checking } if (debug_lvl & 64) { if (from == 0) { // Constructor cout << IdSrc << endl; cout << IdHdr << endl; } }}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -