Exemplo n.º 1
0
        private double SpinUp()
        {
            double EngPower_HP;

            running      = false;
            EngStarting  = true;
            fuelFlow_pph = 0.0;

            if (!GeneratorPower)
            {
                EngStarting = false;
                phase       = phaseType.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     = phaseType.tpOff;
                StartTime = -1;
            }

            ConsumeFuel(); // for possible setting Starved = false when fuel tank
            // is refilled (fuel crossfeed etc.)

            return(EngPower_HP);
        }
Exemplo n.º 2
0
        private double Start()
        {
            double EngPower_HP = 0.0, 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        = phaseType.tpRun;
                    running      = true;
                    Starter      = false;
                    cranking     = false;
                    fuelFlow_pph = 0;
                    EngPower_HP  = 0.0;
                }
            }
            else
            {                 // no start if N2 < 15% or Starved
                phase   = phaseType.tpOff;
                Starter = false;
            }

            ConsumeFuel();

            return(EngPower_HP);
        }
Exemplo n.º 3
0
        private double Run()
        {
            //TODO check it. Not used double idlethrust, milthrust;
            double thrust = 0.0, EngPower_HP, eff_coef;

            running = true; Starter = false; EngStarting = false;

            //---
            double old_N1 = N1;

            N1 = ExpSeek(N1, IdleN1 + ThrottleCmd * N1_factor, Idle_Max_Delay, Idle_Max_Delay * 2.4);

            EngPower_HP  = EnginePowerRPM_N1.GetValue(Prop_RPM, N1);
            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 = phaseType.tpOff;
            }
            if (starved)
            {
                phase = phaseType.tpOff;
            }

            return(EngPower_HP);
        }
Exemplo n.º 4
0
        private void Load(FDMExecutive exec, XmlElement element)
        {
            string property_prefix = "propulsion/engine[" + engineNumber + "]/";

            IdleFF          = -1;
            MaxStartingTime = 999999; //very big timeout -> infinite
            Ielu_max_torque = -1;

            // ToDo: Need to make sure units are properly accounted for below.
            string     token;
            XmlElement tmpElem;

            foreach (XmlNode currentNode in element.ChildNodes)
            {
                if (currentNode.NodeType == XmlNodeType.Element)
                {
                    tmpElem = currentNode as XmlElement;
                    token   = tmpElem.LocalName;
                    if (token.Equals("milthrust"))
                    {
                        MilThrust = FormatHelper.ValueAsNumberConvertTo(tmpElem, "LBS");
                    }
                    else if (token.Equals("idlen1"))
                    {
                        IdleN1 = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("idlen2"))
                    {
                        IdleN2 = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("maxn1"))
                    {
                        MaxN1 = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("maxn2"))
                    {
                        MaxN2 = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("betarangeend"))
                    {
                        BetaRangeThrottleEnd = FormatHelper.ValueAsNumber(tmpElem) / 100.0;
                    }
                    else if (token.Equals("reversemaxpower"))
                    {
                        ReverseMaxPower = FormatHelper.ValueAsNumber(tmpElem) / 100.0;
                    }
                    else if (token.Equals("maxpower"))
                    {
                        MaxPower = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("idlefuelflow"))
                    {
                        IdleFF = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("psfc"))
                    {
                        PSFC = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("n1idle_max_delay"))
                    {
                        Idle_Max_Delay = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("maxstartingtime"))
                    {
                        MaxStartingTime = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("startern1"))
                    {
                        StarterN1 = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("ielumaxtorque"))
                    {
                        Ielu_max_torque = FormatHelper.ValueAsNumber(tmpElem);
                    }
                    else if (token.Equals("itt_delay"))
                    {
                        ITT_Delay = FormatHelper.ValueAsNumber(tmpElem);
                    }

                    else if (token.Equals("table"))
                    {
                        string name = tmpElem.GetAttribute("name");
                        if (name.Equals("EnginePowerVC"))
                        {
                            EnginePowerVC = new Table(exec.PropertyManager, tmpElem);
                        }
                        else if (name.Equals("EnginePowerRPM_N1"))
                        {
                            EnginePowerRPM_N1 = new Table(exec.PropertyManager, tmpElem);
                        }
                        else if (name.Equals("ITT_N1"))
                        {
                            ITT_N1 = new Table(exec.PropertyManager, tmpElem);
                        }
                        else
                        {
                            if (log.IsErrorEnabled)
                            {
                                log.Error("Unknown table type: " + name + " in turbine definition.");
                            }
                            throw new Exception("Unknown table type: " + name + " in turbine definition.");
                        }
                    }
                }
            }

            // Pre-calculations and initializations

            delay        = 1;
            N1_factor    = MaxN1 - IdleN1;
            N2_factor    = MaxN2 - IdleN2;
            OilTemp_degK = (exec.Auxiliary.TotalTemperature - 491.69) * 0.5555556 + 273.0;
            if (IdleFF == -1)
            {
                IdleFF = Math.Pow(MilThrust, 0.2) * 107.0;                // just an estimate
            }
            if (log.IsDebugEnabled)
            {
                log.Debug("ENG POWER:" + EnginePowerRPM_N1.GetValue(1200, 90));
            }
        }