From: <cas...@co...> - 2012-10-23 16:53:31
|
Hi, First, thank you to all who answered my query, especially Jon for the details on the new tanking system. I've designed a slightly different system that you all might want to consider. A small portion of the code is in FG. Starting in controls.cxx (version 2.4) you will find at line #312 _tiedProperties.Tie( "feed_tank", this, index, &FGControls::get_feed_tank, &FGControls::set_feed_tank ) ->setAttribute( SGPropertyNode::ARCHIVE, true ); then at line #944 void FGControls::set_feed_tank( int engine, int tank ) { if ( engine == ALL_ENGINES ) { for ( int i = 0; i < MAX_ENGINES; i++ ) { feed_tank[i] = tank; SG_CLAMP_RANGE<int>( feed_tank[i], -1, 8 ); } } else { if ( (engine >= 0) && (engine < MAX_ENGINES) ) { feed_tank[engine] = tank; SG_CLAMP_RANGE<int>( feed_tank[engine], -1, 8 ); } } } where the value of feed_tank[engine] is the number of the tank that feeds the engine. This also provided the ability to set the value via a network interface. See line #389 in native_ctrls.cxx. At init time all feed_tank values are set to -1. node->getChild( "feed_tank" )->setIntValue( net->feed_tank_to[i] ); This code was incorporated as part of FG back in 2.2 IIRC. Now here is where things got messy. Since JSBSim uses a table lookup method for engine models and we were using a physical model it did not fit well into the JSBSim modeling system. We essentially replaced FGTurbine.cpp with our physical model and made the following changes in the JSBSim code. In JSBSim.cxx we added at line #635 eng->SetFuelTank( globals->get_controls()->get_feed_tank(i) ); //JW and pretty much iviscerated the ConsumeFuel() method in FGEngine.cpp and replaced it with if ( Active_Tank >= 0 ) { Tank = Propulsion->GetTank(Active_Tank); if (Tank->GetType() == FGTank::ttFUEL) { //Fshortage += Tank->Drain(CalcFuelNeed()/TanksWithFuel); // SEE NOTE ABOVE Fshortage += Tank->Drain(CalcFuelNeed() ); } } else Starved = true; if (Fshortage < 10.00) Starved = true; so if an engine did not have a tank value of 0 or greater it flamed out or would not start. This essentially moved all the logic and control of the fuel system out of FG and JSBSim over to the 747 simulator side. We made one "messy" accomodation for the 737 and added the fuel transfer function for the version of FG that runs the 737 sim. Tank_0 = Propulsion->GetTank(0); double center_fuel = Tank_0->GetContents(); if ( center_fuel < 6000.0 ) transfer = true; else if ( center_fuel > 9000.0 ) transfer = false; if ( transfer ) { Tank_1 = Propulsion->GetTank(1); if ( Tank_1->GetContents() > 100.0 ) { Tank_0->Fill( 0.040 ); Tank_1->Drain( 0.040 ); } Tank_2 = Propulsion->GetTank(2); if ( Tank_2->GetContents() > 100.0 ) { Tank_0->Fill( 0.0401 ); Tank_2->Drain( 0.0401 ); // just a little nuisance to create an imbalance ;-) } } In the 747 sim the hardware fuel control panel, fuel cutoff switches, and software determined which tanks fed which engines and fuel transfers. This, in turn, was sent via the network interface to FG and onto JSBSim. With all due respect to Jon and Dave, I think this is a simpler scheme than a priority system, requiring less code and logic and greater flexibility for modeling fuel malfunctions external to Fg and JSBSim. So I throw this idea out there as an alternative. Comments are always welcomed and if anyone wishes a complete set of the source changes, just email me. Have not posted them to the git repository, just to messy to handle all the ifdefs at compile time and build a coherent package. Actually, looking over the newer code in 2.6 and 2.8, we may not be that far apart after all. Thanks again for the responses. John oops, this may have been a double post, my apologies. |