Ipx800v5 modbus

Bonjour je fais des tests ModBus et je rencontre la difficulté suivante:

Je dois envoyer la commande suivante:

Send: 01 15 00 00 00 08 01 164 CRC (example)
1;15;0;0;0;8;1;164
en details:
function code 15 (write multiple digital output register)
register address 0000 (starting register address)
register number 0008 (write 8 registers - 8 bits ou I/O pour IPX)
byte of data = 01 (1 byte = 8bits)
write 1 byte = 164 (valleur binaire a ecrire 11011110)
CRC check code for all data

Je code dans un object MODBUS Write

Mais la trame envoyée est la suivante (je lis la trame sur un UART)
1;15;0;0;0;1;1;164;
ou lieu de
1;15;0;0;0;8;1;164

Conclusion la trame MODBUS code un message 8 bits comme si sa longueur était un bit (1 register au lieu de 8 register).
Donc je ne peux piloter que le dernier bit de mon message (il s’agit d’un relais), et cela fonctionne bien dernier bit =0 le relais s’ouvre =1 il se ferme
Je pense qu’il s’agit d’un bug (confusion entre bits et bytes (octets) dans le message MODBUS et je ne sais pas comment y remédier il m’est en fait impossible de créer le message modbus 1;15;0;0;0;8;1;164

Quelqu’un aurait-t-il une idée ?
Merci
Denis

Bonsoir @denisB ,

Quelle est votre configuration au niveau des settings MODBUS (Gestion RTU)?

Pour moi 11011110 (bin) fait DE (hex) ou 222 (dec) …
Si vous souhaitez écrire la valeur 164 (A4) : 10100100

D’autre part, vous devez écrire 8 registres, pourquoi avez vous sélectionné « Write multiple bit »? et non pas « write multiple register »?
image

la valeur 0008 doit être codée sur 2 bytes (2 octets) : 00000000 00001000 :wink:

1 « J'aime »

Bonjour, et merci beaucoup JWEB pour vos réponses

La config. RTU est adéquate pour le périphérique que je veux piloter (WP8025ADAM-8 Relais-Commande MODBUS)


et la communication fonctionne bien puisque j’arrive a actionner le premier relais.

D’autre part il s’agit bien de bits et pas d’octets à écrire même si la doc. constructeur peut prêter à confusion. Il ne s’agit pas de « register » mais de « coils »


L’état des 8 relais doit être codé sur un Octet (voir ci dessous l’utilisation de la fonction 15 ou 0x0F)


Tout a fait d’accord pour la valeur binaire 10100100 (c’est une erreur de conversion qui s’est glissée dans mon email, il s’agit bien de 164 - A4)

Donc pour résumer la commande que je veux envoyer est la suivante
Code fonction (Taille 1 octet) 15 ecriture n bits
Adresse de départ (Taille 2 octets) 0000
Nombre de bits à écrire (Taille 2 octets) 0008
Nombre d’octets à écrire (1 byte = 8bits) 1
Valeur(s) à écrire 164 (valleur binaire a ecrire 10100100)
CRC check code for all data

Donc la trame voulue est la suivante (decimal): 1(adresse); + 15;0;0;0;8;1;164;
Mais la trame envoyée par l’IPX est 1;15;0;0;0;1;1;164;

De plus si l’on considère le retour d’info du périphérique
→ TRAME ENVOYEE 1;15;0;0;0;1;1;164;47;44;
→ RETOUR PERIF 1;15;0;0;0;1;148;11;
Le périphérique nous indique qu’il a écrit un bit et pas les 8 bits demandés.

Je crois que la fonction « Write multiple bit » de l’IPX est mal codée.
Lorsqu’il s’agit d’écrire 8 bits, Le registre Nombre de bits à écrire devrait contenir la valeur 8 or l’IPX code la valeur 1.
Peut-être qu’il s’agit d’un bug, ou alors je n’ai pas bien compris l’utilisation de cet Objet MODBUS.
Bonne journée
Denis

Bonjour @denisB

Oui peut-être, je n’ai pas de matériel pour tester :sweat_smile:.
Je vous conseille d’essayer à nouveau avec le mode write multiple register … et nous poster la réponse de la v5.
Si cela ne fonctionne pas, alors il vous faudra ouvrir un ticket au helpdesk, l’équipe GCE est très réactive
Bon courage pour la suite et merci de poster votre retour d’expérience qui pourra servir à toute la communauté :grin: une fois la difficulté dépassée

1 « J'aime »

J’ai essayé avec Write multiple register (code 16 = second octet du message) et cela ne fonctionne pas.
En effet le message envoyé est le suivant
1;16;0;0;0;1;1;164;193;237;
Pas de réponse du périphérique qui ne comprend pas parce que cette commande n’est pas répertoriée dans cette configuration.
Par contre avec Write multiple bits le perif répond mais il écrit 1 bit au lieu de 8 bits suite à la demande de l’IPX. Le 0;1 devrait être 0;8 puisque j’envoi 8 bits et pas 1 bit mais je n’ai pas de prise sur cela, c’est l’IPX qui décide …
1;15;0;0;**0;1;**1;164;47;44; ---- 1;15;0;0;0;1;148;11;
Je vais attendre un peu pour voir si il y a d’autre interventions sinon j’envoi un message au Helpdesk
Cette fonction MODBUS est fantastique mais elle nécessite peut-être quelques ajustements.

Pour info. je peux lire les messages échangés grâce à un Convertisseur RS485 → (socket) TCP et un programme en python qui se connecte au socket et me revoie les trames RS485. C’est pratique pour comprendre les échanges MODBUS.

HOST = ‹ 192.168.1.210 ›
PORT = 8899
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))
print (‹ Connexion vers ’ + HOST + ‹ : › + str(PORT) + ’ reussie. ›)
messageGlobal=‹  ›

while True:
donnees = client.recv(1024)
messageGlobal=donnees
print(len(messageGlobal),end = ‹ ; ›)
for character in messageGlobal:
print(character, end=‹ ; ›)
print(«  »)

Résultat mis en forme (ou l’on voit que « write multiple bits » fonctionne bien mais avec un problème de codage)

Connexion vers 192.168.1.210:8899 reussie.
1;16;0;0;0;1;1;164;193;237;
1;16;0;0;0;1;1;164;193;237;
1;16;0;0;0;1;1;164;193;237;
1;15;0;0;0;1;1;164;47;44;
1;15;0;0;0;1;148;11;
1;15;0;0;0;1;1;164;47;44;
1;15;0;0;0;1;148;11;
1;15;0;0;0;1;1;164;47;44;
1;15;0;0;0;1;148;11;

Merci encore et Bonne journée

3 « J'aime »

Je viens d’installer la version 5.4.0 et la commande MODBUS en question a été mise à jour. Mon périphérique fonctionne donc parfaitement et je remercie GCE pour leur réactivité.
→ TRAME ENVOYEE 1;15;0;0;0;8;1;164;255;46;
→ REPONSE PERIF 1;15;0;0;0;8;84;13;
Bonne journée

2 « J'aime »