16- les fonctions TIMER et MOD


 La fonction TIMER déclenche des évènements en fonction d'un chronomètre paramétrable. La variable prend la forme:

 VAR 0001 = TIMER 0,-1,10

 Le premier paramètre, ici 0, est la valeur que doit prendre la variable lorsque les cycles de comptage ou décomptage seront terminés. Si on veut un compteur en continu, on peut indiquer ici 9999, c'est une valeur limite suffisamment grande pour qu'on puisse considérer que le compteur est permanent.

 Le deuxième paramètre indique l'incrémentation, c'est à dire de combien la variable doit augmenter ou diminuer sa valeur à chaque cycle. Ici la valeur de la variable diminuera de 1 à chaque fois.

 Le troisième paramètre indique en centièmes de secondes le laps de temps qui s'écoule entre chaque cycle.

 

On trouve des exemples de Timer sur l' excellent site de Nico Kaan, ses scripts fonctionnent très bien, mais indéfiniment.

 

Ce n'est pas grave en soi, la consommation de SIOC étant insignifiante. Par contre cela peut perturber la lecture de IOCP Console, et obliger à déselectionner toutes les variables (bouton Deselect All), et re-sélectionner uniquement celles qui nous intéressent (petit rectangle entre le numéro et le nom de la variable).

 

Deux cas peuvent se présenter:

 

 On utilise le TIMER pour des fonctions très limitées, et on ne souhaite pas avoir un compteur TIMER fonctionnant en permanence. Il faut donc déclencher puis arrêter le TIMER à la demande, autrement dit, il faut mettre un interrupteur.

 

 Le premier paramètre de la fonction TIMER est, nous l'avons dit, la valeur de fin, la limite. Si la limite est 0, un TIMER à valeur décroissante n’ira pas plus loin que 0.

 

 Si la limite est 9999, solution présentée à tort comme un TIMER fonctionnant indéfiniment, un TIMER à incrémentation positive s’arrêtera lorsqu’il dépassera 9999. Si notre TIMER a un cycle par seconde, sa « durée de vie » sera de 9999 secondes, il s’arrêtera donc au bout de 2,7 heures. Donc si vous voulez faire des vols de longue durée, il faudra prévoir une remise à zéro du TIMER (SI TIMER=9999 > TIMER=0), sinon vous aurez peut être des surprises à la fin du vol, le clignotant ne fonctionnant plus.

 

 Je propose la solution suivante: l'interrupteur donnera à la variable munie d'un TIMER, la valeur limite prévue. Par exemple, si nous avons un TIMER qui décompte de -1 à chaque cycle , à partir d'une valeur de départ égale à 10, le script sera du genre:

 

Var 0001, name SWITCH, Link IOCARD_SW, Input 27, Type I

 

{

 

IF &SWITCH = 1

 

&CLIGNOT = 10// la valeur de départ de la variable du clignotant est égale à 10

 

&CLIGNOT = TIMER 0 ,-1 ,100// le TIMER décompte de 10 à 0 chaque seconde

 

}

 

}

 

ELSE // si le Switch est égal à 0

 

{

 

&CLIGNOT = 0 // mise à 0 de la variable

 

}

 

}

 

Var 0002, name CLIGNOT

 

Le ELSE permet d’assigner une condition importante: si l’interrupteur est OFF, le clignotant prend la valeur 0. Comme il a une incrémentation de -1, il prend immédiatement la valeur -1. Et comme la valeur -1 est inférieure à la valeur de fin, fixée à 0, le clignotant s’arrête.

 

Le fonctionnement de ce temporisateur peut être vérifié avec IOCP Console.

 

 Si nous voulons faire un TIMER « infini » en mettant 9999, comme valeur limite, s’il dépasse cette valeur, il s’arrête.

 

Prenons le cas d'un TIMER qui commence à compter à partir de 1, avec une incrémentation de +1 à chaque cycle , et ce, toutes les secondes:

 

Var 0001, name SWITCH, Link IOCARD_SW, Input 27

{

IF &SWITCH = 1

&CLIGNOT = 1 // valeur de démarrage

&CLIGNOT = TIMER 9999 ,1 ,100

}

}

ELSE // SI LE SWITCH EST = 0

{

&CLIGNOT = 9999

}

}


dans ce cas, lorsqu’on met l’interrupteur sur OFF, le TIMER prend la valeur 9999, comme son incrémentation est ici de +1, il passe au cycle suivant à la valeur 10000, et comme cette valeur est supérieure à sa valeur limite, il s’arrête.

 

Reste maintenant à lier ces types de clignotants à une LED, qui devra… clignoter.

 

C’est la valeur de la variable CLIGNOT qui va déterminer si la LED est allumée ou éteinte. Heureusement pour nous, il existe dans la liste des fonctions la fonction MOD, pour "Module", qui donne un résultat 1 ou 0 selon que la valeur de CLIGNOT est un nombre pair ou un nombre impair. Avec une incrémentation de 1, on aura donc une LED qui s’allumera un cycle sur deux.

 

Ajoutons donc une LED:

 Var 0002, name LED, Link IOCARD_OUT, Output 25

 Notre Script de TIMER devient alors :

 

Var 0001, name SWITCH, Link IOCARD_SW, Input 27

{

IF &SWITCH = 1

{

IF &LED = 0 // par sécurité, pas indispensable

{

&CLIGNOT = 1// valeur de démarrage

&CLIGNOT = TIMER 9999 ,1 ,100

}

}

ELSE // SI LE SWITCH EST 0

{

&CLIGNOT = 9999

}

}

 

et ajoutons la fonction MOD à la variable CLIGNOT:

 

Var 0003, name CLIGNOT

{

L0 = MOD &CLIGNOT ,2

IF L0 = 0

{

&LED = 0 // LED éteinte

}

ELSE

{

&LED = 1 // LED allumée

}

}

 

Remarque : on pourrait écrire directement

ELSE // SI LE SWITCH EST 0

{

&CLIGNOT = 10000

 

au lieu de 9999, mais dans ce cas le TIMER prendrait la valeur d’arrêt 10000+1=10001 soit un nombre impair, et la LED resterait allumée, alors qu’avec 9999 le TIMER s’arrête sur un nombre pair : 10000, et la LED reste éteinte.

 

Inutile de préciser que l’interrupteur, ici dénommé SWITCH peut être n’importe quelle commande dans une variable, une subroutine, etc… qui lancera le clignotant, ou l’éteindra.

 ________________________________________________________________________________________________________________

 

Deuxième cas: on utilise le TIMER pour des fonctions multiples, à usage fréquent, comme le clignotement de l'alarme MASTER WARNING ou MASTER CAUTION.

 

Ici, il devient intéressant d'avoir un compteur fonctionnant en permanence, lancé dès le démarrage de SIOC, et d'y faire appel, y compris à partir de plusieurs sources, lorsque c'est nécessaire.

 

La meilleure solution a été développée par Pierre Brandeis, et exposée sur le site SimuBaron . La solution de Pierre est excellente car non seulement elle permet d'utiliser une seule "centrale clignotante" pour plusieurs alarmes, mais en plus elle isole en quelque sorte le clignotant de ses commandes, ce qui évite des variations désagréables du rythme de clignotement quand les commandes sont à conditions multiples. Reportez-vous au site SimuBaron pour les explications détaillées

 

 CHAPITRE SUIVANT: 17- les fonctions TESTBIT, SETBIT, CLEARBIT, CHANGEBIT