Ce tuto va nous guider dans la mise en place d’un module d’entrées-sorties Modbus-TCP WAGO. Ce protocole a l’avantage d’être simple et très répandu, ces performances couvrent un large cas d’usages. Pour les côtés négatifs il ne dispose pas d’un si fort niveau d’abstraction que d’autres comme Bacnet/IP ou OPC-UA, le développeur doit penser a la mise en forme de ces requêtes et l’interprétation de données.
Dans ce tuto nous allons présenter la mise en place d’un îlot d’entrées-sorties WAGO ( un de nos partenaires favoris) avec notre contrôleur CODESYS, le hai-p200-4g.
Prérequis
- Un contrôleur HAI-P200-4G
- CODESYS installé sur le PC de développement (cf: Tuto première CODESYS)
- Disposer d’un coupleur Modbus-TCP ( WAGO 750-362 ou 750-352 ).
- Une carte d’alimentation 750-602
- Une carte d’entrées TOR 750-432
- Une carte de sorties TOR 750-531
- Une carte de fin de bus
Alimentation + Adressage
Alimentation
Comme l’automate, le coupleur est alimenté avec une alimentation 24V. Pour le brancher, vous devez utiliser une carte d’alimentation comme le Wago 750-602.
L’ensemble des cartes ajoutées dans la glissière de la carte d’alimentation seront directement alimentés.
Adressage IP
Le coupleur 750-362 peut être adressé directement avec les micros switches situés haut à gauche du connecteur d’alimentation. Les 8 micro switches représentent la valeur du dernier octet de l’adresse IP. Nous réglons donc le dernier switch sur 1 pour obtenir la valeur 128 soit l’IP 192.168.1.128.
Adressage modbus
Les coupleurs Wago disposent de règles d’adressages simple et logiques en fonction de l’ordre des cartes.
Vous pouvez obtenir les adresses utilisées en tapant l’adresse IP de votre coupleur sur votre navigateur.
Vous arriverez sur cette page :
Ouvrez alors l’onglet Modbus Mapping pour retrouver les adresses à utiliser :
Modbus sur Codesys
Concernant la connexion avec CODESYS, nous avons documenté cette étape dans dans le tuto Première connexion Première connexion
Tuto vidéo
Intégration du coupleur Modbus-TCP
Pour commencer, faites un clic droit sur Device et cliquez sur Ajouter un appareil. Puis, ajoutez Bus de terrain > Adaptateur Ethernet > Ethernet.
Double cliquez sur Ethernet, puis dans Général, cliquez sur Browse pour ajouter l’interface réseau utilisée pour la communication Modbus.
Faites un clic droit sur Ethernet et cliquez sur Ajouter un appareil. Ajoutez alors Bus de terrain > Modbus > Maître TCP Modbus > Modbus TCP Client. Faites alors un clic droit sur Modbus_TCP_Client pour ajouter l’appareil Bus de terrain > Modbus > Esclave TCP Modbus > Modbus TCP Server.
Double cliquez sur Modbus_TCP_Server et renseignez l’adresse IP de votre coupleur Modbus.
Premier code
Rendez-vous ensuite dans l’onglet Canal esclave Modbus et cliquez sur Ajouter un canal pour créer une requête. Vous pouvez alors paramétrer le type de requête, l’adresse du registre sur lequel vous souhaitez Lire/Ecrire, …
Puis, rendez-vous dans l’onglet ModbusTCPServer Mappage E/S pour ajouter les variables qui serviront à l’écriture ou la lecture des données inscrites à l’intérieure.
Pour le code suivant, nous utiliserons la variable Write pour afficher sur le coupleur l’état de Read, une autre variable prenant une entrée TOR.
Voici le code :
PROGRAM PLC_PRG
VAR
END_VAR
Write := Read;
Affichage des erreurs Modbus
PROGRAM PLC_PRG
VAR
Diagnostic : IoDrvModbusTCP.MB_ErrorCodes;
END_VAR
Write := Read;
Diagnostic := SEL(Modbus_TCP_Client.xSlaveError, Diagnostic, Modbus_TCP_Server.byModbusError);
Sans erreur, Diagnostic retourne RESPONSE_SUCCESS.
Voici les différents retours disponible :
Nom | Type de données | Valeur initiale | Commentaire |
RESPONSE_SUCCESS | BYTE | 16#0 | Tout est OK |
ILLEGAL_FUNCTION | BYTE | 16#1 | L'esclave ne prend pas en charge le code de fonction |
ILLEGAL_DATA_ADDRESS | BYTE | 16#2 | L'esclave ne prend pas en charge cet offset de registre |
ILLEGAL_DATA_VALUE | BYTE | 16#3 | La valeur à écrire n'est pas valide |
SLAVE_DEVICE_FAILURE | BYTE | 16#4 | Erreur irrécupérable lors de l'exécution de la requête |
ACKNOWLEDGE | BYTE | 16#5 | Notification par l'esclave du démarrage d'une opération longue |
SLAVE_DEVICE_BUSY | BYTE | 16#6 | Notification par l'esclave qu'une opération longue est en cours |
MEMORY_PARITY_ERROR | BYTE | 16#8 | Erreur spéciale pour les codes de fonction 20, 21 |
GATEWAY_PATH_UNAVAILABLE | BYTE | 16#A | Erreur spéciale lors de l'utilisation de dispositifs derrière une passerelle (passerelle mal configurée ou occupée) |
GATEWAY_DEVICE_FAILED_TO_RESPOND | BYTE | 16#B | Erreur spéciale lors de l'utilisation de dispositifs derrière une passerelle (le dispositif ne répond pas) |
RESPONSE_TIMEOUT | BYTE | 16#A1 | Il n'y a pas eu de réponse dans le délai imparti |
RESPONSE_CRC_FAIL | BYTE | 16#A2 | Le checksum de la réponse est incorrect |
RESPONSE_WRONG_SLAVE | BYTE | 16#A3 | La réponse ne provient pas de l'esclave attendu |
RESPONSE_WRONG_FUNCTIONCODE | BYTE | 16#A4 | Le code de fonction de la réponse n'est pas celui attend |
TCP_COMMUNICATION_ERROR | BYTE | 16#A5 | Erreur de port TCP. La requête n'a pas été envoyée |
RESPONSE_INVALID_DATA | BYTE | 16#A6 | La réponse contient des données invalides |
RESPONSE_INVALID_PROTOCOL | BYTE | 16#A7 | La réponse ne respecte pas le protocole Modbus |
RESPONSE_INVALID_HEADER | BYTE | 16#A8 | Un champ de l’en-tête MBAP de Modbus (protocole, longueur) est invalide |
INVALID_PARAMETER | BYTE | 16#A9 | Un paramètre d’entrée de l’opération est invalide (ex. : pointeur de données non défini ou code de fonction non pris en charge par la pile Modbus) |
UNDEFINED | BYTE | 16#FF | Le résultat de la requête est indéfini ou encore inconnu, par exemple en état initial |