Board index FlightGear Development Aircraft Systems

A330 Fuel System Overhaul

Modeling aircraft systems, like electrical stuff, hydraulics, pneumatics? Feel free to ask support.

A330 Fuel System Overhaul

Postby dutchman » Thu Dec 17, 2015 12:11 am

Hi,

I've recently made some major modification in the A330 fuel system.
For those of you who fly the Omega and/or Artix A330 version from http://www.github.com/artix75/ this is for you.

Each of the following changes reflects Airbus Crew Operating Manuals:
    Correct sequence of fuel-tank use, correct (mass)volumes in kg, transistion between individual tanks based on Airbus data.
    Appropriate warnings in the ECAM display.
    ECAM Fuel display now shows center tank valves open en closing.
    Fuel-Truck is prevented from overloading, automatically disappears after succesfull fuel transfer.
    Added balast tank.
    Implemented the use of "zero-gravity" collector tanks (as in real Airbus aircraft)
a332-common.xml (only relevent part)
Code: Select all
   <consumables>
      <fuel>
         <tank n="0">
            <name>Left Wing Vent</name>
         </tank>
         <tank n="1">
            <name>Left Wing Outer</name>
         </tank>
         <tank n="2">
            <name>Left Wing Inner</name>
         </tank>
         <tank n="3">
            <name>Center</name>
         </tank>
         <tank n="4">
            <name>Right Wing Inner</name>
         </tank>
         <tank n="5">
            <name>Right Wing Outer</name>
         </tank>
         <tank n="6">
            <name>Right Wing Vent</name>
         </tank>
         <tank n="7">
            <name>Left Collector Cell</name>
         </tank>
         <tank n="8">
            <name>Right Collector Cell</name>
         </tank>
         <tank n="9">
            <name>Trim</name>
         </tank>
      </fuel>
   </consumables>

a330-243.xml (only relevent part)
Code: Select all
   <!-- FUEL TANK DEFINITIONS. QUANTITIES TAKEN FROM
   http://www.smartcockpit.com/pdf/plane/airbus/A330/systems/0011/ -->

      <!-- LEFT VENT TANK [0] -->
      <tank type="FUEL">   
         <location unit="IN">
            <x> 100 </x>
            <y> -1022.04 </y>
            <z> 32.72 </z>
         </location>
         <capacity unit="KG"> 350 </capacity>
         <contents unit="KG"> 0 </contents>
         <priority>0</priority>
         <type>JET-A1</type>
         <temperature>50</temperature>
      </tank>
      <!-- LEFT OUTER TANK [1] -->
      <tank type="FUEL">   
         <location unit="IN">
            <x> 55 </x>
            <y> -761.21 </y>
            <z> 11.82 </z>
         </location>
         <capacity unit="KG"> 2865 </capacity>
         <contents unit="KG"> 1350 </contents>
         <priority>2</priority>
         <type>JET-A1</type>
         <temperature>50</temperature>
      </tank>
      <!-- LEFT INNER TANK [2] -->
      <tank type="FUEL">   
         <location unit="IN">
            <x> 10 </x>
            <y> -316.38 </y>
            <z> -19.70 </z>
         </location>
         <capacity unit="KG"> 32970 </capacity> <!-- Additional 2200 KG in collector cells -->
         <contents unit="KG"> 4150 </contents>
         <priority>3</priority>
         <type>JET-A1</type>
         <temperature>50</temperature>
      </tank>
      <!-- CENTER TANK [3]-->
      <tank type="FUEL">   
         <location unit="IN">
            <x> -90 </x>
            <y> 0 </y>
            <z> -53.58 </z>
         </location>
         <capacity unit="KG"> 32625 </capacity>
         <contents unit="KG"> 7000 </contents>
         <priority>1</priority>
         <type>JET-A1</type>
         <temperature>50</temperature>
      </tank>
      <!-- RIGHT INNER TANK [4] -->
      <tank type="FUEL">
         <location unit="IN">
            <x> 10 </x>
            <y> 316.38 </y>
            <z> -19.70 </z>
         </location>
         <capacity unit="KG"> 32970 </capacity>
         <contents unit="KG"> 4150 </contents>
         <priority>3</priority>
         <type>JET-A1</type>
         <temperature>50</temperature>
      </tank>
      <!-- RIGHT OUTER TANK [5] -->
      <tank type="FUEL">   
         <location unit="IN">
            <x> 55 </x>
            <y> 761.21 </y>
            <z> 11.82 </z>
         </location>
         <capacity unit="KG"> 2865 </capacity>
         <contents unit="KG"> 1350 </contents>
         <priority>2</priority>
         <type>JET-A1</type>
         <temperature>50</temperature>
      </tank>
      <!-- RIGHT VENT TANK[6] -->
      <tank type="FUEL">   
         <location unit="IN">
            <x> 100 </x>
            <y> 1022.04 </y>
            <z> 32.72 </z>
         </location>
         <capacity unit="KG"> 350 </capacity>
         <contents unit="KG"> 0 </contents>
         <priority>0</priority>
         <type>JET-A1</type>
         <temperature>50</temperature>
      </tank>
      <!-- LEFT COLLECTOR CELL TANK[7] (ENGINE [0] FEED) -->
      <tank type="FUEL">   
         <location unit="IN">
            <x>75.65</x>   
            <y>-365.24</y>
            <z>-27.58</z>
         </location>
         <capacity unit="KG"> 1000 </capacity> <!-- 2200 -->
         <contents unit="KG"> 999 </contents>
         <priority>1</priority>
         <type>JET-A1</type>
      </tank>
      <!-- RIGHT COLLECTOR CELL TANK[8] (ENGINE [1] FEED) -->
      <tank type="FUEL">   
         <location unit="IN">
            <x>75.65</x>   
            <y>365.24</y>
            <z>-27.58</z>
         </location>
         <capacity unit="KG"> 1000 </capacity>
         <contents unit="KG"> 999 </contents>
         <priority>1</priority>
         <type>JET-A1</type>
      </tank>
      <!-- TRIM TANK [9]-->
      <tank type="FUEL">   
         <location unit="IN">
            <x> 700 </x>   <!-- needs checking -->
            <y> 0 </y>
            <z> 32.72 </z> <!-- same height as vent tanks -->      
         </location>
         <capacity unit="KG"> 2896 </capacity> <!-- cheating, should be 4891 -->
         <contents unit="KG"> 0 </contents>
         <priority>0</priority>
         <type>JET-A1</type>
         <temperature>50</temperature>
      </tank>   
   </propulsion>

a332-fuel.xml (file)
Code: Select all
<?xml version="1.0"?>

<!-- ###########################################################  -->
<!-- # Fuel system    for A330-200                               #  -->
<!-- # 2013-01-05 - By Narendran Muraleedharan and Jon Ortundo #  -->
<!-- # 2015-12-15 - Revision 1.1 by fdev                  #  -->
<!-- ###########################################################  -->

<system name="fuel">

<property>propulsion/tank[7]/external-flow-rate/jettison</property>
<property>propulsion/tank[8]/external-flow-rate/jettison</property>
<property>/controls/fuel/x-feed</property>
<property>/controls/fuel/tank[9]/boost-pump[0]</property>

<channel name="fuel">

   <!-- CROSS FLOW -->

   <switch name="propulsion/tank[7]/external-flow-rate/x-feed">
      <default value="0"/>
      <test logic="AND" value="10">
         /controls/fuel/x-feed == 1
         propulsion/tank[7]/contents-lbs gt propulsion/tank[8]/contents-lbs
         propulsion/tank[7]/contents-lbs gt 0
         propulsion/tank[8]/contents-lbs lt 100
      </test>
   </switch>
   <switch name="propulsion/tank[8]/external-flow-rate/x-feed">
      <default value="0"/>
      <test logic="AND" value="10">
         /controls/fuel/x-feed == 1
         propulsion/tank[8]/contents-lbs gt propulsion/tank[7]/contents-lbs
         propulsion/tank[8]/contents-lbs gt 0
         propulsion/tank[7]/contents-lbs lt 100
      </test>
   </switch>

   <!-- CENTER TANK TRANSFER - (to inner tanks if these are below 30970 kg 68271 lbs) -->

   <switch name="propulsion/tank[3]/external-flow-rate/pump[0]">
      <default value="0"/>
      <test logic="AND" value="12">
         /controls/fuel/tank[3]/boost-pump[0] == 1
         propulsion/tank[3]/contents-lbs gt 0
         propulsion/tank[2]/contents-lbs lt 72686
         propulsion/tank[2]/contents-lbs lt 68271
         propulsion/tank[7]/contents-lbs lt 2200 <!--  This will give center tank priority over over outer wing -->
      </test>
   </switch>
   <switch name="propulsion/tank[3]/external-flow-rate/pump[1]">
      <default value="0"/>
      <test logic="AND" value="12">
         /controls/fuel/tank[3]/boost-pump[1] == 1
         propulsion/tank[3]/contents-lbs gt 0
         propulsion/tank[4]/contents-lbs lt 72686
         propulsion/tank[4]/contents-lbs lt 68271
         propulsion/tank[8]/contents-lbs lt 2200
      </test>
   </switch>
   
   <!-- TRIM TANK TRANSFER - (to inner tanks if these are below 4000 kg 8830 lbs) -->

   <switch name="propulsion/tank[9]/external-flow-rate/pump[0]">
      <default value="0"/>
      <test logic="AND" value="12">
<!--         /controls/fuel/tank[9]/boost-pump[0] == 1 -->
         propulsion/tank[9]/contents-lbs gt 0
         propulsion/tank[2]/contents-lbs lt 8830
         propulsion/tank[4]/contents-lbs lt 8830
      </test>
   </switch>

   <!-- OUTER TANK TRANSFER - (to inner tank if less than 3500 kg 7720lbs) -->

   <switch name="propulsion/tank[1]/external-flow-rate/transfer-valve">
      <default value="0"/>
      <test logic="AND" value="6">
         propulsion/tank[1]/contents-lbs gt 0
         propulsion/tank[2]/contents-lbs lt 7720
      </test>
   </switch>
   <switch name="propulsion/tank[5]/external-flow-rate/transfer-valve">
      <default value="0"/>
      <test logic="AND" value="6">
         propulsion/tank[5]/contents-lbs gt 0
         propulsion/tank[4]/contents-lbs lt 7720
      </test>
   </switch>

   <!-- COLLECTOR TANK RECYCLE - (to inner tanks) -->

   <switch name="propulsion/tank[7]/external-flow-rate/recirculation">
      <default value="0"/>
      <test logic="AND" value="5">
         propulsion/tank[4]/contents-lbs gt propulsion/tank[2]/contents-lbs
         propulsion/tank[7]/contents-lbs gt 50
         propulsion/tank[2]/contents-lbs lt 12186
      </test>
   </switch>
   <switch name="propulsion/tank[8]/external-flow-rate/recirculation">
      <default value="0"/>
      <test logic="AND" value="5">
         propulsion/tank[2]/contents-lbs gt propulsion/tank[4]/contents-lbs
         propulsion/tank[8]/contents-lbs gt 50
         propulsion/tank[4]/contents-lbs lt 12186
      </test>
   </switch>

   <!-- INNER TANK PUMPS - (feed the collector cells) -->

   <switch name="propulsion/tank[2]/external-flow-rate/pump[0]">
      <default value="0"/>
      <test logic="AND" value="5">
         propulsion/tank[2]/contents-lbs gt 0
         propulsion/tank[7]/contents-lbs lt 2200
      </test>
   </switch>
   <switch name="propulsion/tank[2]/external-flow-rate/pump[1]">
      <default value="0"/>
      <test logic="AND" value="5">
         propulsion/tank[2]/contents-lbs gt 0
         propulsion/tank[7]/contents-lbs lt 2200
      </test>
   </switch>
   <switch name="propulsion/tank[4]/external-flow-rate/pump[0]">
      <default value="0"/>
      <test logic="AND" value="5">
         propulsion/tank[4]/contents-lbs gt 0
         propulsion/tank[8]/contents-lbs lt 2200
      </test>
   </switch>
   <switch name="propulsion/tank[4]/external-flow-rate/pump[1]">
      <default value="0"/>
      <test logic="AND" value="5">
         propulsion/tank[4]/contents-lbs gt 0
         propulsion/tank[8]/contents-lbs lt 2200
      </test>
   </switch>


   <!-- ENGINE FEED - (Each collector cell contains about 1000 kg 2200 lbs)

   Left collector cell (tank[7])-->
   <summer name="propulsion/tank[7]/external-flow-rate">
      <!-- Give To -->
      <input>-propulsion/tank[7]/external-flow-rate/jettison</input>
      <input>-propulsion/tank[7]/external-flow-rate/recirculation</input>
      <input>-propulsion/tank[7]/external-flow-rate/x-feed</input>
      <!-- Take From -->
      <input>propulsion/tank[8]/external-flow-rate/x-feed</input>
      <input>propulsion/tank[2]/external-flow-rate/pump[0]</input>
      <input>propulsion/tank[2]/external-flow-rate/pump[1]</input>
      <output>propulsion/tank[7]/external-flow-rate-pps</output>
   </summer>
   <!-- Right collector cell (tank[8])-->
   <summer name="propulsion/tank[8]/external-flow-rate">
      <!-- Give To -->
      <input>-propulsion/tank[8]/external-flow-rate/jettison</input>
      <input>-propulsion/tank[8]/external-flow-rate/recirculation</input>
      <input>-propulsion/tank[8]/external-flow-rate/x-feed</input>
      <!-- Take From -->
      <input>propulsion/tank[7]/external-flow-rate/x-feed</input>
      <input>propulsion/tank[4]/external-flow-rate/pump[0]</input>
      <input>propulsion/tank[4]/external-flow-rate/pump[1]</input>
      <output>propulsion/tank[8]/external-flow-rate-pps</output>
   </summer>

   <!-- INNER WING TANKS -->

   <!-- Left inner (tank[2])-->
   <summer name="propulsion/tank[2]/external-flow-rate">
      <!-- Give To -->
      <input>-propulsion/tank[2]/external-flow-rate/pump[0]</input>
      <input>-propulsion/tank[2]/external-flow-rate/pump[1]</input>
      <!-- Take From -->
      <input>propulsion/tank[7]/external-flow-rate/recirculation</input>
      <input>propulsion/tank[1]/external-flow-rate/transfer-valve</input>
      <input>propulsion/tank[3]/external-flow-rate/pump[0]</input>
      <input>propulsion/tank[9]/external-flow-rate/pump[0]</input>
      <output>propulsion/tank[2]/external-flow-rate-pps</output>
   </summer>

   <!-- Right inner (tank[4])-->
   <summer name="propulsion/tank[4]/external-flow-rate">
      <!-- Give To -->
      <input>-propulsion/tank[4]/external-flow-rate/pump[0]</input>
      <input>-propulsion/tank[4]/external-flow-rate/pump[1]</input>
      <!-- Take From -->
      <input>propulsion/tank[8]/external-flow-rate/recirculation</input>
      <input>propulsion/tank[5]/external-flow-rate/transfer-valve</input>
      <input>propulsion/tank[3]/external-flow-rate/pump[1]</input>
      <input>propulsion/tank[9]/external-flow-rate/pump[0]</input>
      <output>propulsion/tank[4]/external-flow-rate-pps</output>
   </summer>

   <!-- OUTER WING TANKS -->

   <!-- Left outer (tank[1])-->
   <summer name="propulsion/tank[1]/external-flow-rate">
      <!-- Give To -->
      <input>-propulsion/tank[1]/external-flow-rate/transfer-valve</input>

      <output>propulsion/tank[1]/external-flow-rate-pps</output>
   </summer>
   <!-- Right outer (tank[5])-->
   <summer name="propulsion/tank[5]/external-flow-rate">
      <!-- Give To -->
      <input>-propulsion/tank[5]/external-flow-rate/transfer-valve</input>

      <output>propulsion/tank[5]/external-flow-rate-pps</output>
   </summer>

   <!-- CENTER (tank[5])-->

   <summer name="propulsion/tank[3]/external-flow-rate">
      <!-- Give To -->
      <input>-propulsion/tank[3]/external-flow-rate/pump[0]</input>
      <input>-propulsion/tank[3]/external-flow-rate/pump[1]</input>
      <output>propulsion/tank[3]/external-flow-rate-pps</output>
   </summer>
   
   <!-- TRIM (tank[9])-->

   <summer name="propulsion/tank[9]/external-flow-rate">
      <!-- Give To -->
      <input>-propulsion/tank[9]/external-flow-rate/pump[0]</input>
      <output>propulsion/tank[9]/external-flow-rate-pps</output>
   </summer>

</channel>

</system>

fueljett.nas (relevant part)
Code: Select all
var fuel_jett = func() {

   if (getprop("/consumables/fuel/total-fuel-kg") < 10000) {
      setprop("/controls/fuel-dump/active", 0);
   }

ground-services.nas (relevent part)
Code: Select all
# Fuel Truck Controls

if (getprop("/services/fuel-truck/enable") and getprop("/services/fuel-truck/connect")) {

   if (getprop("/services/fuel-truck/transfer")) {
      if  (getprop("/services/fuel-truck/request-kg") >= 109187){
         screen.log.write("That's more then allowed!... :)", 1, 0, 0);
         setprop("/services/fuel-truck/transfer", 0);
      }
      if (getprop("consumables/fuel/total-fuel-kg") < getprop("/services/fuel-truck/request-kg")) {
         setprop("/consumables/fuel/tank[1]/level-kg", getprop("/consumables/fuel/tank[1]/level-kg") + 5);
         setprop("/consumables/fuel/tank[2]/level-kg", getprop("/consumables/fuel/tank[2]/level-kg") + 20);
         setprop("/consumables/fuel/tank[3]/level-kg", getprop("/consumables/fuel/tank[3]/level-kg") + 35);
         setprop("/consumables/fuel/tank[4]/level-kg", getprop("/consumables/fuel/tank[4]/level-kg") + 20);
         setprop("/consumables/fuel/tank[5]/level-kg", getprop("/consumables/fuel/tank[5]/level-kg") + 5);
         setprop("/consumables/fuel/tank[9]/level-kg", getprop("/consumables/fuel/tank[9]/level-kg") + 5);
      } else {
         setprop("/services/fuel-truck/transfer", 0);
         setprop("/services/fuel-truck/enable", 0) and (setprop("/services/fuel-truck/connect", 0));
         screen.log.write("Re-fueling complete! Have a nice flight... :)", 1, 1, 1);
         }            
      }

   if (getprop("/services/fuel-truck/clean")) {

      if (getprop("consumables/fuel/total-fuel-kg") > 90) {

         setprop("/consumables/fuel/tank[1]/level-kg", getprop("/consumables/fuel/tank[1]/level-kg") - 80);
         setprop("/consumables/fuel/tank[2]/level-kg", getprop("/consumables/fuel/tank[2]/level-kg") - 80);
         setprop("/consumables/fuel/tank[3]/level-kg", getprop("/consumables/fuel/tank[3]/level-kg") - 80);
         setprop("/consumables/fuel/tank[4]/level-kg", getprop("/consumables/fuel/tank[4]/level-kg") - 80);
         setprop("/consumables/fuel/tank[5]/level-kg", getprop("/consumables/fuel/tank[5]/level-kg") - 80);
         setprop("/consumables/fuel/tank[9]/level-kg", getprop("/consumables/fuel/tank[9]/level-kg") - 80);

         } else {
         setprop("/services/fuel-truck/clean", 0);
         screen.log.write("Finished draining the fuel tanks...", 1, 1, 1);
         }   
      }
   }

systems.nas (2 relevant parts)
Code: Select all
# start the loop 2 seconds after the FDM initializes
setlistener("sim/signals/fdm-initialized", func
 {
 settimer(func
  {
  engineLoop(0);
  engineLoop(1);
  apuLoop();
  powerfuelpumps();
  }, 2);
 });
 
 
 
 
 
 
## FUEL
#######

# Short-cut to activate fuel-pumps. To be be changed with new electrical system

var powerfuelpumps = func
 {
 var centertank = getprop("/consumables/fuel/tank[3]/level-lbs");
   if (centertank == 0) {
   setprop("/controls/fuel/tank[3]/boost-pump[0]", 0);
   setprop("/controls/fuel/tank[3]/boost-pump[1]", 0);
   }
 else {
   setprop("/controls/fuel/tank[3]/boost-pump[0]", 1);
   setprop("/controls/fuel/tank[3]/boost-pump[1]", 1);
   };
 var trimtank = getprop("/consumables/fuel/tank[9]/level-lbs");
   if (trimtank == 0) {
   setprop("/controls/fuel/tank[9]/boost-pump[0]", 0);
   }
 else {
   setprop("/controls/fuel/tank[9]/boost-pump[0]", 1);
   }
 
 settimer(func
  {
  powerfuelpumps();
  }, 0);
 };

warnings.nas (2 relevant parts)
Code: Select all
## Fuel

var fuel_1lo = warning.new("L WING TK LO LVL", "chime", "caution", "fuel1lo");
   fuel_1lo.condition = func() {
         return ((getprop("/consumables/fuel/tank[2]/level-kg") < 2700) and (getprop("/consumables/fuel/tank[4]/level-kg") >= 3000));
         };

var fuel_2lo = warning.new("R WING TK LO LVL", "chime", "caution", "fuel2lo");
   fuel_2lo.condition = func() {
         return ((getprop("/consumables/fuel/tank[2]/level-kg") >= 2700) and (getprop("/consumables/fuel/tank[4]/level-kg") < 3000));
         };

var fuel_clo = warning.new("CTR TK LO LVL", "chime", "caution", "fuelclo");
   fuel_clo.condition = func() {
         return (getprop("/consumables/fuel/tank[3]/level-kg") < 3000);
         };

var fuel_wlo = warning.new("L+R WING TK LO LVL", "crc", "caution", "fuello");
   fuel_wlo.condition = func() {
         return ((getprop("/consumables/fuel/tank[2]/level-kg") == 0) and (getprop("/consumables/fuel/tank[4]/level-kg") == 0));
         };
var fuel_bal = warning.new("X-FEED FAULT", "chime", "caution", "fuelbal");
   fuel_bal.condition = func() {
         return ((getprop("controls/fuel/x-feed") != 1) and (math.abs(getprop("/consumables/fuel/tank[2]/level-kg") - getprop("/consumables/fuel/tank[4]/level-kg")) > 1000));
         }         
         
         
         
## Create MEMO Displays

var fob_low = memo.new("FOB BELOW 17T", "amber");
   fob_low.condition = func() {
      return (((getprop("position/altitude-agl-ft") < 1500) and (getprop("/velocities/groundspeed-kt") >= 80)) and (getprop("/consumables/fuel/total-fuel-kg") < 17000));
            };
 


As mentioned, these changes are based on the Omega/Artix A330. Yes they can also be used for an A320, but that's another story.
In particular the Trim tank, fuel-tank content (kg) and transistion between tanks needs adaptation.
I'm not in the A320 so start by trying out yourself, before asking. Any suggestion or comments are welcome.

Happy flying.
A propeller is just a big fan in front of the plane used to keep the pilot cool.
When it stops, you can watch him start sweating.
dutchman
 
Posts: 52
Joined: Wed Feb 06, 2013 11:10 pm
Version: 2018.2.2
OS: WIN7-64

Re: A330 Fuel System Overhaul

Postby legoboyvdlp » Thu Dec 17, 2015 1:57 am

Hello, (I guess chris / OrangeTiger?)
Very nice work!
If you are not Chris or OrangeTiger, please send an email or PM to artix on these forums to get access to the private dev version, so that your work can be included officially in the next release of the A330.
Cheers!
User avatar
legoboyvdlp
 
Posts: 7087
Joined: Sat Jul 26, 2014 1:28 am
Callsign: YV-LEGO
Version: 2018.3.1
OS: Windows 10 HP


Return to Systems

Who is online

Users browsing this forum: No registered users and 1 guest