Bloc DIV

Forum traitant des automates industriels de marque Siemens.
Répondre
Avatar de l’utilisateur
Fanch44
Code son premier grafcet
Code son premier grafcet
Messages : 33
Inscription : 30 juil. 2021, 12:36

Bloc DIV

Message par Fanch44 »

Bonjour,

Je travaille sur un projet avec deux automates en réseau (profinet). Je lis sur un des deux automates, via une passerelle, une valeur de puissance provenant d'un convertisseur. En visu dynamique je lis bien la valeur de puissance sur la variable. J'utilise ensuite un bloc DIV pour la mise à l'échelle de cette valeur afin de pouvoir l'afficher sur un IHM. Mais la variable associée au OUT du bloc DIV de type REAL indique 0.

Dans la version précédente de ce même programme, ça fonctionne. La différence entre ces deux versions c'est que la variable en entrée IN1 du bloc DIV était dans la première version une variable API, type %MD. Elle provient maintenant d'un FB, et elle est de type DWord.
Dans les deux cas, ancienne et nouvelle version, la variable en IN1 reçoit bien la valeur de puissance du convertisseur. Mais dans la nouvelle version la variable OUT du bloc DIV, qui elle n'a pas changée ne lie plus la valeur de sortie du bloc DIV.

Si quelqu'un a une idée de l'origine du pb, ça me dépannerait pas mal. Là je sèche :/
Merci!

Cdt,
Fanch
Dernière modification par Fanch44 le 17 sept. 2021, 12:13, modifié 1 fois.
DurandO
Expert de l'héxadécimal
Expert de l'héxadécimal
Messages : 396
Inscription : 21 mars 2021, 15:31

Re: Bloc DIV

Message par DurandO »

Bonjour,

cela manque un peu de précision :
- sous Step7 ou TIA-portal
- de quel bloc DIV parles-tu ? DIV_R, DIV_I,DIV_DI ?
Joins au minimum un extrait de ton code si tu souhaites de l'aide.

Tes blocs ont-ils été recompilés (vérification cohérence de bloc si Step7) avant chargement ?

Cordialement.
Durand.O
Avatar de l’utilisateur
Fanch44
Code son premier grafcet
Code son premier grafcet
Messages : 33
Inscription : 30 juil. 2021, 12:36

Re: Bloc DIV

Message par Fanch44 »

C'est vrai que je n'ai pas pensé à préciser:

- Les CPU sont des 1512SP-1
- Un programme sous Tia Portal V15
- C'est un bloc DIV, le seul bloc DIV proposé dans les instructions de base.

Oui tout a été recompilé plusieurs fois. Compilation logiciel et matériel
2021-09-17_11h58_13.png
2021-09-17_11h58_13.png (4 Kio) Consulté 1562 fois
Cordialement
Dernière modification par Fanch44 le 17 sept. 2021, 13:09, modifié 1 fois.
Avatar de l’utilisateur
ProfnovA
Créateur de langage
Créateur de langage
Messages : 525
Inscription : 21 oct. 2015, 08:21

Re: Bloc DIV

Message par ProfnovA »

Pas tout compris mais essaie de mettre ta valeur DW dans un réel intermédiaire dint_to_real
DurandO
Expert de l'héxadécimal
Expert de l'héxadécimal
Messages : 396
Inscription : 21 mars 2021, 15:31

Re: Bloc DIV

Message par DurandO »

Salut,
Ça donne quoi en visualisation ?
"DCDC".READ_LIG2.PLow est-elle bien de type Real, sinon la convertir.
Idem pour la variable de sortie.
Avatar de l’utilisateur
JC87
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1903
Inscription : 20 oct. 2015, 13:00
Localisation : Nouvelle Aquitaine

Re: Bloc DIV

Message par JC87 »

Fanch44 a écrit : 17 sept. 2021, 11:32
Dans la version précédente de ce même programme, ça fonctionne. La différence entre ces deux versions c'est que la variable en entrée IN1 du bloc DIV était dans la première version une variable API, type %MD. Elle provient maintenant d'un FB, et elle est de type DWord.
Bonjour,

Ben faut pas chercher, tu cherche a diviser une variable qui n'est pas au format REAL. Comme ça été dit il faut convertir la variable d'origine en REAL avant de la diviser.

JC
"On veut faire du zéro défaut mais on a zéro bonhomme et zéro budget, et bien à la fin on a zéro résultat..."
Avatar de l’utilisateur
Fanch44
Code son premier grafcet
Code son premier grafcet
Messages : 33
Inscription : 30 juil. 2021, 12:36

Re: Bloc DIV

Message par Fanch44 »

Ok super. Merci pour votre aide! Je vais tester ça lundi, je ne peux pas le faire avant.

Je pensais que l'on pouvait avoir en entrée un entier type DWord et en sortie un entier type Real puisque ça fonctionne comme ça sur la version précédente du programme: Entrée type %MD (variable API) et en sortie du bloc DIV, un entier de type Real.

En même temps, c'est logique, si on attend un résultat en carottes, il faut diviser des carottes et non des patates :)

Merci!
Cordialement,
Fanch
dehell
Codeur fou
Codeur fou
Messages : 236
Inscription : 19 janv. 2016, 09:24
Localisation : Alès

Re: Bloc DIV

Message par dehell »

Bonjour,
Fait aussi attention à une chose si "DCDC".READ_LIG2.PLow est une variable "temp" d'un FB, il y a des chances que cela ne fonctionne pas et cela expliquerai pourquoi avec un %MD cela fonctionne....
Cordialement.
DurandO
Expert de l'héxadécimal
Expert de l'héxadécimal
Messages : 396
Inscription : 21 mars 2021, 15:31

Re: Bloc DIV

Message par DurandO »

Bonjour,
dehell a écrit : 17 sept. 2021, 15:42"DCDC".READ_LIG2.PLow
Une variable temporaire d'un FB ne peut être adressée de cette manière et ne peut être lue écrite que dans ce même FB.
Il est bon de rappeler que cette zone de mémoire temporaire qui est utilisée dans un bloc, une fois le bloc exécuté, est libérée et susceptible d'être utilisée ailleurs. C'est pourquoi une variable temp doit toujours être écrite avant d'être lue.
cela expliquerai pourquoi avec un %MD cela fonctionne....
Un %MD occupe 4 octets et peut aussi bien contenir une valeur de type DINT, DWORD qu'un real.
Tout dépend de ce qui était chargé de ce %MD dans le programme d'origine.

Pour ma part, je m'interrogerais dans un premier temps sur la valeur de cette variable "DCDC".READ_LIG2.PLow. D'où l'idée de la visualiser, des fois que la vérité se trouve ailleurs...
Avatar de l’utilisateur
Fanch44
Code son premier grafcet
Code son premier grafcet
Messages : 33
Inscription : 30 juil. 2021, 12:36

Re: Bloc DIV

Message par Fanch44 »

Bonjour,

Petit message pour vous indiquer que le problème a été résolu (la semaine dernière).

J'ai fais plusieurs erreurs:
- un %MD n'est pas un type de variable API mais une adresse de variable API (ex: %MD1430) qui peut être de type DWord, UDWord, DInt, UDInt, Real, ... Donc une fois vérifié, la variable dans le programme initial qui fonctionnait était bien de type UDInt et non pas DWord. J'avais fait le raccourci %MD = DWord mais évidemment c'est complètement faux.

Autre chose, cette variable UDInt était divisée par un Real (1000.0) pour être écrite dans un Real. Dans la version initiale du programme cette variable UDInt) était une variable API et ça marchait.

Dans la nouvelle version du programme, cette même variable à diviser se retrouve dans un DB. Une fois le type de la variable corrigé et donc passé d'un type UDWord à un type UDInt, le résultat est bien écrit dans la variable de résultat du bloc DIV mais dans l'IHM l'affichage de cette valeur donne : ####
Pourtant j'envoie bien un Real. En visu dynamique la valeur de résultat du bloc DIV est bonne et la variable IHM est bien aussi un Real.

J'ai résolu le pb en convertissant la variable UDInt en Real avant de la division et là tout marchait!
Pourquoi ça fonctionne avec une variable API, je ne sais pas mais manifestement il vaut mieux être rigoureux.

Conclusion, il ne faut utiliser que des variables de même type dans les blocs DIV et certainement dans les autres blocs d'opérations mathématiques".

Merci pour votre aide!
Répondre