Ipx800v5 modbus tcp id device

Bonsoir

Je n’arrive pas à déterminer comment spécifier l « ID DEVICE » en MODBUS TCP

En MODBUS RTU - le champ ID device est disponible -

En MODBUS TCP même trame

Je dois piloter via TCP une DEVICE à l’adresse IP 192.168.1.122, port.502, ID 3

Comment spécifier l’ID DEVICE ?

Avez-vous une idée ?

Après quelques recherches je crois avoir compris le problème.
Pour savoir quel est l’ID envoyé par l’IPX j’ai configuré un client MODBUS (python) sur mon PC et envoyé une trame à cette adresse.
https://pymodbus.readthedocs.io/en/latest/source/example/synchronous_server.html

Resultat:
sync :199 Handling data: 0xdc 0xc1 0x0 0x0 0x0 0x6 0xff 0x3 0x0 0x0 0x0 0x8
socket_framer :147 Processing: 0xdc 0xc1 0x0 0x0 0x0 0x6 0xff 0x3 0x0 0x0 0x0 0x8
Factory Request[ReadHoldingRegistersRequest: 3]
context :63 validate: fc-[3] address-1: count-8
context :77 getValues fc-[3] address-1: count-8
send: [ReadHoldingRegistersResponse (8)]-b’dcc100000013ff031000020003000400050006000700080009’

Message MODBUS → 0xff 0x3 0x0 0x0 0x0 0x8
Lecture de 8 registres à l’adresse Zero avec un ID 255

Reponse valeurs de 2 a 9 (ce que j’ai demandé au SLAVE MODBUS de renvoyer)
000020003000400050006000700080009

Confirmation avec le programme Wireshark (analyse de la trame MODBUS)

Conclusion:
MODBUS TCP sur l’IPX envoi systématiquement l’ID 255 ce qui ne me permet pas d’adresser les périphériques MODBUS qui sont reliés derrière la passerelle TCP → RTU(RS485) (ce que je peux faire sans problème à partir d’un programme python)
example (avec une librairie MODBUS)

reader, writer = await asyncio.open_connection(‹ 192.168.1.200 ›, 502)
client = AsyncTCPClient((reader, writer))
print(« Reading holding registers ADAM3066 »)
reply = await client.read_holding_registers(slave_id=3, starting_address=0, quantity=8)

Une mise à jour de l’objet MODBUS TCP avec possibilité d’indiquer l’ID DEVICE pourrait résoudre le problème, le cas échéant. En effet lorsque l’on dispose d’une passerelle TCP → RTU il peut y avoir plusieurs périphériques MODBUS connectés derrière la passerelle (avec 1 périphérique l’ID 255 convient mais avec plusieurs périphériques impossible de communiquer).
Avec MODBUS TCP l’ID DEVICE est indispensable pour adresser les périphériques derrière la passerelle comme dans le cas du RTU.

Bon dimanche

1 « J'aime »

Bonjour @denisB ,

Merci pour cette analyse complète!
Votre cas correspond au cas particulier où vous avez une chaine Modbus RTU où un périphérique est déjà par nécessité maître et donc l’IPX V5 ne peut pas y être maitre (comme elle est obligatoirement maitre en RTU), il faut alors passer par une passerelle Modbus TCP <=> RTU pour interroger un périphérique de la chaine RTU et l’ID de ce périphérique est alors nécessaire (sinon en Modbus TCP pas besoin, l’IP du périphérique suffit).
Je place donc une demande d’évolution :wink: mais vous vous doutez bien qu’elle ne sera pas prioritaire …

Bon dimanche

1 « J'aime »

Bonjour Jweb,
Je comprends tout à fait que cette demande puisse ne pas être prioritaire étant donné que le cas d’une passerelle MODBUS maître n’est pas très courant, mais tout de même relativement répandu …
C’est le cas de mon installation photovoltaïque qui comporte une passerelle maître EMS, un Inverseur MODBUS sur l’id 5 qui est connecté a un compteur d’énergie lui même en connecté en en RTU à l’inverseur sur l’ID 1
Ce serait fantastique de pouvoir piloter l’inverseur avec l’IPX et de récupérer des données du compteur d’énergie

Une idée: peux-être l’évolution pourrait être facile à mettre en place sans changement de l’interface utilisateur, et en utilisant des données déjà disponibles, en prenant en compte en TCP le même ID que celui qui est configuré en RTU.

----> En TCP c’est l’ID 3 qui serait utilisé par défaut à charge de l’utilisateur de demander 255, le cas échéant.

Bon dimanche et merci beaucoup pour cette demande de développement :grinning: