Voici l'explication sur le fonctionnement des subrutines:
Ca à l'air compliqué quand on ne connait pas mais en fait c'est très simple.
Comme le SIOC est un programme orienté événement, c'est les évènements (modification de
la valeur d'une variable) qui active l'exécution du code écrit dessous.
Le problème c'est que si il n'y pas d'évènement le code est pas exécuté.
Si on utilise plusieurs conditions pour déclencher une action, il faudrait mettre une copie du code
sous chaque variable qui conditionne l'action sinon elle risque de pas être déclanchée.
Pour résoudre ce problème on centralise tout dans une subroutine.
Dans ton exemple on a 2 conditions (variable) qui vont agir sur la valeur de la gauge
- la quantité de fuel (variable tiré de FSUIPC)
- la position du switch (variable input)
Au lieu d'écrire un code en dessous de ces 2 variables on va simplement appeller une suroutine fonction "CALL"
et c'est dans la subrutine que l'on va calculer la valeur de la gauge par rapport au fuel et au switch
Pour simplifier voici les 3 variables utilisées:
Switch c'est le switch
Fuel c'est la valeur du fuel selon FSUIPC
Gauge c'est le servo de ta gauge
Sub_gauge c'est la subroutine
Var 0001, name Switch, Link IOCARD_SW, Input 94
Var 0002, name Fuel, Link FSUIPC_INOUT, Offset $0B74, Length 4
Var 0003, name Gauge, Link USB_SERVOS, Output 2, PosL 1, PosC 511, PosR 1023
Var 0010, name Sub_gauge, Link SUBRUTINE
J'envoie le switch et le Fuel sur la subroutine avec la fonction CALL
Var 0001, name Switch, Link IOCARD_SW, Input 94
{
CALL &Sub_gauge
}
Var 0002, name Fuel, Link FSUIPC_INOUT, Offset $0B74, Length 4
{
CALL &Sub_gauge
}
Dans la subrutine je code les conditions:
Si le switch = 1 la gauge affiche 0
Si le switch = 0 la gauge affiche le fuel
Var 0010, name Sub_gauge, Link SUBRUTINE
{
IF &Switch = 1
{
&Gauge = 0
}
ELSE
{
&Gauge = &Fuel
}
}
Voila c'est fini (évidemment j'ai pas codé les calculs de coefficient pour transformer les valeurs
de fuel en valeur de gauge pour le servo)
Avec cette façon de procéder, ta gauge affichera toujours la bonne valeur
BOB
Le code:
Var 0001, name Switch, Link IOCARD_SW, Input 94
{
CALL &Sub_gauge
}
Var 0002, name Fuel, Link FSUIPC_INOUT, Offset $0B74, Length 4
{
CALL &Sub_gauge
}
Var 0010, name Sub_gauge, Link SUBRUTINE
{
IF &Switch = 1
{
&Gauge = 0
}
ELSE
{
&Gauge = &Fuel
}
}