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)
- 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.