Skip to content

Commit bed8962

Browse files
authored
feat(efcs): update yaw damper with calculated gain (flybywiresim#8299)
* feat(efcs): update yaw damper with calculated gain * feat(flightmodel): remove rudder elasticity table * chore: add changelog
1 parent 7a6d143 commit bed8962

File tree

4 files changed

+98
-96
lines changed

4 files changed

+98
-96
lines changed

.github/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
1. [MODEL] General improvements to 3d model and textures - @MoreRightRudder, @Repsol2k, @tracernz
3333
1. [MODEL] Folding armrests - @Repsol2k
3434
1. [LIGHTING] Fixed Automatic Lighting on Spawn depending on outside lightcondition - @Maximilian-Reuter (\_Chaoz_)
35+
1. [EFCS] Implement calculated yaw damper gain - @lukecologne (luke)
36+
1. [EFCS] Decrease yaw damper at low speeds on ground, down to 0 below 40kts - @lukecologne (luke)
3537

3638
## 0.11.0
3739

fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/flight_model.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ flap_to_aileron_scale = 0 ; non-dimensional
230230
fly_by_wire = 0 ; Fly-by-wire available true/false
231231
elevator_elasticity_table = 0:1, 400:1
232232
aileron_elasticity_table = 0:1, 400:1
233-
rudder_elasticity_table = 0:1, 85:1, 110:0.7, 445:0.136
233+
rudder_elasticity_table = 0:1, 400:1
234234
elevator_trim_elasticity_table = 0:0.3, 100:0.35, 120:1, 400:1
235235
;controls_reactivity_scalar = 1 ; Reactivity scalar for all controls
236236

fbw-a32nx/src/wasm/fbw_a320/src/model/LateralNormalLaw.cpp

Lines changed: 81 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ LateralNormalLaw::Parameters_LateralNormalLaw_T LateralNormalLaw::LateralNormalL
2020
{ 0.0, 140.0, 180.0, 220.0, 250.0, 270.0, 300.0, 320.0, 400.0 },
2121

2222

23-
{ 0.0, 100.0, 150.0, 200.0, 250.0, 300.0, 400.0 },
24-
25-
26-
{ 0.0, 100.0, 150.0, 200.0, 250.0, 300.0, 400.0 },
23+
{ 0.0, 40.0, 100.0, 180.0 },
2724

2825

2926
{ 0.0, 0.06, 0.1, 0.2, 1.0 },
@@ -60,10 +57,7 @@ LateralNormalLaw::Parameters_LateralNormalLaw_T LateralNormalLaw::LateralNormalL
6057
{ 1.1, 1.3, 1.8, 2.0, 2.2, 2.5, 2.7, 3.2, 3.8 },
6158

6259

63-
{ 4.5, 4.5, 4.5, 3.5, 2.0, 1.5, 1.5 },
64-
65-
66-
{ 1.4, 1.4, 1.4, 1.2, 1.0, 0.8, 0.8 },
60+
{ 0.0, 0.0, 1.4, 1.4 },
6761

6862

6963
{ 1.1, 1.0, 0.6, 0.3, 0.1 },
@@ -152,6 +146,10 @@ LateralNormalLaw::Parameters_LateralNormalLaw_T LateralNormalLaw::LateralNormalL
152146

153147
57.295779513082323,
154148

149+
0.017453292519943295,
150+
151+
57.295779513082323,
152+
155153
25.0,
156154

157155
-25.0,
@@ -271,6 +269,7 @@ void LateralNormalLaw::step(const real_T *rtu_In_time_dt, const real_T *rtu_In_T
271269

272270
real_T L_xi;
273271
real_T Vias;
272+
real_T Vias_tmp;
274273
real_T b_x;
275274
real_T k_phi;
276275
real_T r;
@@ -279,12 +278,12 @@ void LateralNormalLaw::step(const real_T *rtu_In_time_dt, const real_T *rtu_In_T
279278
real_T rtb_Gain_b;
280279
real_T rtb_Saturation2;
281280
real_T rtb_Saturation_f;
282-
real_T rtb_Switch2;
283281
real_T rtb_Y_i;
284-
real_T rtb_Y_o;
285282
real_T rtb_beDot;
283+
real_T rtb_input_V_ias_kn;
286284
real_T rtb_input_p_V_tas_kn;
287-
real_T v_cas_ms;
285+
real_T rtb_uDLookupTable_n;
286+
real_T u0;
288287
real_T x;
289288
int32_T low_i;
290289
int32_T low_ip1;
@@ -321,10 +320,10 @@ void LateralNormalLaw::step(const real_T *rtu_In_time_dt, const real_T *rtu_In_T
321320
LateralNormalLaw_rtP.RateLimiterVariableTs_lo, rtu_In_time_dt,
322321
LateralNormalLaw_rtP.RateLimiterVariableTs_InitialCondition, &rtb_Y_i, &LateralNormalLaw_DWork.sf_RateLimiter);
323322
rtb_Gain_b = LateralNormalLaw_rtP.Gain_Gain * *rtu_In_delta_xi_pos;
324-
v_cas_ms = *rtu_In_V_ias_kn;
323+
rtb_input_V_ias_kn = *rtu_In_V_ias_kn;
325324
rtb_Gain = *rtu_In_delta_zeta_pos;
326-
Vias = std::fmax(v_cas_ms, 60.0);
327-
v_cas_ms = 0.0;
325+
Vias = std::fmax(rtb_input_V_ias_kn, 60.0);
326+
rtb_input_V_ias_kn = 0.0;
328327
if (Vias <= 380.0) {
329328
rtb_in_flight = 4;
330329
low_i = 1;
@@ -341,31 +340,31 @@ void LateralNormalLaw::step(const real_T *rtu_In_time_dt, const real_T *rtu_In_T
341340

342341
r = (Vias - static_cast<real_T>(b[low_i - 1])) / static_cast<real_T>(b[low_i] - b[low_i - 1]);
343342
if (r == 0.0) {
344-
v_cas_ms = -15.0;
343+
rtb_input_V_ias_kn = -15.0;
345344
} else if (r == 1.0) {
346-
v_cas_ms = c[low_i];
345+
rtb_input_V_ias_kn = c[low_i];
347346
} else if (c[low_i] == -15) {
348-
v_cas_ms = -15.0;
347+
rtb_input_V_ias_kn = -15.0;
349348
} else {
350-
v_cas_ms = (1.0 - r) * -15.0 + r * static_cast<real_T>(c[low_i]);
349+
rtb_input_V_ias_kn = (1.0 - r) * -15.0 + r * static_cast<real_T>(c[low_i]);
351350
}
352351
}
353352

354353
rtb_Saturation_f = Vias * 0.5144;
355354
LateralNormalLaw_RateLimiter(0.814 / std::sqrt(1.3734E+6 / (149.45000000000002 * (rtb_Saturation_f * rtb_Saturation_f)))
356-
* (v_cas_ms * rtb_Gain), LateralNormalLaw_rtP.RateLimiterVariableTs1_up,
355+
* (rtb_input_V_ias_kn * rtb_Gain), LateralNormalLaw_rtP.RateLimiterVariableTs1_up,
357356
LateralNormalLaw_rtP.RateLimiterVariableTs1_lo, rtu_In_time_dt,
358357
LateralNormalLaw_rtP.RateLimiterVariableTs1_InitialCondition, &Vias, &LateralNormalLaw_DWork.sf_RateLimiter_d);
359-
rtb_Y_o = *rtu_In_r_deg_s;
360-
rtb_Switch2 = *rtu_In_V_ias_kn;
358+
Vias = *rtu_In_r_deg_s;
359+
rtb_beDot = *rtu_In_V_ias_kn;
361360
rtb_input_p_V_tas_kn = *rtu_In_V_tas_kn;
362-
rtb_beDot = *rtu_In_delta_zeta_pos;
361+
rtb_uDLookupTable_n = *rtu_In_delta_zeta_pos;
363362
rtb_Saturation2 = LateralNormalLaw_rtP.Gain1_Gain * *rtu_In_delta_xi_pos;
364363
rtb_Gain = LateralNormalLaw_rtP.DiscreteDerivativeVariableTs_Gain * rtb_Saturation2;
365364
rtb_Divide = (rtb_Gain - LateralNormalLaw_DWork.Delay_DSTATE) / *rtu_In_time_dt;
366-
v_cas_ms = std::fmax(*rtu_In_V_ias_kn, 80.0) * 0.5144;
367-
Vias = v_cas_ms * v_cas_ms * 0.6125;
368-
L_xi = Vias * 122.0 * 17.9 * -0.090320788790706555 / 1.0E+6;
365+
rtb_input_V_ias_kn = std::fmax(*rtu_In_V_ias_kn, 80.0) * 0.5144;
366+
Vias_tmp = rtb_input_V_ias_kn * rtb_input_V_ias_kn * 0.6125;
367+
L_xi = Vias_tmp * 122.0 * 17.9 * -0.090320788790706555 / 1.0E+6;
369368
if (*rtu_In_V_ias_kn > 400.0) {
370369
r = 2.0;
371370
} else if (*rtu_In_V_ias_kn < -1.0) {
@@ -419,14 +418,14 @@ void LateralNormalLaw::step(const real_T *rtu_In_time_dt, const real_T *rtu_In_T
419418
b_x = *rtu_In_pk_deg_s;
420419
}
421420

422-
rtb_Saturation2 = (1.0 / r * rtb_Divide + rtb_Saturation2) + rtb_Saturation_f;
423-
if (rtb_Saturation2 > LateralNormalLaw_rtP.Saturation_UpperSat_a) {
424-
rtb_Saturation2 = LateralNormalLaw_rtP.Saturation_UpperSat_a;
425-
} else if (rtb_Saturation2 < LateralNormalLaw_rtP.Saturation_LowerSat_o) {
426-
rtb_Saturation2 = LateralNormalLaw_rtP.Saturation_LowerSat_o;
421+
u0 = (1.0 / r * rtb_Divide + rtb_Saturation2) + rtb_Saturation_f;
422+
if (u0 > LateralNormalLaw_rtP.Saturation_UpperSat_a) {
423+
u0 = LateralNormalLaw_rtP.Saturation_UpperSat_a;
424+
} else if (u0 < LateralNormalLaw_rtP.Saturation_LowerSat_o) {
425+
u0 = LateralNormalLaw_rtP.Saturation_LowerSat_o;
427426
}
428427

429-
rtb_Saturation_f = std::fmin(b_x, std::fmax(x, rtb_Saturation2 * rtb_Y_i)) *
428+
rtb_Saturation_f = std::fmin(b_x, std::fmax(x, u0 * rtb_Y_i)) *
430429
LateralNormalLaw_rtP.DiscreteTimeIntegratorVariableTs_Gain * *rtu_In_time_dt;
431430
rtb_OR = ((rtb_Y_i == 0.0) || (*rtu_In_tracking_mode_on) || (*rtu_In_any_ap_engaged));
432431
rtb_Divide = *rtu_In_Phi_deg - rtb_Saturation_f;
@@ -453,30 +452,30 @@ void LateralNormalLaw::step(const real_T *rtu_In_time_dt, const real_T *rtu_In_T
453452
}
454453

455454
rtb_Saturation2 = std::fmax(rtb_input_p_V_tas_kn * 0.5144, 60.0);
456-
rtb_Saturation_f = rtb_Switch2 * 0.5144;
457-
if (rtb_Switch2 >= 60.0) {
458-
rtb_beDot = (rtb_Saturation_f * rtb_Saturation_f * 0.6125 * 122.0 / (70000.0 * rtb_Saturation2) * 3.172 * -rtb_beDot
459-
* 3.1415926535897931 / 180.0 + (rtb_Divide * 3.1415926535897931 / 180.0 * (9.81 / rtb_Saturation2) +
460-
-(rtb_Y_o * 3.1415926535897931 / 180.0))) * 180.0 / 3.1415926535897931;
455+
rtb_Saturation_f = rtb_beDot * 0.5144;
456+
if (rtb_beDot >= 60.0) {
457+
rtb_beDot = (rtb_Saturation_f * rtb_Saturation_f * 0.6125 * 122.0 / (70000.0 * rtb_Saturation2) * 3.172 *
458+
-rtb_uDLookupTable_n * 3.1415926535897931 / 180.0 + (rtb_Divide * 3.1415926535897931 / 180.0 * (9.81 /
459+
rtb_Saturation2) + -(Vias * 3.1415926535897931 / 180.0))) * 180.0 / 3.1415926535897931;
461460
} else {
462461
rtb_beDot = 0.0;
463462
}
464463

465-
LateralNormalLaw_LagFilter(rtb_beDot, LateralNormalLaw_rtP.LagFilter_C1, rtu_In_time_dt, &rtb_Y_o,
464+
LateralNormalLaw_LagFilter(rtb_beDot, LateralNormalLaw_rtP.LagFilter_C1, rtu_In_time_dt, &rtb_Saturation2,
466465
&LateralNormalLaw_DWork.sf_LagFilter);
467466
rtb_Saturation_f = look1_binlxpw(*rtu_In_V_ias_kn, LateralNormalLaw_rtP.ScheduledGain2_BreakpointsForDimension1,
468467
LateralNormalLaw_rtP.ScheduledGain2_Table, 3U);
469468
if (*rtu_In_any_ap_engaged) {
470-
rtb_Switch2 = *rtu_In_ap_beta_c_deg;
469+
Vias = *rtu_In_ap_beta_c_deg;
471470
} else {
472-
rtb_Switch2 = *rtu_In_delta_zeta_pos * rtb_Saturation_f;
471+
Vias = *rtu_In_delta_zeta_pos * rtb_Saturation_f;
473472
}
474473

475474
rtb_Saturation_f = look1_binlxpw(*rtu_In_V_ias_kn, LateralNormalLaw_rtP.ScheduledGain1_BreakpointsForDimension1,
476475
LateralNormalLaw_rtP.ScheduledGain1_Table, 4U);
477-
LateralNormalLaw_LagFilter((rtb_Switch2 - rtb_Y_o) * rtb_Saturation_f - rtb_beDot, LateralNormalLaw_rtP.LagFilter_C1_d,
478-
rtu_In_time_dt, &rtb_Y_o, &LateralNormalLaw_DWork.sf_LagFilter_m);
479-
rtb_Saturation2 = look1_binlxpw(*rtu_In_V_ias_kn, LateralNormalLaw_rtP.ScheduledGain_BreakpointsForDimension1,
476+
LateralNormalLaw_LagFilter((Vias - rtb_Saturation2) * rtb_Saturation_f - rtb_beDot,
477+
LateralNormalLaw_rtP.LagFilter_C1_d, rtu_In_time_dt, &rtb_Saturation2, &LateralNormalLaw_DWork.sf_LagFilter_m);
478+
rtb_uDLookupTable_n = look1_binlxpw(*rtu_In_V_ias_kn, LateralNormalLaw_rtP.ScheduledGain_BreakpointsForDimension1,
480479
LateralNormalLaw_rtP.ScheduledGain_Table, 8U);
481480
if (!LateralNormalLaw_DWork.pY_not_empty_h) {
482481
LateralNormalLaw_DWork.pY_p = LateralNormalLaw_rtP.RateLimiterVariableTs_InitialCondition_d;
@@ -496,56 +495,58 @@ void LateralNormalLaw::step(const real_T *rtu_In_time_dt, const real_T *rtu_In_T
496495
}
497496

498497
rtb_beDot = *rtu_In_ap_beta_c_deg * rtb_Saturation_f;
499-
rtb_Saturation2 = rtb_Switch2 * rtb_Saturation2 + rtb_Y_o;
500-
if (rtb_Saturation2 > LateralNormalLaw_rtP.Saturation_UpperSat_f) {
501-
rtb_Saturation2 = LateralNormalLaw_rtP.Saturation_UpperSat_f;
502-
} else if (rtb_Saturation2 < LateralNormalLaw_rtP.Saturation_LowerSat_j) {
503-
rtb_Saturation2 = LateralNormalLaw_rtP.Saturation_LowerSat_j;
498+
u0 = Vias * rtb_uDLookupTable_n + rtb_Saturation2;
499+
if (u0 > LateralNormalLaw_rtP.Saturation_UpperSat_f) {
500+
u0 = LateralNormalLaw_rtP.Saturation_UpperSat_f;
501+
} else if (u0 < LateralNormalLaw_rtP.Saturation_LowerSat_j) {
502+
u0 = LateralNormalLaw_rtP.Saturation_LowerSat_j;
504503
}
505504

506-
rtb_Saturation_f = (LateralNormalLaw_rtP.Constant_Value - rtb_Saturation_f) * rtb_Saturation2 + rtb_beDot;
505+
rtb_Saturation_f = (LateralNormalLaw_rtP.Constant_Value - rtb_Saturation_f) * u0 + rtb_beDot;
507506
} else {
508507
rtb_Saturation_f = LateralNormalLaw_rtP.Constant_Value_b;
509508
}
510509

511-
rtb_Y_o = LateralNormalLaw_rtP.Gain1_Gain_l * *rtu_In_Theta_deg;
512-
rtb_Saturation2 = *rtu_In_V_tas_kn;
513-
if (rtb_Saturation2 > LateralNormalLaw_rtP.Saturation_UpperSat_e) {
514-
rtb_Saturation2 = LateralNormalLaw_rtP.Saturation_UpperSat_e;
515-
} else if (rtb_Saturation2 < LateralNormalLaw_rtP.Saturation_LowerSat_jd) {
516-
rtb_Saturation2 = LateralNormalLaw_rtP.Saturation_LowerSat_jd;
510+
rtb_Saturation2 = LateralNormalLaw_rtP.Gain1_Gain_p * *rtu_In_Theta_deg;
511+
u0 = *rtu_In_V_tas_kn;
512+
if (u0 > LateralNormalLaw_rtP.Saturation_UpperSat_c) {
513+
u0 = LateralNormalLaw_rtP.Saturation_UpperSat_c;
514+
} else if (u0 < LateralNormalLaw_rtP.Saturation_LowerSat_i) {
515+
u0 = LateralNormalLaw_rtP.Saturation_LowerSat_i;
517516
}
518517

519-
rtb_Y_o = *rtu_In_r_deg_s - std::sin(LateralNormalLaw_rtP.Gain1_Gain_f * rtb_Divide) *
520-
LateralNormalLaw_rtP.Constant2_Value * std::cos(rtb_Y_o) / (LateralNormalLaw_rtP.Gain6_Gain * rtb_Saturation2) *
521-
LateralNormalLaw_rtP.Gain_Gain_i;
522-
rtb_Saturation2 = look1_binlxpw(*rtu_In_V_tas_kn, LateralNormalLaw_rtP.ScheduledGain_BreakpointsForDimension1_a,
523-
LateralNormalLaw_rtP.ScheduledGain_Table_e, 6U);
524-
rtb_Switch2 = rtb_Y_o * rtb_Saturation2;
518+
rtb_uDLookupTable_n = *rtu_In_r_deg_s - std::sin(LateralNormalLaw_rtP.Gain1_Gain_j * rtb_Divide) *
519+
LateralNormalLaw_rtP.Constant2_Value * std::cos(rtb_Saturation2) / (LateralNormalLaw_rtP.Gain6_Gain * u0) *
520+
LateralNormalLaw_rtP.Gain_Gain_g;
525521
rtb_OR = !*rtu_In_on_ground;
526522
if (!LateralNormalLaw_DWork.pY_not_empty) {
527523
LateralNormalLaw_DWork.pY = LateralNormalLaw_rtP.RateLimiterVariableTs1_InitialCondition_m;
528524
LateralNormalLaw_DWork.pY_not_empty = true;
529525
}
530526

531527
LateralNormalLaw_DWork.pY += std::fmax(std::fmin(static_cast<real_T>(rtb_OR) - LateralNormalLaw_DWork.pY, std::abs
532-
(LateralNormalLaw_rtP.RateLimiterVariableTs1_up_j) * *rtu_In_time_dt), -std::abs
533-
(LateralNormalLaw_rtP.RateLimiterVariableTs1_lo_n) * *rtu_In_time_dt);
534-
if (LateralNormalLaw_DWork.pY > LateralNormalLaw_rtP.Saturation_UpperSat_n) {
535-
rtb_Y_o = LateralNormalLaw_rtP.Saturation_UpperSat_n;
536-
} else if (LateralNormalLaw_DWork.pY < LateralNormalLaw_rtP.Saturation_LowerSat_b) {
537-
rtb_Y_o = LateralNormalLaw_rtP.Saturation_LowerSat_b;
528+
(LateralNormalLaw_rtP.RateLimiterVariableTs1_up_o) * *rtu_In_time_dt), -std::abs
529+
(LateralNormalLaw_rtP.RateLimiterVariableTs1_lo_m) * *rtu_In_time_dt);
530+
if (LateralNormalLaw_DWork.pY > LateralNormalLaw_rtP.Saturation_UpperSat_j) {
531+
Vias = LateralNormalLaw_rtP.Saturation_UpperSat_j;
532+
} else if (LateralNormalLaw_DWork.pY < LateralNormalLaw_rtP.Saturation_LowerSat_n) {
533+
Vias = LateralNormalLaw_rtP.Saturation_LowerSat_n;
538534
} else {
539-
rtb_Y_o = LateralNormalLaw_DWork.pY;
535+
Vias = LateralNormalLaw_DWork.pY;
540536
}
541537

542-
rtb_Saturation2 = look1_binlxpw(*rtu_In_V_tas_kn, LateralNormalLaw_rtP.ScheduledGain1_BreakpointsForDimension1_j,
543-
LateralNormalLaw_rtP.ScheduledGain1_Table_m, 6U);
538+
rtb_Saturation2 = look1_binlxpw(*rtu_In_V_ias_kn, LateralNormalLaw_rtP.ScheduledGain1_BreakpointsForDimension1_i,
539+
LateralNormalLaw_rtP.ScheduledGain1_Table_d, 3U);
544540
rtb_Saturation2 *= *rtu_In_r_deg_s;
545-
if (rtb_Switch2 > LateralNormalLaw_rtP.Saturation1_UpperSat) {
546-
rtb_Switch2 = LateralNormalLaw_rtP.Saturation1_UpperSat;
547-
} else if (rtb_Switch2 < LateralNormalLaw_rtP.Saturation1_LowerSat) {
548-
rtb_Switch2 = LateralNormalLaw_rtP.Saturation1_LowerSat;
541+
rtb_input_p_V_tas_kn = Vias_tmp * 122.0 * 17.9;
542+
u0 = -(Vias_tmp / rtb_input_V_ias_kn * 122.0 * 320.40999999999997 * -0.10100220381291185 / 4.47E+6 + std::sqrt
543+
(rtb_input_p_V_tas_kn * 0.0035255650890285459 / 4.47E+6) * 1.414) / (rtb_input_p_V_tas_kn *
544+
-0.018936822384138473 / 4.47E+6) * (LateralNormalLaw_rtP.Gain1_Gain_k * rtb_uDLookupTable_n) *
545+
LateralNormalLaw_rtP.Gain_Gain_b;
546+
if (u0 > LateralNormalLaw_rtP.Saturation1_UpperSat) {
547+
u0 = LateralNormalLaw_rtP.Saturation1_UpperSat;
548+
} else if (u0 < LateralNormalLaw_rtP.Saturation1_LowerSat) {
549+
u0 = LateralNormalLaw_rtP.Saturation1_LowerSat;
549550
}
550551

551552
if (rtb_Saturation2 > LateralNormalLaw_rtP.Saturation2_UpperSat) {
@@ -554,15 +555,14 @@ void LateralNormalLaw::step(const real_T *rtu_In_time_dt, const real_T *rtu_In_T
554555
rtb_Saturation2 = LateralNormalLaw_rtP.Saturation2_LowerSat;
555556
}
556557

557-
*rty_Out_zeta_deg = ((LateralNormalLaw_rtP.Constant_Value_k - rtb_Y_o) * rtb_Saturation2 + rtb_Switch2 * rtb_Y_o) +
558-
rtb_Saturation_f;
558+
*rty_Out_zeta_deg = ((LateralNormalLaw_rtP.Constant_Value_b2 - Vias) * rtb_Saturation2 + u0 * Vias) + rtb_Saturation_f;
559559
rtb_Saturation_f = LateralNormalLaw_rtP.Gain1_Gain_b * *rtu_In_Phi_deg;
560-
rtb_Switch2 = LateralNormalLaw_rtP.Gain1_Gain_c * *rtu_In_pk_deg_s;
561-
rtb_Y_o = look1_binlxpw(*rtu_In_time_dt, LateralNormalLaw_rtP.ScheduledGain_BreakpointsForDimension1_j,
562-
LateralNormalLaw_rtP.ScheduledGain_Table_i, 4U);
563-
LateralNormalLaw_DWork.Delay_DSTATE_e = ((-(Vias / v_cas_ms * 122.0 * 320.40999999999997 * -0.487 / 1.0E+6 + 1.414 * r)
564-
/ L_xi * rtb_Switch2 + k_phi * rtb_Saturation_f) + LateralNormalLaw_rtP.Gain1_Gain_n * rtb_Divide * -k_phi) *
565-
rtb_Y_o * LateralNormalLaw_rtP.Gain_Gain_p;
560+
rtb_Saturation2 = LateralNormalLaw_rtP.Gain1_Gain_c * *rtu_In_pk_deg_s;
561+
Vias = look1_binlxpw(*rtu_In_time_dt, LateralNormalLaw_rtP.ScheduledGain_BreakpointsForDimension1_j,
562+
LateralNormalLaw_rtP.ScheduledGain_Table_i, 4U);
563+
LateralNormalLaw_DWork.Delay_DSTATE_e = ((-(Vias_tmp / rtb_input_V_ias_kn * 122.0 * 320.40999999999997 * -0.487 /
564+
1.0E+6 + 1.414 * r) / L_xi * rtb_Saturation2 + k_phi * rtb_Saturation_f) + LateralNormalLaw_rtP.Gain1_Gain_n *
565+
rtb_Divide * -k_phi) * Vias * LateralNormalLaw_rtP.Gain_Gain_p;
566566
if (rtb_Y_i > LateralNormalLaw_rtP.Saturation1_UpperSat_e) {
567567
rtb_Y_i = LateralNormalLaw_rtP.Saturation1_UpperSat_e;
568568
} else if (rtb_Y_i < LateralNormalLaw_rtP.Saturation1_LowerSat_l) {

fbw-a32nx/src/wasm/fbw_a320/src/model/LateralNormalLaw.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ class LateralNormalLaw final
4141
real_T ScheduledGain2_BreakpointsForDimension1[4];
4242
real_T ScheduledGain1_BreakpointsForDimension1[5];
4343
real_T ScheduledGain_BreakpointsForDimension1[9];
44-
real_T ScheduledGain_BreakpointsForDimension1_a[7];
45-
real_T ScheduledGain1_BreakpointsForDimension1_j[7];
44+
real_T ScheduledGain1_BreakpointsForDimension1_i[4];
4645
real_T ScheduledGain_BreakpointsForDimension1_j[5];
4746
real_T LagFilter_C1;
4847
real_T LagFilter_C1_d;
@@ -58,19 +57,18 @@ class LateralNormalLaw final
5857
real_T ScheduledGain2_Table[4];
5958
real_T ScheduledGain1_Table[5];
6059
real_T ScheduledGain_Table[9];
61-
real_T ScheduledGain_Table_e[7];
62-
real_T ScheduledGain1_Table_m[7];
60+
real_T ScheduledGain1_Table_d[4];
6361
real_T ScheduledGain_Table_i[5];
6462
real_T DiscreteTimeIntegratorVariableTs_UpperLimit;
6563
real_T RateLimiterVariableTs_lo;
6664
real_T RateLimiterVariableTs1_lo;
6765
real_T RateLimiterVariableTs_lo_l;
68-
real_T RateLimiterVariableTs1_lo_n;
66+
real_T RateLimiterVariableTs1_lo_m;
6967
real_T RateLimiterVariableTs_lo_b;
7068
real_T RateLimiterVariableTs_up;
7169
real_T RateLimiterVariableTs1_up;
7270
real_T RateLimiterVariableTs_up_o;
73-
real_T RateLimiterVariableTs1_up_j;
71+
real_T RateLimiterVariableTs1_up_o;
7472
real_T RateLimiterVariableTs_up_d;
7573
real_T BankAngleProtection2_tableData[5];
7674
real_T BankAngleProtection2_bp01Data[5];
@@ -94,19 +92,21 @@ class LateralNormalLaw final
9492
real_T Saturation_LowerSat_o;
9593
real_T Delay_InitialCondition;
9694
real_T Constant2_Value;
97-
real_T Gain1_Gain_f;
98-
real_T Gain1_Gain_l;
99-
real_T Saturation_UpperSat_e;
100-
real_T Saturation_LowerSat_jd;
95+
real_T Gain1_Gain_j;
96+
real_T Gain1_Gain_p;
97+
real_T Saturation_UpperSat_c;
98+
real_T Saturation_LowerSat_i;
10199
real_T Gain6_Gain;
102-
real_T Gain_Gain_i;
100+
real_T Gain_Gain_g;
101+
real_T Gain1_Gain_k;
102+
real_T Gain_Gain_b;
103103
real_T Saturation1_UpperSat;
104104
real_T Saturation1_LowerSat;
105-
real_T Saturation_UpperSat_n;
106-
real_T Saturation_LowerSat_b;
105+
real_T Saturation_UpperSat_j;
106+
real_T Saturation_LowerSat_n;
107107
real_T Saturation2_UpperSat;
108108
real_T Saturation2_LowerSat;
109-
real_T Constant_Value_k;
109+
real_T Constant_Value_b2;
110110
real_T Gain1_Gain_n;
111111
real_T Gain1_Gain_b;
112112
real_T Gain1_Gain_c;

0 commit comments

Comments
 (0)