From 1f67d08363f368c25d4d338f4bacf1a6f9247aef Mon Sep 17 00:00:00 2001 From: Matthew Maring <56924612+hayden2000@users.noreply.github.com> Date: Wed, 27 May 2020 11:59:40 -0400 Subject: [PATCH] Fix vapp, speed logic improvements --- Models/Instruments/PFD/PFD.nas | 12 +- Nasal/FMGC/FMGC.nas | 227 +++++++++++++++++---------------- Nasal/MCDU/PERFAPPR.nas | 2 +- 3 files changed, 125 insertions(+), 116 deletions(-) diff --git a/Models/Instruments/PFD/PFD.nas b/Models/Instruments/PFD/PFD.nas index cd1efa27..be5385fc 100644 --- a/Models/Instruments/PFD/PFD.nas +++ b/Models/Instruments/PFD/PFD.nas @@ -1260,7 +1260,11 @@ var canvas_PFD_1 = { if (managed_spd.getValue() == 1) { if (getprop("/FMGC/internal/decel") == 1) { - vapp = getprop("/FMGC/internal/computed-speeds/vapp"); + if (getprop("/FMGC/internal/vapp-speed-set")) { + vapp = getprop("/FMGC/internal/computed-speeds/vapp_appr"); + } else { + vapp = getprop("/FMGC/internal/computed-speeds/vapp"); + } tgt_ias = vapp; tgt_kts = vapp; } else if (FMGCphase.getValue() == 6) { @@ -1994,7 +1998,11 @@ var canvas_PFD_2 = { if (managed_spd.getValue() == 1) { if (getprop("/FMGC/internal/decel") == 1) { - vapp = getprop("/FMGC/internal/computed-speeds/vapp"); + if (getprop("/FMGC/internal/vapp-speed-set")) { + vapp = getprop("/FMGC/internal/computed-speeds/vapp_appr"); + } else { + vapp = getprop("/FMGC/internal/computed-speeds/vapp"); + } tgt_ias = vapp; tgt_kts = vapp; } else if (FMGCphase.getValue() == 6) { diff --git a/Nasal/FMGC/FMGC.nas b/Nasal/FMGC/FMGC.nas index 662eb4b0..2ba54eed 100644 --- a/Nasal/FMGC/FMGC.nas +++ b/Nasal/FMGC/FMGC.nas @@ -481,7 +481,9 @@ var masterFMGC = maketimer(0.2, func { setprop("/FMGC/internal/maxspeed", getprop("/it-fbw/speeds/vmo-mmo")); } + ############################ # calculate speeds + ############################ flap = getprop("/controls/flight/flaps-pos"); weight_lbs = getprop("/fdm/jsbsim/inertia/weight-lbs") / 1000; tow = getprop("/FMGC/internal/tow"); @@ -489,32 +491,30 @@ var masterFMGC = maketimer(0.2, func { altitude = getprop("/instrumentation/altimeter/indicated-altitude-ft"); dest_wind = getprop("/FMGC/internal/dest-wind"); - # current appr speeds + # current speeds clean = 2 * weight_lbs * 0.45359237 + 85; if (altitude > 20000) { clean += (altitude - 20000) / 1000; } - vs1g_clean = 0.0024 * weight_lbs * weight_lbs + 0.124 * weight_lbs + 88.942; - vs1g_conf_1 = -0.0007 * weight_lbs * weight_lbs + 0.6795 * weight_lbs + 44.673; - vs1g_conf_1f = -0.0001 * weight_lbs * weight_lbs + 0.5211 * weight_lbs + 49.027; - vs1g_conf_2 = -0.0005 * weight_lbs * weight_lbs + 0.5488 * weight_lbs + 44.279; - vs1g_conf_3 = -0.0005 * weight_lbs * weight_lbs + 0.5488 * weight_lbs + 43.279; - vs1g_conf_full = -0.0007 * weight_lbs * weight_lbs + 0.6002 * weight_lbs + 38.479; - - slat = vs1g_clean * 1.23; - flap2 = vs1g_conf_2 * 1.47; - flap3 = vs1g_conf_3 * 1.36; - + setprop("/FMGC/internal/computed-speeds/clean", clean); + setprop("/FMGC/internal/computed-speeds/vs1g_clean", 0.0024 * weight_lbs * weight_lbs + 0.124 * weight_lbs + 88.942); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_1", -0.0007 * weight_lbs * weight_lbs + 0.6795 * weight_lbs + 44.673); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_1f", -0.0001 * weight_lbs * weight_lbs + 0.5211 * weight_lbs + 49.027); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_2", -0.0005 * weight_lbs * weight_lbs + 0.5488 * weight_lbs + 44.279); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_3", -0.0005 * weight_lbs * weight_lbs + 0.5488 * weight_lbs + 43.279); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_full", -0.0007 * weight_lbs * weight_lbs + 0.6002 * weight_lbs + 38.479); + setprop("/FMGC/internal/computed-speeds/slat", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.23); + setprop("/FMGC/internal/computed-speeds/flap2", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_2")) * 1.47); + setprop("/FMGC/internal/computed-speeds/flap3", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_3")) * 1.36); if (getprop("/FMGC/internal/ldg-config-3-set")) { - vls = vs1g_conf_3 * 1.23; + vls = num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_3")) * 1.23; } else { - vls = vs1g_conf_full * 1.23 + vls = num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_full")) * 1.23 } - if (vls < 113) { vls = 113; } - + setprop("/FMGC/internal/computed-speeds/vls", vls); if (!getprop("/FMGC/internal/vapp-speed-set")) { if (dest_wind < 5) { vapp = vls + 5; @@ -526,6 +526,77 @@ var masterFMGC = maketimer(0.2, func { setprop("/FMGC/internal/computed-speeds/vapp", vapp); } + # predicted takeoff speeds + if (phase == "1") { + setprop("/FMGC/internal/computed-speeds/clean_to", getprop("/FMGC/internal/computed-speeds/clean")); + setprop("/FMGC/internal/computed-speeds/vs1g_clean_to", getprop("/FMGC/internal/computed-speeds/vs1g_clean")); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_2_to", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2")); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_3_to", getprop("/FMGC/internal/computed-speeds/vs1g_conf_3")); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_full_to", getprop("/FMGC/internal/computed-speeds/vs1g_conf_full")); + setprop("/FMGC/internal/computed-speeds/slat_to", getprop("/FMGC/internal/computed-speeds/slat")); + setprop("/FMGC/internal/computed-speeds/flap2_to", getprop("/FMGC/internal/computed-speeds/flap2")); + } else { + clean_to = 2 * tow * 0.45359237 + 85; + if (altitude > 20000) { + clean_to += (altitude - 20000) / 1000; + } + setprop("/FMGC/internal/computed-speeds/clean_to", clean_to); + setprop("/FMGC/internal/computed-speeds/vs1g_clean_to", 0.0024 * tow * tow + 0.124 * tow + 88.942); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_2_to", -0.0005 * tow * tow + 0.5488 * tow + 44.279); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_3_to", -0.0005 * tow * tow + 0.5488 * tow + 43.279); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_full_to", -0.0007 * tow * tow + 0.6002 * tow + 38.479); + setprop("/FMGC/internal/computed-speeds/slat_to", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean_to")) * 1.23); + setprop("/FMGC/internal/computed-speeds/flap2_to", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_2_to")) * 1.47); + } + + # predicted approach (temp go-around) speeds + if (phase == "5" or phase == "6") { + setprop("/FMGC/internal/computed-speeds/clean_appr", getprop("/FMGC/internal/computed-speeds/clean")); + setprop("/FMGC/internal/computed-speeds/vs1g_clean_appr", getprop("/FMGC/internal/computed-speeds/vs1g_clean")); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_2_appr", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2")); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_3_appr", getprop("/FMGC/internal/computed-speeds/vs1g_conf_3")); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_full_appr", getprop("/FMGC/internal/computed-speeds/vs1g_conf_full")); + setprop("/FMGC/internal/computed-speeds/slat_appr", getprop("/FMGC/internal/computed-speeds/slat")); + setprop("/FMGC/internal/computed-speeds/flap2_appr", getprop("/FMGC/internal/computed-speeds/flap2")); + setprop("/FMGC/internal/computed-speeds/vls_appr", getprop("/FMGC/internal/computed-speeds/vls")); + if (!getprop("/FMGC/internal/vapp-speed-set")) { + setprop("/FMGC/internal/computed-speeds/vapp_appr", getprop("/FMGC/internal/computed-speeds/vapp")); + } + } else { + clean_appr = 2 * lw * 0.45359237 + 85; + if (altitude > 20000) { + clean_appr += (altitude - 20000) / 1000; + } + setprop("/FMGC/internal/computed-speeds/clean_appr", clean_appr); + setprop("/FMGC/internal/computed-speeds/vs1g_clean_appr", 0.0024 * lw * lw + 0.124 * lw + 88.942); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_2_appr", -0.0005 * lw * lw + 0.5488 * lw + 44.279); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_3_appr", -0.0005 * lw * lw + 0.5488 * lw + 43.279); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_full_appr", -0.0007 * lw * lw + 0.6002 * lw + 38.479); + setprop("/FMGC/internal/computed-speeds/slat_appr", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean_appr")) * 1.23); + setprop("/FMGC/internal/computed-speeds/flap2_appr", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_2_appr")) * 1.47); + if (getprop("/FMGC/internal/ldg-config-3-set")) { + vls_appr = num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_3_appr")) * 1.23; + } else { + vls_appr = num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_full_appr")) * 1.23 + } + if (vls_appr < 113) { + vls_appr = 113; + } + setprop("/FMGC/internal/computed-speeds/vls_appr", vls_appr); + if (!getprop("/FMGC/internal/vapp-speed-set")) { + if (dest_wind < 5) { + vapp_appr = vls_appr + 5; + } else if (dest_wind > 15) { + vapp_appr = vls_appr + 15; + } else { + vapp_appr = vls_appr + dest_wind; + } + setprop("/FMGC/internal/computed-speeds/vapp_appr", vapp_appr); + } + } + + # Need info on these, also correct for height at altitude... + # https://www.pprune.org/archive/index.php/t-587639.html aoa_prot = 15; aoa_max = 17.5; aoa_0 = -5; @@ -538,136 +609,63 @@ var masterFMGC = maketimer(0.2, func { alpha_prot = 0; alpha_max = 0; } - - # predicted to speeds - clean_to = 2 * tow * 0.45359237 + 85; - if (altitude > 20000) { - clean_to += (altitude - 20000) / 1000; - } - vs1g_clean_to = 0.0024 * tow * tow + 0.124 * tow + 88.942; - vs1g_conf_2_to = -0.0005 * tow * tow + 0.5488 * tow + 44.279; - vs1g_conf_3_to = -0.0005 * tow * tow + 0.5488 * tow + 43.279; - vs1g_conf_full_to = -0.0007 * tow * tow + 0.6002 * tow + 38.479; - slat_to = vs1g_clean_to * 1.23; - flap2_to = vs1g_conf_2_to * 1.47; - - # predicted appr speeds - clean_appr = 2 * lw * 0.45359237 + 85; - if (altitude > 20000) { - clean_appr += (altitude - 20000) / 1000; - } - vs1g_clean_appr = 0.0024 * lw * lw + 0.124 * lw + 88.942; - vs1g_conf_2_appr = -0.0005 * lw * lw + 0.5488 * lw + 44.279; - vs1g_conf_3_appr = -0.0005 * lw * lw + 0.5488 * lw + 43.279; - vs1g_conf_full_appr = -0.0007 * lw * lw + 0.6002 * lw + 38.479; - slat_appr = vs1g_clean_appr * 1.23; - flap2_appr = vs1g_conf_2_appr * 1.47; - - if (getprop("/FMGC/internal/ldg-config-3-set")) { - vls_appr = vs1g_conf_3_appr * 1.23; - } else { - vls_appr = vs1g_conf_full_appr * 1.23 - } - - if (vls_appr < 113) { - vls_appr = 113; - } - - if (!getprop("/FMGC/internal/vapp-speed-set")) { - if (dest_wind < 5) { - vapp_appr = vls_appr + 5; - } else if (dest_wind > 15) { - vapp_appr = vls_appr + 15; - } else { - vapp_appr = vls_appr + dest_wind; - } - setprop("/FMGC/internal/computed-speeds/vapp_appr", vapp_appr); - } - - # set the values globally - setprop("/FMGC/internal/computed-speeds/clean", clean); - setprop("/FMGC/internal/computed-speeds/vs1g_clean", vs1g_clean); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_1", vs1g_conf_1); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_1f", vs1g_conf_1f); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_2", vs1g_conf_2); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_3", vs1g_conf_3); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_full", vs1g_conf_full); - setprop("/FMGC/internal/computed-speeds/slat", slat); - setprop("/FMGC/internal/computed-speeds/flap2", flap2); - setprop("/FMGC/internal/computed-speeds/flap3", flap3); - setprop("/FMGC/internal/computed-speeds/vls", vls); setprop("/FMGC/internal/computed-speeds/alpha_prot", alpha_prot); setprop("/FMGC/internal/computed-speeds/alpha_max", alpha_max); - setprop("/FMGC/internal/computed-speeds/vs1g_clean_to", vs1g_clean_to); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_2_to", vs1g_conf_2_to); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_3_to", vs1g_conf_3_to); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_full_to", vs1g_conf_full_to); - setprop("/FMGC/internal/computed-speeds/slat_to", slat_to); - setprop("/FMGC/internal/computed-speeds/flap2_to", flap2_to); - setprop("/FMGC/internal/computed-speeds/clean_to", clean_to); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_2_appr", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2")); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_3_appr", getprop("/FMGC/internal/computed-speeds/vs1g_conf_3")); + setprop("/FMGC/internal/computed-speeds/vs1g_conf_full_appr", getprop("/FMGC/internal/computed-speeds/vs1g_conf_full")); - setprop("/FMGC/internal/computed-speeds/vs1g_clean_appr", vs1g_clean_appr); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_2_appr", vs1g_conf_2_appr); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_3_appr", vs1g_conf_3_appr); - setprop("/FMGC/internal/computed-speeds/vs1g_conf_full_appr", vs1g_conf_full_appr); - setprop("/FMGC/internal/computed-speeds/slat_appr", slat_appr); - setprop("/FMGC/internal/computed-speeds/flap2_appr", flap2_appr); - setprop("/FMGC/internal/computed-speeds/clean_appr", clean_appr); - setprop("/FMGC/internal/computed-speeds/vls_appr", vls_appr); - - # Need info on these, also correct for height at altitude... - # https://www.pprune.org/archive/index.php/t-587639.html if (getprop("/FMGC/status/to-state") == 1) { if (flap == 0) { # 0 - setprop("/FMGC/internal/computed-speeds/vls_min", vs1g_clean * 1.28); + setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.28); } else if (flap == 1) { # 1 - setprop("/FMGC/internal/computed-speeds/vls_min", vs1g_conf_1 * 1.23); + setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_1")) * 1.23); } else { # 1+F - setprop("/FMGC/internal/computed-speeds/vls_min", vs1g_clean * 1.13); + setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.13); } } else { if (flap == 0) { # 0 - setprop("/FMGC/internal/computed-speeds/vls_min", vs1g_clean * 1.23); + setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_clean")) * 1.23); } else if (flap == 1) { # 1 - setprop("/FMGC/internal/computed-speeds/vls_min", vs1g_conf_1 * 1.23); + setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_1")) * 1.23); } else if (flap == 2) { # 1+F - setprop("/FMGC/internal/computed-speeds/vls_min", vs1g_conf_1f * 1.23); + setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_1f")) * 1.23); } else if (flap == 3) { # 2 - setprop("/FMGC/internal/computed-speeds/vls_min", vs1g_conf_2 * 1.23); + setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_2")) * 1.23); } else if (flap == 4) { # 3 - setprop("/FMGC/internal/computed-speeds/vls_min", vs1g_conf_3 * 1.23); + setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_3")) * 1.23); } else if (flap == 5) { # FULL - setprop("/FMGC/internal/computed-speeds/vls_min", vs1g_conf_full * 1.23); + setprop("/FMGC/internal/computed-speeds/vls_min", num(getprop("/FMGC/internal/computed-speeds/vs1g_conf_full")) * 1.23); } } if (flap == 0) { # 0 - setprop("/FMGC/internal/computed-speeds/vsw", vs1g_clean); + setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_clean")); } else if (flap == 1) { # 1 - setprop("/FMGC/internal/computed-speeds/vsw", vs1g_conf_1); + setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2")); } else if (flap == 2) { # 1+F - setprop("/FMGC/internal/computed-speeds/vsw", vs1g_conf_1f); + setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_1f")); } else if (flap == 3) { # 2 - setprop("/FMGC/internal/computed-speeds/vsw", vs1g_conf_2); + setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_2")); } else if (flap == 4) { # 3 - setprop("/FMGC/internal/computed-speeds/vsw", vs1g_conf_3); + setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_3")); } else if (flap == 5) { # FULL - setprop("/FMGC/internal/computed-speeds/vsw", vs1g_conf_full); + setprop("/FMGC/internal/computed-speeds/vsw", getprop("/FMGC/internal/computed-speeds/vs1g_conf_full")); } if (flap == 0) { # 0 - setprop("/FMGC/internal/minspeed", clean); + setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/clean")); } else if (flap == 1) { # 1 - setprop("/FMGC/internal/minspeed", slat); + setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/slat")); } else if (flap == 2) { # 1+F - setprop("/FMGC/internal/minspeed", slat); + setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/slat")); } else if (flap == 3) { # 2 - setprop("/FMGC/internal/minspeed", flap2); + setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/flap2")); } else if (flap == 4) { # 3 - setprop("/FMGC/internal/minspeed", flap3); + setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/flap3")); } else if (flap == 5) { # FULL - setprop("/FMGC/internal/minspeed", vapp); + setprop("/FMGC/internal/minspeed", getprop("/FMGC/internal/computed-speeds/vapp")); } if (gear0 == 1 and (state1 == "MCT" or state1 == "MAN THR" or state1 == "TOGA") and (state2 == "MCT" or state2 == "MAN THR" or state2 == "TOGA") and flaps < 5) { @@ -677,7 +675,10 @@ var masterFMGC = maketimer(0.2, func { setprop("/FMGC/status/to-state", 0); } + ############################ #handle radios, runways, v1/vr/v2 + ############################ + departure_rwy = fmgc.flightPlanController.flightplans[2].departure_runway; destination_rwy = fmgc.flightPlanController.flightplans[2].destination_runway; if (destination_rwy != nil and phase >= 2) { diff --git a/Nasal/MCDU/PERFAPPR.nas b/Nasal/MCDU/PERFAPPR.nas index 115709f9..06479715 100644 --- a/Nasal/MCDU/PERFAPPR.nas +++ b/Nasal/MCDU/PERFAPPR.nas @@ -84,7 +84,7 @@ var perfAPPRInput = func(key, i) { mcdu.clearScratchpad(i); } else if (int(scratchpad) != nil and scratchpad >= 100 and scratchpad <= 350) { setprop("/FMGC/internal/vapp-speed-set", 1); - setprop("/FMGC/internal/computed-speeds/vapp", scratchpad); + setprop("/FMGC/internal/computed-speeds/vapp_appr", scratchpad); mcdu.clearScratchpad(i); } else { notAllowed(i);