Salut,
ex : W3 := W3 + W2;
message d'erreur :
(l: 14, c: 8) E1068 le type de données de l'opérande n'est pas adapté à l'opération
(l: 14, c: 8) E1092 les types de données ne correspondent pas ('W3:WORD'<->'W3 + W2:ANY_NUM')
Le compilateur te donne la solution : les variables que tu veux additionner ne sont pas du même type de données, ce qui peut révéler un problème de conception du programme : pour un programme de qualité, on ne mélange pas les choux et les carottes.
W3 est de type WORD, ce qui en soi est déjà un problème de qualité : s'il faut faire des opération arithmétiques avec W3, un type INT, UINT, DINT ou UDINT serait plus approprié (on peut additionner des entiers).
Le type WORD défini un paquet de 16 bits, ou une chaine de bits : c'est un type de donnée pratique pour regrouper des infos booléennes dans un paquet (W3 par exemple).
Ce n'est pas la valeur entière correspondante à W3 qui aura du sens, mais chaque bit de W3 aura une signification propre.
Et lorsque dans le bloc operate j'écris : %MW30 := %MW30 + %MW20, je n'ai plus de message d'erreur mais un avertissement :
{Variables et instances FB} : Avertissement : 'W3' chevauche la mémoire, en raison d'affectation sur l'adresse '%MW30' équivalente et de l'écriture d'adresses directes ou de bits extraits.
{A1_mvt_Hor
Le compilateur t'indique que le résultat de l'équation va modifier un des opérandes de l'équation. Ce n'est qu'un avertissement, on a le droit de faire ça si c'est vraiment ce que qu'on veut faire, mais c'est bien d'avoir un oeil sur ce genre de choses.
Si ce type de messages te casse les pieds, tu a le droit de modifier les options du compilateur pour les désactiver.
Tout dépend des impératifs que tu te mets (ou qu'on t'impose !) en terme de qualité logicielle ; généralement, lever les erreurs et les avertissements est une bonne idée, les désactiver peut t'amener à ne pas détecter des erreurs, aussi bien les flagrantes que les plus subtiles...
Le fait d'utiliser les variables localisées n'est pas la meilleure idée pour résoudre les problèmes de type de données incompatibles.
Il vaut mieux prendre un peu de temps pour reprendre le typage des variables, de façon que les équations puissent s'appliquer directement, sans passer par les fonctions de changement de type.
Si _vraiment_ W3 doit être de type WORD, alors il faudrait écrire
W3 := W3 + int_to_word( W2 );
Partager