Page 1 sur 2
[M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 13 juin 2025, 11:35
par NAAION
]Bonjour les automaticiens,
je suis actuellement sur un projet ou je doit lire des compteurs électrique (Socomec CONTIS E43) en Modbus RTU sur un M221. N'ayant jamais programmé sur ce type de machine je galère un peu.
Voici mon problème :
j'ai créé un un POU dans laquelle j'ai créée mes Rung pour interrogé mes variables Modbus :
j'ai ensuite renseigné les propriétés %READ_VAR0 :
- 1 SL1 pour le port serie RS-485
- ID 1 pour l'adresse Modbus de mon 1er compteur
- time a 100 je le touche pas celui là
- 0- Read multiple Words - Modbus 0X03 car le registre est en holding register
- FisteObject en 50536 car c'est son registre Modbus
- Quantity 2 car le mot est en 32 bits (j'espère avoir bien compris a ce niveaux la)
- IndexData a 0 pour écrire mon mot en 32 bits sur les mots mémoires %MW0
Ensuite j'ai créé une table d'animation pour interrogé mes mots mémoires %WM
Mon problème est que que je doit récupérer le double mot en swap (inversé) et je ne sais pas comment faire.
Auriez vous l'astuce a me donner ?
Merci d'avance.
Re: [M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 13 juin 2025, 11:42
par MiGaNuTs
Bonjour.
Tu recopie MW0 dans MW11 et MW1 dans MW10 (par exemple), et hop, tu les a inversé. MD5 contient la valeur dans le bon ordre.
Re: [M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 13 juin 2025, 15:04
par NAAION
Bonjour,
merci pour ta réponse.
Donc si je comprend bien quand j'écrit un mot en 32 bits avec une Quantity 2 sur %WM0 cela écrit :
- 1 mot en 16 bits sur %MW0 (le poids fort)
- 1 mot en 16 bits sur %MW1 (le poids faible)
Et le fait de les écrire sur par exemple sur :
- %WM0 --> %MW11
- %WM1 --> %MW10
Et cela swap mot mot en 32 bits.
J'ai donc deux question (oui encore

)
Quelle est la relation entre %MD5 et %MW11 & %mW10.
Et aussi comment écrire du mot %MW0 sur %MW11 ?
Re: [M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 13 juin 2025, 17:21
par MiGaNuTs
NAAION a écrit : ↑13 juin 2025, 15:04
Quelle est la relation entre %MD5 et %MW11 & %mW10.
https://www.se.com/fr/fr/faqs/FA142152/
NAAION a écrit : ↑13 juin 2025, 15:04
Et aussi comment écrire du mot %MW0 sur %MW11 ?
Sérieusement ?
L'instruction := ça fait un moment qu'elle existe chez Schneider quand même. Au moins aussi longtemps que le premier automate fabriqué je pense.
Tu te paluche toute une com' modbus RTU bien complexe a la mano et tu sait pas faire %MW11:=%MW0 dans un bloc operate ?
T'est Marcel Béliveau ? Ou est la caméra ?
Re: [M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 13 juin 2025, 20:04
par philou77
Salut !
C’est de l’IA.
Encore en train d’apprendre …. Lol
Re: [M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 14 juin 2025, 09:41
par Bruce33
Bonjour,
La question est pertinente parce que c'est différent entre le M221 (SoMachine/Machine Expert
Basic) et les autres M241, M251, etc.
Sur M221 c'est comme avec PL7 et Control Expert (et surtout comme le Twido) : %MD5 est constitué de %MW5 et %MW6. Donc %MW10 et %MW11 constituent %MD10.
Re: [M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 14 juin 2025, 10:09
par MiGaNuTs
Bruce33 a écrit : ↑14 juin 2025, 09:41
Bonjour,
La question est pertinente parce que c'est différent entre le M221 (SoMachine/Machine Expert
Basic) et les autres M241, M251, etc.
Sur M221 c'est comme avec PL7 et Control Expert (et surtout comme le Twido) : %MD5 est constitué de %MW5 et %MW6. Donc %MW10 et %MW11 constituent %MD10.
Oups

Re: [M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 14 juin 2025, 10:59
par Bruce33
Il y a plusieurs techniques pour inverser les mots d'un mot double.
Il y a effectivement la recopie des mots individuellement en utilisant l'adressage.
On peut aussi utiliser l'instruction qui réalise une rotation des bits : ROL(%MD10,16) ou ROR(%MD10,16)
On pourrait donc écrire (dans un bloc opération) :
%MD10:=ROL(%MD10,16)
mais alors attention ! il faut l'exécuter au bon moment puisqu'on modifie la variable directement.
Pour éviter les ennuis et faciliter le débogage, il est préférable de copier le résultat dans une variable distincte par exemple :
%MD80:=ROL(%MD10,16)
On peut encore utiliser l'instruction CONCATW :
%MD80:=CONCATW(%MW11, %MW10)
Re: [M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 16 juin 2025, 15:48
par NAAION
Bonjour,
merci pour vos réponse.
MiGaNuTs a écrit : ↑13 juin 2025, 17:21
NAAION a écrit : ↑13 juin 2025, 15:04
Quelle est la relation entre %MD5 et %MW11 & %mW10.
https://www.se.com/fr/fr/faqs/FA142152/
NAAION a écrit : ↑13 juin 2025, 15:04
Et aussi comment écrire du mot %MW0 sur %MW11 ?
Sérieusement ?
L'instruction := ça fait un moment qu'elle existe chez Schneider quand même. Au moins aussi longtemps que le premier automate fabriqué je pense.
Tu te paluche toute une com' modbus RTU bien complexe a la mano et tu sait pas faire %MW11:=%MW0 dans un bloc operate ?
T'est Marcel Béliveau ? Ou est la caméra ?
Et oui comme je le dit en début de poste je débute totalement sur Machine Expert Basic.
Je suis arrivé a lire la variable et aussi j'ai compris pour le double mot et le swap.
En fait pour un mot double en 32 bits:
- MW0 --> 1er mot en 16 bits
- MW1 --> 2eme mot en 16 bits
- MD0 --> Double mot non Swap
- MD1--> Double mot Swap
c'est assez simple en fait.
j'ai même réussi a inverser le mot avec un bloc operate et réécrire sur le %MW100.
Mais maintenant un autre problème ce pose a moi. J'ai donc deux registres Modbus a lire en deux mots de 32 bits (pour l'exemple seul l'e dispositif en adresse 1 m'intéresse):
ma première lecture de registre Modbus fonctionne :
Mais pour le deuxième registre en 50536 j'ai aucune valeur dans mon %MD2, %MD3, %MW2 et %MW3.
je ne comprend pas mon erreur
Des idées ?
Re: [M221] lecture d'un registre Modbus RTU en 32 bits swap
Posté : 16 juin 2025, 16:25
par siryop
Dans ton premier message, il y a une image où tu as configuré le client modbus, il est indiqué Quantity 2 je pense qu'il faut que tu l'augmente suivant ta zone de lecture en mots.