From a257b23750a8d605dd62148c0f6cbed8cbc2dbe0 Mon Sep 17 00:00:00 2001 From: vezza Date: Sun, 26 Apr 2020 09:59:12 +0200 Subject: [PATCH] Bugfix - Brakes overheat on replay #115 --- Models/FlightDeck/a320.flightdeck.xml | 8 +- Nasal/Systems/brakesystem.nas | 194 +++++++++++--------------- Systems/flight-recorder.xml | 18 ++- 3 files changed, 106 insertions(+), 114 deletions(-) diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml index 82947a55..2ddc2efd 100644 --- a/Models/FlightDeck/a320.flightdeck.xml +++ b/Models/FlightDeck/a320.flightdeck.xml @@ -7125,12 +7125,12 @@ chrono2_1 -0.547 - 0.151 + 0.167 0.196 90 72.81 - center-center + right-center xy-plane text-value %s @@ -7187,7 +7187,7 @@ UTC_1 -0.547 - 0.144 + 0.146 0.196 90 72.81 @@ -7218,7 +7218,7 @@ UTC_2 -0.547 - 0.158 + 0.160 0.196 90 72.81 diff --git a/Nasal/Systems/brakesystem.nas b/Nasal/Systems/brakesystem.nas index 926e1ad1..13aebae2 100755 --- a/Nasal/Systems/brakesystem.nas +++ b/Nasal/Systems/brakesystem.nas @@ -107,68 +107,59 @@ var BrakeSystem = var L_thrust_lb = getprop("engines/engine[0]/thrust_lb"); var R_thrust_lb = getprop("engines/engine[1]/thrust_lb"); - if (dt<1.0) - { + if (getprop("sim/freeze/replay-state")==0 and dt<1.0) { var OnGround = getprop("gear/gear[1]/wow"); #cooling effect: adjust cooling factor by a value proportional to the environment temp (m.CoolingFactor + environment temp-degc * 0.00001) var LCoolingRatio = me.CoolingFactor+(tatdegc*0.000001); var RCoolingRatio = me.CoolingFactor+(tatdegc*0.000001); - if (getprop("controls/gear/brake-fans")) - { + if (getprop("controls/gear/brake-fans")) { #increase CoolingRatio if Brake Fans are active LCoolingRatio = LCoolingRatio * 3; RCoolingRatio = RCoolingRatio * 3; - } - if (getprop("gear/gear[1]/position-norm")) - { + }; + if (getprop("gear/gear[1]/position-norm")) { #increase CoolingRatio if gear down according to airspeed LCoolingRatio = LCoolingRatio * getprop("velocities/airspeed-kt"); } else { #Reduced CoolingRatio if gear up LCoolingRatio = LCoolingRatio * 0.1; - } - if (getprop("gear/gear[2]/position-norm")) - { + }; + if (getprop("gear/gear[2]/position-norm")) { #increase CoolingRatio if gear down according to airspeed RCoolingRatio = RCoolingRatio * getprop("velocities/airspeed-kt"); } else { #Reduced CoolingRatio if gear up RCoolingRatio = RCoolingRatio * 0.1; - } - if (LBrakeLevel>0) - { + }; + if (LBrakeLevel>0) { #Reduced CoolingRatio if Brakes used LCoolingRatio = LCoolingRatio * 0.1 * LBrakeLevel; - } - if (RBrakeLevel>0) - { + }; + if (RBrakeLevel>0) { #Reduced CoolingRatio if Brakes used RCoolingRatio = RCoolingRatio * 0.1 * RBrakeLevel; - } - + }; + var LnCoolFactor = math.ln(1-LCoolingRatio); var RnCoolFactor = math.ln(1-RCoolingRatio); L_thrust_lb = math.abs(getprop("engines/engine[0]/thrust_lb")); - if (L_thrust_lb < 1) - { + if (L_thrust_lb < 1) { L_thrust_lb = 1 - } + }; #Disabling thrust computation on Brakes temperature #L_Thrust = math.pow((math.log10(L_thrust_lb)),10)*0.0000000002; L_Thrust = 0; R_thrust_lb = math.abs(getprop("engines/engine[1]/thrust_lb")); - if (R_thrust_lb < 1) - { + if (R_thrust_lb < 1) { R_thrust_lb = 1 - } + }; #Disabling thrust computation on Brakes temperature #R_Thrust = math.pow((math.log10(R_thrust_lb)),10)*0.0000000002; R_Thrust = 0; - if (OnGround) - { + if (OnGround) { var V1 = getprop("velocities/groundspeed-kt"); var Mass = getprop("fdm/jsbsim/inertia/weight-lbs")*(me.ScalingDivisor); @@ -176,26 +167,21 @@ var BrakeSystem = # dE= 1/2 * m * V1^2 - 1/2 * m * V2^2) var V2_L = V1 - me.BrakeDecel * dt * LBrakeLevel; var V2_R = V1 - me.BrakeDecel * dt * RBrakeLevel; - + LThermalEnergy += (Mass * getprop("gear/gear[1]/compression-norm") * (math.pow(V1, 2) - math.pow(V2_L, 2)) / 2); - if (getprop("services/chocks/left")) - { - if (!getprop("controls/gear/brake-parking")) - { + if (getprop("services/chocks/left")) { + if (!getprop("controls/gear/brake-parking")) { # cooling effect: reduce thermal energy by (LnCoolFactor) * dt LThermalEnergy = LThermalEnergy * math.exp(LnCoolFactor * dt); } else { #LThermalEnergy += L_Thrust; # cooling effect: reduce thermal energy by (LnCoolFactor) * dt LThermalEnergy = (LThermalEnergy * math.exp(LnCoolFactor * dt)) + (L_Thrust * dt); - } + }; } else { - if (!getprop("controls/gear/brake-parking")) - { - if (LBrakeLevel>0) - { - if (V2_L>0) - { + if (!getprop("controls/gear/brake-parking")) { + if (LBrakeLevel>0) { + if (V2_L>0) { #LThermalEnergy += (Mass * (math.pow(V1, 2) - math.pow(V2_L, 2)) / 2) + L_thrust; # cooling effect: reduce thermal energy by (LnCoolFactor) * dt LThermalEnergy = LThermalEnergy * math.exp(LnCoolFactor * dt); @@ -203,37 +189,32 @@ var BrakeSystem = #LThermalEnergy += math.abs(L_Thrust); # cooling effect: reduce thermal energy by (LnCoolFactor) * dt LThermalEnergy = (LThermalEnergy * math.exp(LnCoolFactor * dt)) + (L_Thrust * dt); - } + }; } else { # cooling effect: reduce thermal energy by (LnCoolFactor) * dt LThermalEnergy = LThermalEnergy * math.exp(LnCoolFactor * dt); - } + }; } else { #LThermalEnergy += math.abs(L_Thrust); # cooling effect: reduce thermal energy by (LnCoolFactor) * dt LThermalEnergy = (LThermalEnergy * math.exp(LnCoolFactor * dt)) + (L_Thrust * dt); - } - } + }; + }; RThermalEnergy += (Mass * getprop("gear/gear[2]/compression-norm") * (math.pow(V1, 2) - math.pow(V2_R, 2)) / 2); - if (getprop("services/chocks/right")) - { - if (!getprop("controls/gear/brake-parking")) - { + if (getprop("services/chocks/right")) { + if (!getprop("controls/gear/brake-parking")) { # cooling effect: reduce thermal energy by (RnCoolFactor) * dt RThermalEnergy = RThermalEnergy * math.exp(RnCoolFactor * dt); } else { #RThermalEnergy += math.abs(R_Thrust); # cooling effect: reduce thermal energy by (RnCoolFactor) * dt RThermalEnergy = (RThermalEnergy * math.exp(RnCoolFactor * dt)) + (R_Thrust * dt); - } + }; } else { - if (!getprop("controls/gear/brake-parking")) - { - if (RBrakeLevel>0) - { - if (V2_R>0) - { + if (!getprop("controls/gear/brake-parking")) { + if (RBrakeLevel>0) { + if (V2_R>0) { #RThermalEnergy += (Mass * (math.pow(V1, 2) - math.pow(V2_R, 2)) / 2) + R_thrust; # cooling effect: reduce thermal energy by (RnCoolFactor) * dt RThermalEnergy = RThermalEnergy * math.exp(RnCoolFactor * dt); @@ -241,36 +222,34 @@ var BrakeSystem = #RThermalEnergy += math.abs(R_Thrust); # cooling effect: reduce thermal energy by (RnCoolFactor) * dt RThermalEnergy = (RThermalEnergy * math.exp(RnCoolFactor * dt)) + (R_Thrust * dt); - } + }; } else { # cooling effect: reduce thermal energy by (RnCoolFactor) * dt RThermalEnergy = RThermalEnergy * math.exp(RnCoolFactor * dt); - } + }; } else { #RThermalEnergy += math.abs(R_Thrust); # cooling effect: reduce thermal energy by (RnCoolFactor) * dt RThermalEnergy = (RThermalEnergy * math.exp(RnCoolFactor * dt)) + (R_Thrust * dt); - } - } - + }; + }; } else { LThermalEnergy = LThermalEnergy * math.exp(LnCoolFactor * dt); RThermalEnergy = RThermalEnergy * math.exp(RnCoolFactor * dt); - } - - if (LThermalEnergy < 0) { + }; + if (LThermalEnergy < 0) { LThermalEnergy = 0 - } + }; if (LThermalEnergy > 3) { LThermalEnergy = 3 - } + }; if (RThermalEnergy < 0) { RThermalEnergy = 0 - } + }; if (RThermalEnergy > 3) { RThermalEnergy = 3 - } - + }; + setprop("gear/gear[1]/L-Thrust",L_Thrust); setprop("gear/gear[2]/R-Thrust",R_Thrust); setprop("gear/gear[1]/Lbrake-thermal-energy",LThermalEnergy); @@ -281,21 +260,19 @@ var BrakeSystem = setprop("gear/gear[1]/L2brake-temp-degc",tatdegc+getprop("gear/gear[1]/L2error-temp-degc")+(LThermalEnergy * (300-tatdegc-getprop("gear/gear[1]/L2error-temp-degc")))); setprop("gear/gear[2]/R3brake-temp-degc",tatdegc+getprop("gear/gear[2]/R3error-temp-degc")+(RThermalEnergy * (300-tatdegc-getprop("gear/gear[2]/R3error-temp-degc")))); setprop("gear/gear[2]/R4brake-temp-degc",tatdegc+getprop("gear/gear[2]/R4error-temp-degc")+(RThermalEnergy * (300-tatdegc-getprop("gear/gear[2]/R4error-temp-degc")))); - - if ((LThermalEnergy>1)and(!me.LSmokeActive)) - { + + if ((LThermalEnergy>1)and(!me.LSmokeActive)) { # start smoke processing me.LSmokeActive = 1; settimer(func { BrakeSys.Lsmoke(); },0); - } - if ((RThermalEnergy>1)and(!me.RSmokeActive)) - { + }; + if ((RThermalEnergy>1)and(!me.RSmokeActive)) { # start smoke processing me.RSmokeActive = 1; settimer(func { BrakeSys.Rsmoke(); },0); - } - } - + }; + }; + me.LastSimTime = CurrentTime; # 5 updates per second are good enough settimer(func { BrakeSys.update(); },0.2); @@ -304,85 +281,84 @@ var BrakeSystem = # smoke processing Lsmoke : func() { - if ((me.LSmokeActive)and(getprop("gear/gear[1]/Lbrake-thermal-energy")>1)) - { + if ((me.LSmokeActive)and(getprop("gear/gear[1]/Lbrake-thermal-energy")>1)) { # make density of smoke effect depend on energy level var LSmokeDelay=0; var LThermalEnergy = getprop("gear/gear[1]/Lbrake-thermal-energy"); - if (LThermalEnergy < 1.5) - LSmokeDelay=(1.5-LThermalEnergy); + if (LThermalEnergy < 1.5) { + LSmokeDelay=(1.5-LThermalEnergy); + }; + # No smoke when gear retracted var LSmokeValue = (getprop("gear/gear[1]/position-norm")>0.5); # toggle smoke to interpolate different densities - if (LSmokeDelay>0.05) - { + if (LSmokeDelay>0.05) { me.LSmokeToggle = !me.LSmokeToggle; if (!me.LSmokeToggle) LSmokeValue = 0; else LSmokeDelay = 0; - } + }; setprop("gear/gear[1]/Lbrake-smoke",LSmokeValue); settimer(func { BrakeSys.Lsmoke(); },LSmokeDelay); - } - else - { + } else { # stop smoke processing setprop("gear/gear[1]/Lbrake-smoke",0); setprop("sim/animation/fire-services",0); me.LSmokeActive = 0; - } - if (getprop("gear/gear[1]/Lbrake-thermal-energy") > 1.5) + }; + if (getprop("gear/gear[1]/Lbrake-thermal-energy") > 1.5) { setprop("sim/animation/fire-services",1); - else - setprop("sim/animation/fire-services",0); + } else { + setprop("sim/animation/fire-services",0); + }; + }, # smoke processing Rsmoke : func() { - if ((me.RSmokeActive)and(getprop("gear/gear[2]/Rbrake-thermal-energy")>1)) - { + if ((me.RSmokeActive)and(getprop("gear/gear[2]/Rbrake-thermal-energy")>1)) { # make density of smoke effect depend on energy level var RSmokeDelay=0; var RThermalEnergy = getprop("gear/gear[2]/Rbrake-thermal-energy"); - if (RThermalEnergy < 1.5) + if (RThermalEnergy < 1.5) { RSmokeDelay=(1.5-RThermalEnergy); + }; + # No smoke when gear retracted var RSmokeValue = (getprop("gear/gear[2]/position-norm")>0.5); # toggle smoke to interpolate different densities - if (RSmokeDelay>0.05) - { + if (RSmokeDelay>0.05) { me.RSmokeToggle = !me.RSmokeToggle; if (!me.RSmokeToggle) RSmokeValue = 0; else RSmokeDelay = 0; - } + }; setprop("gear/gear[2]/Rbrake-smoke",RSmokeValue); settimer(func { BrakeSys.Rsmoke(); },RSmokeDelay); - } - else - { + } else { # stop smoke processing setprop("gear/gear[2]/Rbrake-smoke",0); me.RSmokeActive = 0; - } - if (getprop("gear/gear[2]/Rbrake-thermal-energy") > 1.5) - setprop("sim/animation/fire-services",1); - else - setprop("sim/animation/fire-services",0); + }; + if (getprop("gear/gear[2]/Rbrake-thermal-energy") > 1.5) { + setprop("sim/animation/fire-services",1); + } else { + setprop("sim/animation/fire-services",0); + }; }, }; var BrakeSys = BrakeSystem.new(); setlistener("sim/signals/fdm-initialized", - # executed on _every_ FDM reset (but not installing new listeners) - func(idle) { BrakeSys.reset(); }, - 0,0); + # executed on _every_ FDM reset (but not installing new listeners) + func(idle) { BrakeSys.reset(); }, +0,0); settimer(func() - { - BrakeSys.update(); - }, 5); + { + BrakeSys.update(); + }, 5); diff --git a/Systems/flight-recorder.xml b/Systems/flight-recorder.xml index d43b02b3..eeaf44cf 100644 --- a/Systems/flight-recorder.xml +++ b/Systems/flight-recorder.xml @@ -134,7 +134,23 @@ float /fdm/jsbsim/hydraulics/spoiler-r5/final-deg + + float + /gear/gear[1]/L1brake-temp-degc + + + float + /gear/gear[1]/L2brake-temp-degc + + + float + /gear/gear[2]/R3brake-temp-degc + + + float + /gear/gear[2]/R4brake-temp-degc + - \ No newline at end of file +