Comment effectuer un calcul numérique dans un scénario?

Bonjour,

J’ai un scénario qui s’exécute toutes 5 min pour effectuer des calculs de façon itérative.

Il commence par récupérer la valeur d’une variable dans un tag, puis effectue les calculs avec ce tag et enregistre à la fin le nouveau résultat du tag dans la variable.

Cela fonctionne bien sauf qu’à un moment donnée le nombre peut avoir un exposant dans l’écriture du nombre. Ici, c’est un E-12 qui traîne.

Ensuite, lorsque le tag récupère la valeur ce cette variable, il le considère comme une chaîne de caractère et n’effectue plus de calcul. Les calculs itératifs se transforment en concaténation de chaîne de caractères et la variable devient une chaîne de caractères qui ne fait que s’allonger jusqu’à la mort comme ceci

[2020-10-01 09:10:58][SCENARIO] Affectation de la variable PID1_Erreur_Integration => (40*0.0625+6*(1*40*-2.4375+6*(1*40*-2.5+6*(1*40*-2.5+6*(1*40*-2.5+6*(1*40*-2.5+6*(1*40*-2.5+6*(1*1.9895196601283E-12-40*-2.5-0*0.1541679988056)/1*(1.9895196601283E-12-40*-2.5-0*0.1541679988056)/6*1*(1.9895196601283E-12-40*-2.5-0*0.1541679988056)/6/6+-2.5*(j'ai raccourci la ligne de la mort)
[2020-10-01 09:10:58][SCENARIO] [MySQL] Error code : 22001 (1406). Data too long for column 'value' at row 1  : UPDATE `dataStore` SET `id` = :id, `type` = :type, `link_id` = :link_id, `key` = :key, `value` = :value WHERE id = :id

En attendant, je vais limiter le nombre de décimales avec un floor(#Erreur_Integration#*100000)/100000 lors de l’affectation de la variable en fin de scénario. Mais la même expression floor(#Erreur_Integration#*100000)/100000 n’est pas calculée s’il s’agit de la mise à jour d’un tag au milieu de mon scénario.

Existe-il un moyen pour forcer le calcul d’une expression lors de la mise à jour d’un tag ?

Même en limitant le nombre de décimales, il arrive encore que ma variable prenne la valeur 1.2E-5 et là c’est foutu, le tag est mis à jour en tant que chaîne de caractère et le calcul n’est pas effectué.

[2020-11-11 16:50:03][SCENARIO] Mise à jour du tag #Erreur_Integration# => 12.5*1*1.2E-5/12.5+0.083333333333333*(-0.25+-0.3125)/2-(4/4)*0.083333333333333*((0+-12.5+12.5*12.5*1*1.2E-5/12.5+0.083333333333333*(-0.25+-0.3125)/2+0-0+-12.5+12.5*12.5*1*1.2E-5/12.5+0.083333333333333*(-0.25+-0.3125)/2+0)/50+0)/2

Donc je repose ma question

J’ai mis à disposition tout le code du scénario ici

Merci de me dire si j’applique la bonne méthode pour faire des calculs dans un scénario.

Là, il va falloir qu’on m’explique

Bonjour @Domatizer

Peut-être faut-il faire les calculs uniquement dans un bloc code en php

C’est ce que m’a proposé @Bison sur l’autre sujet, j’ai répondu ici Scénarios mal fait ? la variable devient ((((((((((((( après quelques heures - #7 par Domatizer

C’est bien lourd pour effectuer de simples calculs.
Pour moi, ça ne va déjà pas dans le testeur d’expression. Il y a un souci à la base !

Je vous ai proposé de faire TOUT le calcul dans un bloc code.

Il est clair qu’il y a un problème dans les calculs des scénarios dès qu’il y a un exposant qu’il faut contourner.
Le testeur d’expression utilise le code des scénarios pour les calculs.

Bonjour,

Moi j’utilise les fonctions floatval pour les décimaux ou intval pour les entiers. Je sais pas si ça peut répondre à ton besoin

image

Doc PHP :
PHP: floatval - Manual
PHP: intval - Manual

Bon après midi

1 « J'aime »

Merci @Heliospeed et @jpty

J’ai l’impression que ce sont en fait les guillemets qui permettent le calcul.
image
image

L’expression "tag(MonTag)" semble fonctionner. À suivre

Il faut transformer un nombre en texte en le mettant entre guillemets pour qu’il soit reconnu comme un nombre ! :thinking:

Je ne fais aucun calcul dans un scénario. La syntaxe est trop floue pour moi à cet endroit.
Si j’ai besoin d’un calcul, je le fais dans un bloc code du scénario. C’est plus compliqué, mais la syntaxe est celle de php.

1 « J'aime »

Oui, et elle risque de changer en fonction de l’évolution du core.
La solution du bloc code me semble plus pérenne.

1 « J'aime »

Juste histoire de creuser un peu …

Ouais, aucune logique ! 'tag(Montag)' fonctionne aussi.

En effet, j’ai eu des souci avec les guillemets dans certains cas. Je pense à des problèmes de doubles guillemets si l’expression entière est aussi entre guillemets. La formule devient tronquée comme ceci après un clic sur Sauvegarder :upside_down_face:

Donc, je mets des ' ' partout je manipule des nombres décimaux.

Merci

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.