Aller au contenu principal

Exemple 10 - Compteur d'heures de fonctionnement, timeout de signal

Exemple 10a - Compteur d'heures de fonctionnement​

Tâche​

À partir d'un signal de commande numérique COMPRESSOR, la durée de fonctionnement du groupe correspondant doit être déterminée et affichée en heures.

Solution​

CompressorOnTime_h = integrate(bool(COMPRESSOR), {storage: 'tot_compressor'}) / 3600; // output in hours

Fonctions utilisées​

Explication​

L'intégrale d'une constante CC sur la période de 0 à l'instant t donne, avec C=1C = 1, le temps sur lequel on intègre :

Ton=∫0tC⋅dτ=C⋅tT_{on} = \int_{0}^{t} C \cdot d\tau = C \cdot t

Si l'on intègre un signal de commutation numérique changeant, aux valeurs 0 et 1, on obtient le temps cumulé pendant lequel le signal était à 1.

L'indication du storage est obligatoire pour repartir, après un redémarrage du logiciel, de la dernière valeur calculée.

Exemple 10b - Timeout de signal​

Tâche​

Pour un signal de mesure MEASURE, il faut vérifier si le signal est encore actif. Pour cela, on suppose que le signal de mesure d'une grandeur physique présente toujours, du fait du bruit, au moins de très faibles fluctuations.

La défaillance du capteur peut aussi être due à une interruption de la communication de données (CAN, MVB). Dans ce cas, plus aucune nouvelle donnée n'arrive sur le canal smartCORE.

L'état de timeout doit être activé lorsque le signal de mesure ne montre aucune activité pendant 10 secondes.

Solution 1​

#timeless MEASURE
MEASURE_TimeOut = integrate(1, onchange(MEASURE), {upper: 100}) > 10;

Fonctions utilisées​

Explication​

Ici aussi, une intégrale est utilisée pour la mesure du temps. Contrairement à l'exemple 8b, toutefois, l'entrée de réinitialisation de la fonction d'intégration est utilisée pour faire repartir sans cesse l'intégration à 0.

Comme événement pour cela, on utilise la fonction onchange(), qui fournit une impulsion de durée minimale chaque fois que le signal de mesure MEASURE change.

Une mémoire persistante n'est pas nécessaire sur l'intégrale, mais la valeur de l'intégrale est limitée vers le haut (upper) à 100. Ainsi, la comparaison pour le timeout après 10 secondes peut être calculée commodément.

La macro #timeless est nécessaire, car la communication de données elle-même doit déjà être considérée comme non fiable. Comme le module mathématique évalue toujours les données de manière cohérente dans le temps, le calcul de la fonction d'intégration serait suspendu (donc sans alarme non plus !) jusqu'à l'arrivée d'une nouvelle valeur mesurée, ou jusqu'à ce que de nouveaux enregistrements soient générés automatiquement après inputTimeoutS.

attention

Le mode timeless exclut ce canal, de manière générale, du calcul cohérent dans le temps. Si le canal est néanmoins nécessaire pour des calculs, les surveillances d'activité peuvent être déplacées dans une instance distincte du module mathématique.

astuce

La macro #timeless accepte plusieurs noms de signaux, à séparer par ,. Des guillemets doivent être utilisés lorsque le nom du signal contient des caractères spéciaux. L'utilisation de la syntaxe $'...' n'est pas autorisée ici, car on n'accède pas à la valeur du canal.

Solution 2​

#timeless MEASURE
MEASURE_TimeOut = !pulse(onchange(MEASURE), {duration: 10, restart: true});

Fonctions utilisées​

Explication​

Ici, la fonction pulse() est utilisée pour générer, à partir d'un événement, une impulsion de la durée prédéfinie duration. Si un nouvel événement survient avant l'expiration de la durée, le réglage restart: true prolonge l'impulsion, de sorte que la durée est de nouveau attendue à partir du nouvel événement.

Comme événement pour cela, on utilise de nouveau la fonction onchange(), qui fournit une impulsion de durée minimale chaque fois que le signal de mesure MEASURE change.

Comme le résultat de la fonction pulse() doit ici plutôt être compris comme un moniteur d'activité, le timeout s'obtient par l'inversion avec l'opérateur !.

La macro #timeless a la même fonction que dans la solution 1.