A3XX: FBW: Add high speed protection

This commit is contained in:
Joshua Davidson 2017-11-28 23:11:23 -05:00
parent d3c280fcf2
commit 0b76615228
5 changed files with 241 additions and 88 deletions

View file

@ -117,7 +117,6 @@ setlistener("/sim/signals/fdm-initialized", func {
var newvertarm = getprop("/modes/pfd/fma/pitch-mode2-armed"); var newvertarm = getprop("/modes/pfd/fma/pitch-mode2-armed");
var thr1 = getprop("/controls/engines/engine[0]/throttle-pos"); var thr1 = getprop("/controls/engines/engine[0]/throttle-pos");
var thr2 = getprop("/controls/engines/engine[1]/throttle-pos"); var thr2 = getprop("/controls/engines/engine[1]/throttle-pos");
var mmoIAS = 0;
}); });
var FMGCinit = func { var FMGCinit = func {
@ -270,13 +269,8 @@ var masterFMGC = maketimer(0.2, func {
} }
flap = getprop("/controls/flight/flap-pos"); flap = getprop("/controls/flight/flap-pos");
mmoIAS = (getprop("/instrumentation/airspeed-indicator/indicated-speed-kt") / getprop("/instrumentation/airspeed-indicator/indicated-mach")) * 0.82;
if (flap == 0) { # 0 if (flap == 0) { # 0
if (mmoIAS < 350) { setprop("/FMGC/internal/maxspeed", getprop("/it-fbw/speeds/vmo-mmo"));
setprop("/FMGC/internal/maxspeed", mmoIAS);
} else {
setprop("/FMGC/internal/maxspeed", 350);
}
setprop("/FMGC/internal/minspeed", 202); setprop("/FMGC/internal/minspeed", 202);
} else if (flap == 1) { # 1 } else if (flap == 1) { # 1
setprop("/FMGC/internal/maxspeed", 230); setprop("/FMGC/internal/maxspeed", 230);

View file

@ -7,6 +7,13 @@
# If All ELACs Fail, Alternate Law # If All ELACs Fail, Alternate Law
setprop("/it-fbw/roll-back", 0);
setprop("/it-fbw/spd-hold", 0);
setprop("/it-fbw/protections/overspeed", 0);
setprop("/it-fbw/protections/overspeed-roll-back", 0);
setprop("/it-fbw/speeds/vmo-mmo", 350);
var mmoIAS = 0;
var fctlInit = func { var fctlInit = func {
setprop("/controls/fctl/elac1", 1); setprop("/controls/fctl/elac1", 1);
setprop("/controls/fctl/elac2", 1); setprop("/controls/fctl/elac2", 1);
@ -23,15 +30,12 @@ var fctlInit = func {
setprop("/systems/fctl/fac1", 0); setprop("/systems/fctl/fac1", 0);
setprop("/systems/fctl/fac2", 0); setprop("/systems/fctl/fac2", 0);
setprop("/it-fbw/degrade-law", 0); setprop("/it-fbw/degrade-law", 0);
setprop("/it-fbw/override", 0);
setprop("/it-fbw/law", 0);
updatet.start();
fbwt.start();
} }
setprop("/it-fbw/roll-back", 0);
setprop("/it-fbw/spd-hold", 0);
###################
# Update Function #
###################
var update_loop = func { var update_loop = func {
var elac1_sw = getprop("/controls/fctl/elac1"); var elac1_sw = getprop("/controls/fctl/elac1");
var elac2_sw = getprop("/controls/fctl/elac2"); var elac2_sw = getprop("/controls/fctl/elac2");
@ -158,10 +162,31 @@ var update_loop = func {
setprop("/it-fbw/degrade-law", 2); setprop("/it-fbw/degrade-law", 2);
} }
mmoIAS = (getprop("/instrumentation/airspeed-indicator/indicated-speed-kt") / getprop("/instrumentation/airspeed-indicator/indicated-mach")) * 0.82;
if (mmoIAS < 350) {
setprop("/it-fbw/speeds/vmo-mmo", mmoIAS);
} else {
setprop("/it-fbw/speeds/vmo-mmo", 350);
}
if (getprop("/instrumentation/airspeed-indicator/indicated-speed-kt") > getprop("/it-fbw/speeds/vmo-mmo") + 6 and getprop("/it-fbw/law") == 0) {
if (getprop("/it-fbw/protections/overspeed") != 1) {
setprop("/it-fbw/protections/overspeed", 1);
}
if (getprop("/it-autoflight/output/ap1") == 1) {
setprop("/it-autoflight/input/ap1", 0);
}
if (getprop("/it-autoflight/output/ap2") == 1) {
setprop("/it-autoflight/input/ap2", 0);
}
} else {
if (getprop("/it-fbw/protections/overspeed") != 0) {
setprop("/it-fbw/protections/overspeed", 0);
}
}
} }
var fbw_loop = func { var fbw_loop = func {
var ail = getprop("/controls/flight/aileron"); var ail = getprop("/controls/flight/aileron");
if (ail > 0.4 or ail < -0.4) { if (ail > 0.4 or ail < -0.4) {
@ -172,12 +197,18 @@ var fbw_loop = func {
if (getprop("/it-fbw/roll-back") == 0 and (getprop("/orientation/roll-deg") > 33.5 or getprop("/orientation/roll-deg") < -33.5)) { if (getprop("/it-fbw/roll-back") == 0 and (getprop("/orientation/roll-deg") > 33.5 or getprop("/orientation/roll-deg") < -33.5)) {
setprop("/it-fbw/roll-back", 1); setprop("/it-fbw/roll-back", 1);
} }
} else if (ail < 0.05 and ail > -0.05) { } else if (ail < 0.04 and ail > -0.04) {
setprop("/it-fbw/roll-lim", "33"); setprop("/it-fbw/roll-lim", "33");
if (getprop("/it-fbw/roll-back") == 1 and getprop("/orientation/roll-deg") <= 33.5 and getprop("/orientation/roll-deg") >= -33.5) { if (getprop("/it-fbw/roll-back") == 1 and getprop("/orientation/roll-deg") <= 33.5 and getprop("/orientation/roll-deg") >= -33.5) {
setprop("/it-fbw/roll-back", 0); setprop("/it-fbw/roll-back", 0);
} }
} }
if (ail > 0.04 or ail < -0.04) {
setprop("/it-fbw/protections/overspeed-roll-back", 0);
} else if (ail < 0.04 and ail > -0.04) {
setprop("/it-fbw/protections/overspeed-roll-back", 1);
}
if (getprop("/it-fbw/override") == 0) { if (getprop("/it-fbw/override") == 0) {
var degrade = getprop("/it-fbw/degrade-law"); var degrade = getprop("/it-fbw/degrade-law");
@ -210,19 +241,5 @@ var fbw_loop = func {
} }
} }
###########################
# Various Other Functions #
###########################
setlistener("/sim/signals/fdm-initialized", func {
setprop("/it-fbw/override", 0);
setprop("/it-fbw/law", 0);
updatet.start();
fbwt.start();
});
##########
# Timers #
##########
var updatet = maketimer(0.1, update_loop); var updatet = maketimer(0.1, update_loop);
var fbwt = maketimer(0.03, fbw_loop); var fbwt = maketimer(0.03, fbw_loop);

View file

@ -21,10 +21,16 @@
<gain>1</gain> <gain>1</gain>
<input> <input>
<condition> <condition>
<not-equals> <and>
<property>/it-fbw/law</property> <equals>
<value>1</value> <property>/it-fbw/law</property>
</not-equals> <value>0</value>
</equals>
<not-equals>
<property>/it-fbw/protections/overspeed</property>
<value>1</value>
</not-equals>
</and>
</condition> </condition>
<expression> <expression>
<sum> <sum>
@ -70,10 +76,16 @@
</input> </input>
<input> <input>
<condition> <condition>
<equals> <and>
<property>/it-fbw/law</property> <not-equals>
<value>1</value> <property>/it-fbw/law</property>
</equals> <value>0</value>
</not-equals>
<not-equals>
<property>/it-fbw/protections/overspeed</property>
<value>1</value>
</not-equals>
</and>
</condition> </condition>
<expression> <expression>
<sum> <sum>
@ -86,6 +98,46 @@
</sum> </sum>
</expression> </expression>
</input> </input>
<input>
<condition>
<and>
<equals>
<property>/it-fbw/law</property>
<value>0</value>
</equals>
<equals>
<property>/it-fbw/protections/overspeed</property>
<value>1</value>
</equals>
</and>
</condition>
<expression>
<sum>
<table>
<property>/controls/flight/elevator-input</property>
<entry><ind> 0.0</ind><dep> 2.5</dep></entry>
<entry><ind>-1.0</ind><dep> 5.0</dep></entry>
</table>
<product>
<table>
<property>/orientation/pitch-deg</property>
<entry><ind>29.99999</ind><dep>0</dep></entry>
<entry><ind>30.00000</ind><dep>1</dep></entry>
</table>
<table>
<property>/controls/flight/elevator-input</property>
<entry><ind> 0</ind><dep>-2.5</dep></entry>
<entry><ind>-1</ind><dep>-5.0</dep></entry>
</table>
</product>
<table>
<property>/orientation/pitch-deg</property>
<entry><ind> 30</ind><dep> 0</dep></entry>
<entry><ind> 33</ind><dep>-4</dep></entry>
</table>
</sum>
</expression>
</input>
<output>/it-fbw/pitch-rate</output> <output>/it-fbw/pitch-rate</output>
</filter> </filter>
@ -280,50 +332,48 @@
<enable> <enable>
<condition> <condition>
<and> <and>
<and> <or>
<or> <equals>
<equals> <property>/it-fbw/law</property>
<property>/it-fbw/law</property> <value>0</value>
<value>0</value> </equals>
</equals> <equals>
<equals> <property>/it-fbw/law</property>
<property>/it-fbw/law</property> <value>1</value>
<value>1</value> </equals>
</equals> </or>
</or> <or>
<or> <and>
<and> <greater-than-equals>
<greater-than-equals> <property>/position/gear-agl-ft</property>
<property>/position/gear-agl-ft</property> <value>100</value>
<value>100</value> </greater-than-equals>
</greater-than-equals> <or>
<or>
<equals>
<property>/it-autoflight/output/ap1</property>
<value>1</value>
</equals>
<equals>
<property>/it-autoflight/output/ap2</property>
<value>1</value>
</equals>
</or>
</and>
<and>
<greater-than-equals>
<property>/position/gear-agl-ft</property>
<value>50</value>
</greater-than-equals>
<equals> <equals>
<property>/it-autoflight/output/ap1</property> <property>/it-autoflight/output/ap1</property>
<value>0</value> <value>1</value>
</equals> </equals>
<equals> <equals>
<property>/it-autoflight/output/ap2</property> <property>/it-autoflight/output/ap2</property>
<value>0</value> <value>1</value>
</equals> </equals>
</and> </or>
</or> </and>
</and> <and>
<greater-than-equals>
<property>/position/gear-agl-ft</property>
<value>50</value>
</greater-than-equals>
<equals>
<property>/it-autoflight/output/ap1</property>
<value>0</value>
</equals>
<equals>
<property>/it-autoflight/output/ap2</property>
<value>0</value>
</equals>
</and>
</or>
<less-than> <less-than>
<property>/orientation/roll-deg</property> <property>/orientation/roll-deg</property>
<value>40</value> <value>40</value>
@ -346,6 +396,10 @@
<property>/fdm/jsbsim/forces/load-factor</property> <property>/fdm/jsbsim/forces/load-factor</property>
<value>-0.5</value> <value>-0.5</value>
</less-than> </less-than>
<not-equals>
<property>/it-fbw/protections/overspeed</property>
<value>1</value>
</not-equals>
</and> </and>
</condition> </condition>
</enable> </enable>

View file

@ -27,10 +27,14 @@
<property>/it-fbw/roll-lim</property> <property>/it-fbw/roll-lim</property>
<value>33</value> <value>33</value>
</equals> </equals>
<equals> <not-equals>
<property>/it-fbw/roll-back</property> <property>/it-fbw/roll-back</property>
<value>0</value> <value>1</value>
</equals> </not-equals>
<not-equals>
<property>/it-fbw/protections/overspeed</property>
<value>1</value>
</not-equals>
</and> </and>
</condition> </condition>
<expression> <expression>
@ -70,10 +74,16 @@
</input> </input>
<input> <input>
<condition> <condition>
<equals> <and>
<property>/it-fbw/roll-lim</property> <equals>
<value>67</value> <property>/it-fbw/roll-lim</property>
</equals> <value>67</value>
</equals>
<not-equals>
<property>/it-fbw/protections/overspeed</property>
<value>1</value>
</not-equals>
</and>
</condition> </condition>
<expression> <expression>
<sum> <sum>
@ -112,10 +122,16 @@
</input> </input>
<input> <input>
<condition> <condition>
<equals> <and>
<property>/it-fbw/roll-back</property> <equals>
<value>1</value> <property>/it-fbw/roll-back</property>
</equals> <value>1</value>
</equals>
<not-equals>
<property>/it-fbw/protections/overspeed</property>
<value>1</value>
</not-equals>
</and>
</condition> </condition>
<expression> <expression>
<table> <table>
@ -129,6 +145,78 @@
</table> </table>
</expression> </expression>
</input> </input>
<input>
<condition>
<and>
<equals>
<property>/it-fbw/protections/overspeed</property>
<value>1</value>
</equals>
<not-equals>
<property>/it-fbw/protections/overspeed-roll-back</property>
<value>1</value>
</not-equals>
</and>
</condition>
<expression>
<sum>
<table>
<property>/controls/flight/aileron-input</property>
<entry><ind>-1</ind><dep>-12.0</dep></entry>
<entry><ind> 0</ind><dep> 0.0</dep></entry>
<entry><ind> 1</ind><dep> 12.0</dep></entry>
</table>
<product>
<table>
<property>/orientation/roll-deg</property>
<entry><ind>-40.00000</ind><dep>1</dep></entry>
<entry><ind>-39.99999</ind><dep>0</dep></entry>
</table>
<table>
<property>/controls/flight/aileron-input</property>
<entry><ind>-1</ind><dep>12.0</dep></entry>
<entry><ind> 0</ind><dep> 0.0</dep></entry>
</table>
</product>
<product>
<table>
<property>/orientation/roll-deg</property>
<entry><ind>39.99999</ind><dep>0</dep></entry>
<entry><ind>40.00000</ind><dep>1</dep></entry>
</table>
<table>
<property>/controls/flight/aileron-input</property>
<entry><ind>0</ind><dep> 0.0</dep></entry>
<entry><ind>1</ind><dep>-12.0</dep></entry>
</table>
</product>
</sum>
</expression>
</input>
<input>
<condition>
<and>
<equals>
<property>/it-fbw/protections/overspeed</property>
<value>1</value>
</equals>
<equals>
<property>/it-fbw/protections/overspeed-roll-back</property>
<value>1</value>
</equals>
</and>
</condition>
<expression>
<table>
<property>/orientation/roll-deg</property>
<entry><ind>-40</ind><dep> 25.0</dep></entry>
<entry><ind>-15</ind><dep> 10.0</dep></entry>
<entry><ind> 0</ind><dep> 0.0</dep></entry>
<entry><ind> 15</ind><dep>-10.0</dep></entry>
<entry><ind> 40</ind><dep>-25.0</dep></entry>
</table>
</expression>
</input>
<output>/it-fbw/roll-rate</output> <output>/it-fbw/roll-rate</output>
</filter> </filter>

View file

@ -1 +1 @@
4041 4042