Programme des gauges moteur, fuel et icing du Baron58

Bonjour à tous,
Je met ma programmation fonctionnelle de toutes mes gauges :
Il y a sûrement des améliorations et simplifications à faire !
Je met ma programmation fonctionnelle de toutes mes gauges :
- Code: Tout sélectionner
// =======================
// ££ Routines servos
// =======================
//
// name : routine_servos_4
// 10 Décembre 2011
//
// Engine left = 1 - Engine right = 2
//
// Carte servo n° 0 USB 74 : (quelques Pb avec les n° USB qui changent de temps en temps !!!)
// Ouput : Engine_left Gauge name Engine_Right n° cables Limites Graduations y = ax + b
// 4 MAN PRESS 1 4 - 1 180-960 10-40 a=26 b=-80
// 5 RPM 2 5 - 2 190-940 0-35 a=21.429 b=190
// 6 Fuel Flow 3 6 - 3 160-840 3-30 a=25.185 b=84.445
//
// Carte servo n° 1 USB 76 :
// Ouput : Engine_left Gauge name Engine_Right n° cables Limites
// 4 TEMP EGT 1 10 - 7 850-150 0-860 a=-0.814 b=850
// 5 TEMP CHT 2 11 - 8 180-950 50-250 a=3.85 b=-12.5
// 6 OIL PRESS 3 12 - 9 900-150 0-100 a=-7.5 b=900
//
// Carte servo n° 2 USB 12 :
// Ouput : Engine_left Gauge name Engine_Right n° cables Limites
// 2 OIL TEMP 1 14 - 13 140-800 0-120 a=5.5 b=140
//
// 3 - Fuel level L (FL) 15 170-850 0-100 a=6.8 b=170
// 4 - Fuel level R (FR) 16 170-850 0-100 a=6.8 b=170
// 5 - PROP AMPS (PA) 17 150-840 0-30
// 6 - Surface Icing Pressure (IP) 18 250-800 0-20
//
//
// ££ Init au lancement SIOC
// On met les servos en position "arrêt moteur"
//
Var 4000, name init_servos, link subrutine // initialisation servos
{
&serv_man_pres1 = 650
&serv_man_pres2 = 650
&serv_RPM1 = 180
&serv_RPM2 = 180
&serv_FF1 = 140
&serv_FF2 = 140
&serv_temp_EGT1 = 850
&serv_temp_EGT2 = 850
&serv_temp_CHT1 = 180
&serv_temp_CHT2 = 180
&serv_oil_pres1 = 900
&serv_oil_pres2 = 900
&serv_oil_temp1 = 200
&serv_oil_temp2 = 200
&serv_fuel_L = 170
&serv_fuel_R = 170
&serv_prop_amp = 150
&serv_pres_sur = 250
}
// On désactive les servos (plus de vibrations), en attendant le démarrage.
Var 4002, name init_servos_0, link subrutine // initialisation servos
{
&serv_man_pres1 = 0
&serv_man_pres2 = 0
&serv_RPM1 = 0
&serv_RPM2 = 0
&serv_FF1 = 0
&serv_FF2 = 0
&serv_temp_EGT1 = 0
&serv_temp_EGT2 = 0
&serv_temp_CHT1 = 0
&serv_temp_CHT2 = 0
&serv_oil_pres1 = 0
&serv_oil_pres2 = 0
&serv_oil_temp1 = 0
&serv_oil_temp2 = 0
&serv_prop_amp = 0
&serv_pres_sur = 0
}
Var 4011, name serv_man_pres1, link usb_servos, device 0, output 4, posl 1, posc 512, posr 1023
Var 4012, name serv_man_pres2, link usb_servos, device 0, output 1, posl 1, posc 512, posr 1023
Var 4013, name serv_RPM1, link usb_servos, device 0, output 5, posl 1, posc 512, posr 1023
Var 4014, name serv_RPM2, link usb_servos, device 0, output 2, posl 1, posc 512, posr 1023
Var 4015, name serv_FF1, link usb_servos, device 0, output 6, posl 1, posc 512, posr 1023
Var 4016, name serv_FF2, link usb_servos, device 0, output 3, posl 1, posc 512, posr 1023
Var 4017, name serv_temp_EGT1, link usb_servos, device 1, output 4, posl 1, posc 512, posr 1023
Var 4018, name serv_temp_EGT2, link usb_servos, device 1, output 1, posl 1, posc 512, posr 1023
Var 4019, name serv_temp_CHT1, link usb_servos, device 1, output 5, posl 1, posc 512, posr 1023
Var 4020, name serv_temp_CHT2, link usb_servos, device 1, output 2, posl 1, posc 512, posr 1023
Var 4021, name serv_oil_pres1, link usb_servos, device 1, output 6, posl 1, posc 512, posr 1023
Var 4022, name serv_oil_pres2, link usb_servos, device 1, output 3, posl 1, posc 512, posr 1023
Var 4023, name serv_oil_temp1, link usb_servos, device 2, output 2, posl 1, posc 512, posr 1023
Var 4024, name serv_oil_temp2, link usb_servos, device 2, output 1, posl 1, posc 512, posr 1023
Var 4025, name serv_fuel_L, link usb_servos, device 2, output 3, posl 1, posc 512, posr 1023
Var 4026, name serv_fuel_R, link usb_servos, device 2, output 4, posl 1, posc 512, posr 1023
Var 4027, name serv_prop_amp, link usb_servos, device 2, output 5, posl 1, posc 512, posr 1023
Var 4028, name serv_pres_sur, link usb_servos, device 2, output 6, posl 1, posc 512, posr 1023
//
// ££ Manifold pressure 1 (left) & 2 (right)
//
// Offset $37E8 et $3728 Length 8 en lbs/sqft (à diviser par 70,7262 pour convertir en Hg)
// Cadran : graduations de 10 à 40 mais valeur peut descendre à 5,4 HG
// servo : de 180 à 960 --> a = 26 b = -80
//
Var 4100, name fs_man_pres1, Link FSUIPC_IN, Offset $37E8, Length 8, Numbers 3
{
&val_man_pres1 = &fs_man_pres1 / 70.7262 // maniflow pressure en HG
L0 = &val_man_pres1 / 1000 // Conversion en valeur réelle
L1 = L0 * 26 // y = ax : pente réponse servo
L2 = L1 - 80 // y = ax + b : décallage
L2 = LIMIT 120 1000 0 // Limite amplitude servo de 120 à 1000
&serv_man_pres1 = L2 // Valeur envoyée au servo
}
Var 4102, name val_man_pres1
//
// Manifold pressure 2
//
Var 4110, name fs_man_pres2, Link FSUIPC_IN, Offset $3728, Length 8, Numbers 3
// Var 4110, name fs_man_pres2, Link IOCP, Offset 0428
{
&val_man_pres2 = &fs_man_pres2 / 70.7262 // maniflow pressure en HG
L0 = &val_man_pres2 / 1000 // Conversion en valeur réelle : FSUIPC
L1 = L0 * 26 // y = ax : pente réponse servo
L2 = L1 - 80 // y = ax + b : décallage
L2 = LIMIT 120 1000 0 // Limite amplitude servo de 120 à 1000
&serv_man_pres2 = L2 // Valeur envoyée au servo
}
Var 4112, name val_man_pres2
//
// ££ RPM 1 & 2
//
// Offset $2400 et $2500 length 8 : à diviser par 100 pour avoir la valeur RPM
// Cadran graduation de 0 à 35 (0 à 3500 tr/mn)
// Servo de 190 à 940 --> a = 21,429 b = 190
// RPM_mot_1 et RPM_mot_2 : Var 0030 et 0033 -> Pour calcul courant et affichage led alternateurs
//
Var 4120, name fs_rpm1, link FSUIPC_IN, Offset $2400, Length 8, Numbers 3 // RPM 1
{
&RPM_mot_1 = &fs_rpm1 / 1000 // Valeur réelle de l'offset (RPM x 100)
L0 = &RPM_mot_1 / 100 // Valeur RPM 0 à 35 RPM_mot_1 : Var &
L1 = L0 * 21.429
L2 = L1 + 190
L2 = LIMIT 120 1000 0 // Limite amplitude servo de 120 à 1000
&serv_RPM1 = L2
}
//
// RPM 2
//
Var 4125, name fs_rpm2, link FSUIPC_IN, Offset $2500, Length 8, Numbers 3 // RPM 2
{
&RPM_mot_2 = &fs_rpm2 / 1000 // Valeur réelle de l'offset (RPM x 100)
L0 = &RPM_mot_2 / 100 // Valeur RPM 0 à 35
L1 = L0 * 21.429
L2 = L1 + 190
L2 = LIMIT 120 1000 0 // Limite amplitude servo de 120 à 1000
&serv_RPM2 = L2 // Envoie valeur au servo
}
//
// ££ Fuel flow 1 & 2
//
// Offset $0918 et $09B0 donne fuel flow en Pound/Heure (donc un poids/H)
// 1 pound = 0,454 kg 1 kg = 1,39 litres de 100LL (D=0,72) & 1 gallon = 3,78 litres :
// Coefficeint de conversion Pounds -> gallond : 0,454 * 1,39 / 3,78 = 0,166947
// Graduations de 3 à 30 (gallon / H)
// Servo : de 160 à 840 --> a = 25,185 b = 84,445
//
Var 4130, name fs_fuel_flow1, link FSUIPC_IN, Offset $0918, Length 8, Numbers 3
// Var 4130, name fs_fuel_flow1, link IOCP, Offset 0135 // ne marche pas mieux !
{
&val_FF1 = &fs_fuel_flow1 / 1000 // Offset FSUIPC
// &val_FF1 = &fs_fuel_flow1 / 10 // Offset IOCP
L0 = &val_FF1 * 0.1669 // Conversion Pound en Gallon / Heure
L1 = L0 * 25.189 // "a" pente servo (y = ax)
L2 = L1 + 84.445 // "b" (y = ax + b)
L2 = LIMIT 150 950 0 // Limite amplitude servo de 150 à 950
&serv_FF1 = L2 // Envoie valeur au servo
}
Var 4131, name val_FF1
//
// Fuel flow 2
//
Var 4132, name fs_fuel_flow2, link FSUIPC_IN, Offset $09B0, Length 8, Numbers 3
{
&val_FF2 = &fs_fuel_flow2 / 1000
L0 = &val_FF2 * 0.1669
L1 = L0 * 25.189
L2 = L1 + 84.445
L2 = LIMIT 150 950 0 // Limite amplitude servo de 150 à 950
&serv_FF2 = L2
}
Var 4133, name val_FF2
//
// ££ EGT 1 & 2
//
// Offset 3b70 et 3ab0 Length 8 en ° Rankine
// Conversion : °C = (°Ra - 459,67 - 32) / 1,8 --> D'ou °C = (°Ra - 491,67) / 1,8
// 15 Graduations : L'échelle donne 20° (?) par graduation : De 0 à 860°
// Servo de 850 à 150 --> a = -0,814 b = 850
//
Var 4140, name fs_egt1, link FSUIPC_IN, Offset $3b70, Length 8, Numbers 3
{
&val_egt1 = &fs_egt1 / 1000 // Valeur réelle
L0 = &val_egt1 - 491.67 // en °C (avec ligne suivante)
L1 = L0 / 1.8 // divisé par 1,8
L0 = L1 * 0.814 // "a" Pente déviation servo
L2 = 850 - L0 // b=900 et -L1 car pernte négative
L2 = LIMIT 100 950 0 // Limite amplitude servo de 100 à 950
&serv_temp_EGT1 = L2 // Envoie valeur au servo
}
Var 4141, name val_egt1
//
// EGT 2 ===> A voir avec egt1 (autre offset ?)
//
Var 4142, name fs_egt2, link FSUIPC_IN, Offset $3ab0, Length 8, Numbers 3
{
&val_egt2 = &fs_egt2 / 1000 // Valeur réelle
L0 = &val_egt2 - 491.67 // en °C (avec ligne suivante)
L1 = L0 / 1.8 // divisé par 1,8
L0 = L1 * 0.814 // "a" Pente déviation servo
L2 = 850 - L0 // b=900 et -L1 car pernte négative
L2 = LIMIT 100 950 0 // Limite amplitude servo de 100 à 950
&serv_temp_EGT2 = L2 // Envoie valeur au servo
}
Var 4143, name val_egt2
//
// ££ CHT 1 & 2
//
// Offset $08E8 et $0980 en ° F
// Conversion : °C = (( °F - 32 ) / 1,8
// Graduations de 50° à 250°
// Servo : de 180 à 950 --> a = 3,85 b = -12,5
//
Var 4150, name fs_cht1, link FSUIPC_IN, Offset $08E8, Length 8, Numbers 3
{
&val_cht1 = &fs_cht1 / 1000 // Valeur réelle
L0 = &val_cht1 - 32 // Conversion de
L1 = l0 / 1.8 // °F en °C
L0 = L1 * 3.85 // "a" Pente déviation servo (y = ax)
L2 = L0 - 12.5 // "b" ((y = ax + b)
L2 = LIMIT 180 1000 0 // Limite amplitude servo de 180 à 1000
&serv_temp_CHT1 = L2 // Envoie valeur au servo
}
Var 4151, name val_cht1
// CHT 2
Var 4153, name fs_cht2, link FSUIPC_IN, Offset $0980, Length 8, Numbers 3
{
&val_cht2 = &fs_cht2 / 1000 // Valeur réelle
L0 = &val_cht2 - 32 // Conversion de
L1 = l0 / 1.8 // °F en °C
L0 = L1 * 3.85 // "a" Pente déviation servo (y = ax)
L2 = L0 - 12.5 // "b" ((y = ax + b)
L2 = LIMIT 180 1000 0 // Limite amplitude servo de 180 à 1000
&serv_temp_CHT2 = L2 // Envoie valeur au servo
}
Var 4154, name val_cht2
//
// ££ oil pressure 1 & 2
//
// Offset $3B60 et $3AA0
// En lbs/sqft --> Diviser par 144 pour avoir en PSI.
// Graduations de 0 à 100 PSI
// Servo : de 900 à 150 --> a = -7,5 b = 900
//
Var 4160, name fs_oil_pres1, link FSUIPC_IN, Offset $3B60, Length 8, Numbers 3
{
&val_oil_pres1 = &fs_oil_pres1 / 1000 // Valeur réelle en lbs/sqft
L0 = &val_oil_pres1 / 144 // oil pressure en PSI
L1 = L0 * 7.5 // "a" (y = ax)
L2 = 900 - L1 // "b" (y = ax + b)
L2 = LIMIT 120 950 0 // Limite amplitude servo de 120 à 950
&serv_oil_pres1 = L2 // envoie valeur au servo
}
Var 4162, name val_oil_pres1
// oil pres 2
Var 4165, name fs_oil_pres2, link FSUIPC_IN, Offset $3AA0, Length 8, Numbers 3
{
&val_oil_pres2 = &fs_oil_pres2 / 1000 // Valeur réelle en lbs/sqft
L0 = &val_oil_pres2 / 144 // oil pressure en PSI
L1 = L0 * 7.5 // "a" (y = ax)
L2 = 900 - L1 // "b" (y = ax + b)
L2 = LIMIT 120 950 0 // Limite amplitude servo de 120 à 950
&serv_oil_pres2 = L2 // envoie valeur au servo
}
Var 4167, name val_oil_pres2
//
// ££ oil temp 1 & 2
//
// Offset $3B58 et $3A98 en °Ra
// Conversion : °C = (°Ra - 459,67 - 32) / 1,8 --> D'ou °C = (°Ra - 491,67) / 1,8
// Graduations de 0 à 120°C
// servo : 140 à 800 --> a = 5,5 b = 140
//
Var 4170, name fs_oil_temp1, link FSUIPC_IN, Offset $3B58, Length 8, Numbers 3
{
&val_oil_tmp1 = &fs_oil_temp1 / 1000 // Valeur réelle oil_temp en °Ra
L0 = &val_oil_tmp1 - 491.67 // Conversion de °Ra
L1 = L0 / 1.8 // en °C
L0 = L1 * 5.5 // "a" (y = ax)
L2 = L0 + 140 // "b" (y = ax + b)
L2 = LIMIT 120 900 0 // Limite amplitude servo de 120 à 900
&serv_oil_temp1 = L2 // Envoie valeur au servo
}
Var 4171, name val_oil_tmp1
// oil temp 2
Var 4172, name fs_oil_temp2, link FSUIPC_IN, Offset $3A98, Length 8, Numbers 3
{
&val_oil_tmp2 = &fs_oil_temp2 / 1000 // Valeur réelle oil_temp en °Ra
L0 = &val_oil_tmp2 - 491.67 // Conversion de °Ra
L1 = L0 / 1.8 // en °C
L0 = L1 * 5.5 // "a" (y = ax)
L2 = L0 + 140 // "b" (y = ax + b)
L2 = LIMIT 120 900 0 // Limite amplitude servo de 120 à 900
&serv_oil_temp2 = L2 // Envoie valeur au servo
}
Var 4173, name val_oil_tmp2
//
// ££ Fuel gauge left et Right
//
// Offset $0B7C et $0B94 Length 4 en % * 128 * 65536
// Graduation 0 à 100 %
// servo de 170 à 850 --> a = 6,8 b = 170
//
// Fuel gauge left : De base (sans correction bug "stop ou start" sw_bat).
Var 4180, name fs_fuel_left, link FSUIPC_INOUT, Offset $0b94, Length 4
// Var 4180, name fs_fuel_left, link IOCP, Offset 0289 // IOCP ???
{
CALL &sub_fuel_left
}
Var 4181, name sub_fuel_left, link subrutine // Suppresion bug ON OFF sw_bat
{
&val_fuel_right = &fs_fuel_left / 83886.08 // de 0 à 100% : 128 * 65536 / 100
L0 = &val_fuel_right * 6.8 // "a" (y = ax)
L1 = L0 + 170 // "b" (y = ax + b) -> nouvelle valeur servo
L1 = LIMIT 150 900 0 // Limite amplitude servo de 150 à 900
IF &courant = 0 // Si pas de courant
{
L1 = 170 // L1 = Valeur mini pour servo
}
&tmp_fuel_left = L1 - &old_fuel_left // Différence new - old valeur
L2 = 4 // Si &tmp_fuel_left >= 0 (évite un "IF")
// Sens de variation du servo (dans "TIMER")
IF &tmp_fuel_left < 0 // Si la nouvelle valeur servo < à l'ancienne
{
L2 = -4 // L2 négatif
}
IF &tmp_fuel_left <> 0 // Si le servo doit changer
{
&serv_Fuel_L = TIMER L1 L2 1 // Envoie valeur au servo par pas de 2 avec timer 2/10° de s
&old_fuel_left = L1 // Stok nouvelle valeur servo pour prochaine modif
}
}
Var 4182, name val_fuel_left // Valeur fuel en %
Var 4183, name old_fuel_left // mémorise ancienne valeur fuel
Var 4184, name tmp_fuel_left // Différence entre ancienne et nouvelle valeur du servo
// Fuel gauge right
Var 4200, name fs_fuel_right, link FSUIPC_INOUT, Offset $0b94, Length 4
{
CALL &sub_fuel_right
}
Var 4201, name sub_fuel_right, link subrutine
{
&val_fuel_right = &fs_fuel_right / 83886.08 // de 0 à 100% : 128 * 65536 / 100
L0 = &val_fuel_right * 6.8 // "a" (y = ax)
L1 = L0 + 170 // "b" (y = ax + b) -> nouvelle valeur servo
L1 = LIMIT 150 900 0 // Limite amplitude servo de 150 à 900
IF &courant = 0 // Si pas de courant
{
L1 = 170 // L1 = Valeur mini pour servo
}
&tmp_fuel_right = L1 - &old_fuel_right // Différence new - old valeur
L2 = 4 // Si &tmp_fuel_left >= 0 (évite un "IF")
// Sens de variation du servo (dans "TIMER")
IF &tmp_fuel_right < 0 // Si la nouvelle valeur servo < à l'ancienne
{
L2 = -4 // L2 négatif : Le timer décompte
}
IF &tmp_fuel_right <> 0 // Si le servo doit changer
{
&serv_Fuel_R = TIMER L1 L2 1 // Envoie valeur au servo par pas de 2 avec timer 2/10° de s
&old_fuel_right = L1 // Stok nouvelle valeur servo pour prochaine modif
}
}
Var 4202, name val_fuel_right // Valeur fuel en %
Var 4203, name old_fuel_right // mémorise ancienne valeur fuel
Var 4204, name tmp_fuel_right // Différence entre ancienne et nouvelle valeur du servo
//
// ££ Jauge prop amps : 150 à 840
//
Var 4230, name sw_prop, Link IOCARD_SW, Input 192 // inter prop icing
{
CALL &sub_prop_amps
}
Var 4231, name sub_prop_amps, link subrutine
{
IF &main_bus_volt < 2750
{
&serv_prop_amp = 180
}
ELSE
{
IF &sw_prop = 1
{
&serv_prop_amp = 480
}
ELSE
{
&serv_prop_amp = 180
}
}
}
//
// ££ Jauge Icing pressure : 250 à 800
//
Var 4250, name sw_surface, Link IOCARD_SW, Input 205 // inter surface icing
{
CALL &serv_surface
}
Var 4252, name serv_surface, Link subrutine
{
IF &main_bus_volt < 2750
{
&serv_pres_sur = 250
}
ELSE
{
IF &sw_surface = 1
{
&serv_pres_sur = 770
}
ELSE
{
&serv_pres_sur = 475
}
}
}
//
// ****************** Fin routines servos ************************
// *****************************************************************
Il y a sûrement des améliorations et simplifications à faire !