Pilotage via un automate Schneider et Machine Expert Basic (Modbus)
Configuration de l'interface sur Machine Expert Basic
Sur ordinateur, ouvrir le logiciel Machine Expert Basic.

Dans un premier temps, configurer un mot de passe pour les deux types de protections. Pour plus de facilité, mettre les protections en Inactif puis cliquer sur Appliquer.

Aller sur l'onglet Configuration et rechercher la référence du PLC.

Glisser-déposer le bloc sur l'espace de travail et cliquer sur Oui.

Enregistrer le projet.

Aller sur ETH1, configurer une adresse IP disponible, cocher les quatre cases en dessous et cliquer sur Appliquer.

Aller dans l'onglet Mise en service. L'adresse IP renseignée précédemment doit apparaitre dans le champ Equipements Ethernet. Pour vérifier la connexion au PLC, cocher les cases à proximité de l'adresse IP, puis cliquer sur celle-ci et enfin cliquer sur Connexion.

Si la connexion s'est faite, la mention En ligne doit apparaitre.

Cliquer sur Deconnexion.
Retourner sur l'onglet Configuration et sur Modbus TCP. Ajouter l'adresse IP statique du robot. Pour définir une adresse statique, suivre le tuto suivant ici. Cliquer sur Ajouter, choisir un nom et cliquer sur Appliquer.

Aller sur Programmation. Cette première partie va se concentrer sur la lecture de données. Ajouter le bloc Read Var.

Ajouter les paramètres suivants dans le bloc.

Bloc READ_VAR (Rung 0) :
- Link : 3 - ETH1
-
OBJTYPE : 0 - Read multiple words (Pour lire les valeurs des registres)
-
FirstObj : adresse de départ dans le robot (ex: 228). Noter un décalage de un par rapport aux registres du robot. Dans notre cas, on recevra les données sur le registre 229 envoyées par le robot.
-
Quantity : 2 (pour lire un flottant).
-
IndexData : %MW228 (adresse de réception dans l'automate).
Cliquer sur Appliquer.
Ajouter des contacts aux entrées du bloc et des bobines aux sorties de celui-ci. Attribuer des adresses et des symboles aux différentes broches :
| Broche | EXECUTE | ABORT | DONE | BUSY | ABORTED | ERROR |
| Symbole | SB_TB1S | ERROR_READ | DONE_READ | BUSY_READ | ABORTED_READ | ERROR_READ |
| Adresse | %S6 | %M4 | %M1 | %M2 | %M3 | %M4 |
Les adresses et symboles présentés ici sont donnés à titre indicatif. Libre d'adapter ce choix selon les différents standards. Noter également que l'adresse de l'horloge est modifiable (par exemple en utilisant %S7) pour correspondre à votre configuration système.

Ajouter un nouveau réseau. Dans celui-ci, ajouter un nouveau contact, deux blocs d'opérations et pour une nouvelle bobine. Les blocs d'opérations vont servir à procéder à une conversion des données.
En effet, le robot et l’automate ne parlent pas le même "dialecte" binaire pour les nombres à virgule (Flottants/REAL). Le robot envoie les informations dans un ordre inversé par rapport à ce qu'attend l'automate M221. Sans cette étape, on peut lire des valeurs incohérentes comme 9.10844E-44 au lieu de 8.0.
Rôle des deux blocs d'opération (Mode Lecture)
Le but est de remettre les 32 bits de la donnée dans le bon ordre avant que l'automate ne les interprète.
-
Le "Word Swap" (inversion des mots) :
-
Le flottant est découpé en deux registres de 16 bits (%MW228 et %MW229).
-
L'opération consiste à utiliser deux nouveaux registres (%MW300 et %MW301), déplacer le contenu du deuxième mot vers le premier, et vice-versa, pour replacer l'exposant et la mantisse au bon endroit. Le flottant est donc inversé.
-
-
Le "Byte Swap" (Inversion des octets) :
-
À l'intérieur de chaque mot, les deux octets (8 bits) sont aussi inversés.
-
La fonction SWAP (ou ROL ..., 8) bascule ces octets pour que l'automate lise enfin la valeur réelle.
-
Étapes de conversion
-
Réception : le bloc %READ_VAR0 enregistre les données brutes "en désordre" dans %MW228 et %MW229.
-
Déclenchement : une fois la lecture terminée sans erreur, le bit %M1 (DONE) s'active et autorise l'exécution des calculs.
-
Traitement : Les instructions %MW300:2 := SWAP(%MW229:2) et %MW301:2 := SWAP(%MW228:2) traitent les deux mots d'un coup. Elles inversent les octets et rangent le résultat dans de nouvelles zones propres : %MW300 et %MW301.
-
Résultat : l'automate assemble automatiquement ces deux mots pour former la variable %MF300 (%MW300 et %MW301). C’est ici qu'on lit la valeur corrigée (ex: 1,0 ou 8,0).
Ajouter les expressions ainsi que les adresses et symboles comme indiqué sur l'image suivante.

Le bloc de lecture est enfin prêt. Pour la partie écriture, la même logique va être appliquée.
Ajouter un nouveau réseau et rechercher le bloc Write Var.

Ajouter les différents blocs de la même manière qu'indiquée sur l'image avec les adresses et symboles correspondants.
| Broche | EXECUTE | ABORT | DONE | BUSY | ABORTED | ERROR |
| Symbole | SB_TB1S | ERROR_WRITE | DONE_WRITE | BUSY_WRITE | ABORTED_WRITE | ERROR_WRITE |
| Adresse | %S6 | %M9 | %M6 | %M7 | %M8 | %M9 |

Ajouter les paramètres suivants dans le bloc.

Bloc WRITE_VAR (Rung 0) :
- Link : 3 - ETH1
-
OBJTYPE : 0 - Write multiple words (Pour envoyer les valeurs aux registres)
-
FirstObj : adresse de départ dans le robot (ex: 226). Noter également un décalage de un par rapport aux registres du robot. Dans notre cas, on enverra les données de commandes sur le registre 227 du robot.
-
Quantity : 2 (pour lire un flottant).
-
IndexData : %MW226 (adresse de réception dans l'automate).
Cliquer sur Appliquer.
De la même manière que la partie lecture, ajouter un nouveau réseau avec un nouveau contact, deux blocs d'opérations et une nouvelle bobine.

Rôle des deux blocs d’opération (Mode Écriture)
Le but est de "désordonner" volontairement les 32 bits de la consigne pour qu'ils arrivent dans le format attendu par le robot.
-
Le "Word Swap" : on prépare l'envoi en croisant les registres de la consigne (ex : %MW400 et %MW401) vers les registres d'envoi (%MW410 et %MW411).
-
Le "Byte Swap" : la fonction SWAP préinverse les octets de chaque mot pour que le robot reçoive les bits de l'exposant et de la mantisse dans son propre "dialecte".
Étapes de conversion
-
Préparation : saisir la valeur cible dans la variable flottante %MF400 (composée de %MW400 et%MW401).
-
Traitement : les instructions %MW410:2 := SWAP(%MW401:2) et %MW411:2 := SWAP(%MW400:2) (avec inversion de l'ordre des mots) préparent les données dans les registres tampons %MW410 et %MW411.
-
Déclenchement : l'activation du bloc %WRITE_VAR0 (via un bouton ou une horloge) lance le transfert.
-
Envoi : l'automate transmet les données "pré-croisées" au robot qui les interprète alors instantanément comme la bonne valeur réelle.
La configuration est prête.
Avant de le charger dans l'automate, créer une table d'animation pour afficher les valeurs lues et modifier les valeurs à écrire.
Pour cela, faire un clic droit sur Outils → Table d'animation → Ajouter une nouvelle table d'animation.

Saisir les adresses %MF300 (Lecture) et %MF400 (Écriture) une par une en cliquant à chaque fois sur Entrée ou le bouton Ajouter.

Aller dans Mise en service. Cliquer sur Connexion puis sur PC vers contrôleur (chargement). Confirmer pour écraser le programme.
Retourner dans Programmation. Cliquer sur le bouton pour Démarrer le contrôleur.

Double-cliquer sur la case de la valeur de l'adresse. C'est cette valeur qui va être utilisée dans le programme du robot pour exécuter des actions prédéfinies.

La configuration côté PLC est maintenant terminée.
Modification du port Modbus
Bien que le port standard du protocole Modbus soit le 502, les robots Niryo utilisent par défaut le port 5020. Le logiciel Machine Expert – Basic ne permettant pas la personnalisation du port de communication (contrairement aux versions "Pro" ou à TIA Portal), une adaptation est nécessaire. Pour pallier cette limitation, une règle de redirection de port (port forwarding) doit être configurée directement sur le robot.
Pour faire cela, sur Windows (à voir sur Linux et Mac), ouvrir l'invite de commandes et se connecter au robot en SSH. Les démarches sont expliquées ici. L'adresse IP à fournir est celle du robot, configurée précédemment lors de l'ajout de celle-ci sur Machine Expert - Basic.

Dès lors que la connexion est faite, taper ligne par ligne :
cd /etc/ufw
sudo nano before.rules
Saisir le même mot de passe lors de la connexion en SSH. Dans ce fichier, ajouter les lignes suivantes avant le COMMIT :
COMMIT
### PORT FORWARDING ###
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport <PORT> -j REDIRECT --to-port 5020
Remplacer "<PORT>" par le numéro de port souhaité (502).

Sauvegarder en appuyant sur CTRL+S puis fermer le fichier avec CTRL+X.
Ensuite, taper les commandes suivantes :
cd
cd /etc/default
sudo nano ufw
Puis, au niveau de la ligne DEFAULT_FORWARD_POLICY, passer de DROP à ACCEPT.

Sauvegarder en appuyant sur CTRL+S puis fermer le fichier avec CTRL+X.
Taper la commande suivante :
sudo ufw enable
Si des erreurs surviennent lors du lancement de cette commande (comportement instable observé avec ufw), éditez le fichier before.rules : supprimez puis réinsérez la balise COMMIT située juste avant la ligne ### PORT FORWARDING ###.
Retenter la commande du dessus, puis si aucune erreur n'apparait, taper la commande suivante :
sudo ufw reload
Si tout a fonctionné, désactiver la connexion SSH.
sudo reboot
Programmation côté robot
Il est temps de créer un programme pour le robot, afin qu'il puisse recevoir les commandes provenant du PLC et envoyer leur statut en retour. Ce programme peut être codé uniquement avec PyNiryo. La version de PyModbus utilisée est la 3.9.0. Pour l'installer, taper la commande suivante dans le terminal d'un environnement Python virtuel.
pip install pymodbus==3.8.0
Par la suite, vous pouvez copier le code exemple, retrouvable ici.
Le script Python transforme le robot Niryo en un client Modbus TCP qui va écouter ses propres registres enregistrés sur le serveur du robot. Son rôle est d'écouter les ordres envoyés par le PLC (commandes) et de lui renvoyer des informations sur son état actuel (statut).
1. Adressage et Registres Clés
Le dialogue repose sur deux zones mémoires précises :
- REG_COMMAND (227) : le "tableau de bord" où le PLC écrit ses ordres (1.0, 2.0, etc.).
- REG_STATUS (229) : le "miroir" où le robot écrit son état (action en cours ou terminée) pour que le PLC le lise.
2. Le rôle du Décodage/Encodage
Comme l'automate et le robot n'utilisent pas le même ordre d'octets, le script utilise deux fonctions vitales :
-
decode() : réceptionne les registres "en désordre" envoyés par le PLC et les reforme en nombre réel (ex: transforme les signaux du PLC en 2.0).
-
encode() : prépare les données de statut du robot (ex: 1.0 pour "fini") dans le format inverse pour que le PLC puisse correctement les lire sans erreur.
3. Logique de commande et statut
Le programme tourne en boucle selon ce cycle :
-
Lecture : le robot surveille le registre 227. Si une nouvelle valeur apparaît, il lance l'action correspondante (Home, Vision, ou Trajectoire).
-
Statut : dès qu'il commence, il écrit 0.0 dans le registre 229 (Occupé). Une fois le mouvement fini, il écrit 1.0 (Prêt).
La configuration côté robot et PLC est faite.
Tests
Retourner sur Machine Expert Basic, cliquer sur Connexion, puis démarrer le contrôleur. Lancer le programme au niveau du robot, puis faire varier la valeur de l'adresse %MF400 au niveau de la table d'animation, pour voir le robot bouger.


