Il y a deux semaines, on vous a présenté une amélioration de l'API Yoctopuce qui permet d'observer facilement ce qui se passe sur une ligne série à l'aide d'un callback. Évidement, on s'est dépêchés de l'intégrer dans notre application ModbusTool, qui est désormais capable de vous afficher les données qui passent sur une ligne Modbus.
Vous vous en doutez peut-être, mais l'apparition de la fonction registerSnoopingCallback() est en fait étroitement liée à ModBusTool et voici ce qu'il s'est vraiment passé chez Yoctopuce:
Employé 1: C'est pas mal ce ModBusTool, mais ça serait encore mieux s'il pouvait écouter et décoder les paquets Modbus.
Employé 2: Peut-être, mais ça serait quand même plus facile à coder avec un système de snoopping callback.
Employé 1: Chiche ?
Snooping Modbus
Du coup, vous trouverez dans l'interface de ModbusTool un nouveau tab "Snooping" qui vous décrit tous les messages qui passent sur le bus, à savoir
- L'heure du message
- La direction, c'est à dire si le message a été émis par le module Yoctopuce choisi dans la section 1 de l'interface, ou par un autre appareil connecté au bus.
- Le message complet, au format hexadécimal
- L'adresse du périphérique Modbus concerné.
- Le message décodé, ce qui devrait vous permettre de comprendre en un coup d’œil ce qui se passe sur le bus.
La nouvelle interface de snooping et décodage des paquets ModBus
Limitations
Il y a cependant quelques limitations dont il faut être conscient:
L’horodatage des messages n'est pas forcément très précis: il est basé sur le temps écoulé mesuré entre deux messages consécutifs. Pour des questions techniques, les modules Yoctopuce encodent cette valeur en notation flottante sur 8 bits. Du coup, plus ce nombre est grand moins il sera précis et la valeur maximale encodable est de 60 secondes.
Pour l'instant, seules les fonctions Modbus 1 à 6, 15 et 16 sont décodées, c'est-à-dire:
- 0x01: Read Coils
- 0x02: Read Discrete Inputs
- 0x03: Read Holding Registers
- 0x04: Read Input Registers
- 0x05: Write Single Coil
- 0x06: Write Single Register
- 0x0F: Write Multiple Coils
- 0x10: Write Multiple Registers
Si vous connaissez un périphérique qui utilise les autres, on serait assez intéressés :-)
Le protocole Modbus date de 1979, et cela se ressent un peu: ce protocole n'est pas aussi carré qu'un protocole moderne. Il existe des cas ambigus qui ne permettent pas de deviner facilement si un paquet est une commande envoyée par le master Modbus ou une réponse. Un cas typique est la fonction 5 qui permet l'écriture d'un coil, le périphérique confirme l'opération en renvoyant exactement le même paquet. Lorsque la transaction est effectuée depuis le module Yoctopuce utilisé par ModbusTool, on peut s'aider du sens de la transaction, mais dans le cas d'une écoute pure où ModbusTool ne fait qu'observer des transactions effectuées par des appareils tiers sans intervenir, il n'est pas possible de déterminer si la transaction est une requête ou une réponse.
Un exemple d’ambiguïté du protocole ModBus
Support des hubs réseaux
Pendant qu'on y était, on a ajouté la possibilité d'utiliser un YoctoHub distant, pour cela il vous suffit de lancer l’exécutable en ligne de commande avec l'adresse IP du hub en paramètre. Vous trouverez une confirmation de l'adresse utilisée dans les logs de ModbusTool, par exemple si vous voulez utiliser un YoctoHub ou un VirtualHub dont l'adresse IP est 192.168.0.12, vous taperez:
C:\Program Files (x86)\Yoctopuce\ModBusTool\ModBusTool.exe 192.168.0.12
Utilisation d'un hub distant
Distribution
Enfin, plutôt que de distribuer ModbusTool à la sauvette sur le blog, on a finalement décidé de faire un installeur en bonne et due forme et de le proposer directement sur notre page utilitaires.
Voilà, vous savez tout.