[M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Forum traitant des automates industriels de marque Schneider - Telemecanique
Charles2a
Apprend le binaire
Apprend le binaire
Messages : 5
Enregistré le : 03 juil. 2023, 14:33

[M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par Charles2a »

Je suis en train de mettre en place un laboratoire de pentest d'automates industriels.

Il s'agit d'un feu tricolore contrôlé par un M221 en ModbusTCP.

Chaque sortie numérique contrôle une couleur (Q0.0 -> vert, Q0.1 -> orange, Q0.2 -> rouge).

Tout fonctionne correctement lorsque j'utilise le logiciel fourni par Schneider Electric, mais j'ai créé une interface graphique en Python et j'aimerais pouvoir contrôler mon feu avec celle-ci sans avoir besoin du logiciel de base.

J'ai testé plusieurs choses, notamment la bibliothèque pymodbustcp, mais je ne pense pas réussir à faire mon adressage correctement car rien ne change lorsque j'utilise la fonction write de la bibliothèque.

Je peux parler au contrôleur, mais je ne sais pas si j'envoie les bonnes informations au M221 ou si je les envoie à la bonne adresse, la documentation n'est pas explicite sur la façon de le contrôler avec autre chose que leur solution, cependant j'ai vu des tutoriels de personnes qui ont réussi à le faire mais cela ne fonctionne pas de mon côté et je ne comprends pas pourquoi.

Avez-vous des conseils pour savoir quelle adresse utiliser dans mon code ?

Si cela peut vous aider, voici mon code :

from pymodbus.client.sync import ModbusTcpClient as ModbusClient

Code : Tout sélectionner

#M221 IP address
PLC_IP = '192.168.1.4'
PLC_PORT = 502
client = ModbusClient(PLC_IP,PLC_PORT)
client.connect()
UNIT = 0x1
print('connected')

write = client.write_register(2, 1, unit=UNIT)
read = client.read_holding_registers(2, 1, unit=UNIT)
read1 = client.write_coil(0, True, unit=UNIT)
read2 = client.read_coils(0, 1, unit=UNIT)

print("Read value from PLC=", read.registers[0])
print("Read bit from PLC=", read2.bits)
client.close()
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7806
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par itasoft »

NON
Automaticien privé (de tout)
itasoft@free.fr
Avatar du membre
Béryl
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1956
Enregistré le : 20 oct. 2015, 12:00
Localisation : localhost

Re: [M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par Béryl »

Le mieux serait que tu passes en IO-Scanning sur le M221, ça t'évitera de t'embêter avec les Read/Write_Var.
Tu décides toi-même de l'adressage en fonction des mots que tu attribues
Charles2a
Apprend le binaire
Apprend le binaire
Messages : 5
Enregistré le : 03 juil. 2023, 14:33

Re: [M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par Charles2a »

itasoft a écrit : 03 juil. 2023, 14:43 NON
Au moins ça a le mérite d'être clair :lol:
Charles2a
Apprend le binaire
Apprend le binaire
Messages : 5
Enregistré le : 03 juil. 2023, 14:33

Re: [M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par Charles2a »

Béryl a écrit : 03 juil. 2023, 14:44 Le mieux serait que tu passes en IO-Scanning sur le M221, ça t'évitera de t'embêter avec les Read/Write_Var.
Tu décides toi-même de l'adressage en fonction des mots que tu attribues
Je vais me renseigner alors, je suis encore très débutant dans ce domaine et c'est assez compliqué je trouve
DurandO
Maître du binaire
Maître du binaire
Messages : 482
Enregistré le : 21 mars 2021, 15:31

Re: [M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par DurandO »

Bonjour,
pour piloter via modbus tcpip les sorties de l'api, je commencerai par écrire ce programme minimal dans l'API:

Code : Tout sélectionner

|--|%MW0:X0|----------------(O0.0)-|
|--|%MW0:X1|----------------(O0.1)-|
|--|%MW0:X2|----------------(O0.2)-|
tu doit définir une adresse IP = 192.168.1.4 pour ton API (ce qui est peut-être déjà fait).
Tu passes l'automate en RUN.

Ensuite, dans un premier temps, tu peux tester l'écriture ModBus TCP/IP à partir d'un PC.
Il y a un outil qui s'appelle "Modpoll" sous linux mais également Windaube.
ModPoll
Tu peux tester l'écriture registre à l'adresse 0, essayes d'écrire les valeurs suivantes :
- 1
- 2
- 4
Avatar du membre
Bruce33
Dieu du process
Dieu du process
Messages : 931
Enregistré le : 28 oct. 2015, 06:54
Localisation : Pas-de-Calais

Re: [M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par Bruce33 »

Bonjour,
Charles2a a écrit : 03 juil. 2023, 14:47
itasoft a écrit : 03 juil. 2023, 14:43 NON
Au moins ça a le mérite d'être clair :lol:
Itasoft est notre Schtroumpf grognon ! ;)

D'abord il faut charger une configuration adéquate dans l'automate M221 : définir une adresse IP et un masque cohérent, cocher le paramètre de sécurité "Serveur Modbus activé" sur le port Ethernet, allouer les bits de mémoire et les mots mémoire en mode "manuel" avec la quantité que vous souhaitez...

Ensuite un test avec un client Modbus est conseillé. ModPoll ou Modbus Doctor ou d'autres... Cela permet de vérifier rapidement le fonctionnement et de tester différents paramètres.
Normalement vous constaterez que l'adresse "Unit ID" est 255 (et non 1).
Ensuite vous vérifierez le décalage d'adresse : le registre 1 correspond à %MW0...
Puis il faut savoir quelle zone de données est utilisée par chaque fonction Modbus (read_holding_register, read_coils, etc.) A priori, sur le M221, on ne peut pas accéder directement aux entrées %I et aux sorties %Q, mais uniquement aux mémoires %M et %MW.

Enfin, en passant à la programmation avec Python, commencez par une seule instruction de lecture avant de tester l'écriture !
Ne pouvez-vous pas paramétrer unit_id au niveau de l'initialisation de ModbusClient plutôt qu'à chaque appel de fonction de lecture/écriture ?
Avatar du membre
Relax1485
Codeur fou
Codeur fou
Messages : 206
Enregistré le : 02 oct. 2017, 11:45
Localisation : OCCITANIE

Re: [M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par Relax1485 »

Bruce33 a écrit : 04 juil. 2023, 08:06 Bonjour,
Charles2a a écrit : 03 juil. 2023, 14:47
itasoft a écrit : 03 juil. 2023, 14:43 NON
Au moins ça a le mérite d'être clair :lol:
Itasoft est notre Schtroumpf grognon ! ;)

D'abord il faut charger une configuration adéquate dans l'automate M221 : définir une adresse IP et un masque cohérent, cocher le paramètre de sécurité "Serveur Modbus activé" sur le port Ethernet, allouer les bits de mémoire et les mots mémoire en mode "manuel" avec la quantité que vous souhaitez...

Ensuite un test avec un client Modbus est conseillé. ModPoll ou Modbus Doctor ou d'autres... Cela permet de vérifier rapidement le fonctionnement et de tester différents paramètres.
Normalement vous constaterez que l'adresse "Unit ID" est 255 (et non 1).
Ensuite vous vérifierez le décalage d'adresse : le registre 1 correspond à %MW0...
Puis il faut savoir quelle zone de données est utilisée par chaque fonction Modbus (read_holding_register, read_coils, etc.) A priori, sur le M221, on ne peut pas accéder directement aux entrées %I et aux sorties %Q, mais uniquement aux mémoires %M et %MW.

Enfin, en passant à la programmation avec Python, commencez par une seule instruction de lecture avant de tester l'écriture !
Ne pouvez-vous pas paramétrer unit_id au niveau de l'initialisation de ModbusClient plutôt qu'à chaque appel de fonction de lecture/écriture ?
+ 1 , cela fonctionne sur toute la gamme M221, 241, 251

Chat GPT te fait cela en lui demandant gentiment ;)
On perd sa vie à vouloir bien la gagner... 8-)
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7806
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par itasoft »

Slts,
Rectificatif, j’avais compris qu’il voulait taper du code Python dans le M221.
Le M221 fait ModBus tcp/ip Client/Serveur c’est écris en gros sur la Doc.
Automaticien privé (de tout)
itasoft@free.fr
MiGaNuTs
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1577
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret
Contact :

Re: [M221] Puis-je contrôler le Schneider Electric M221 avec python ?

Message par MiGaNuTs »

Enfin bon, la seule chose que tu peut faire c'est lire ou/et écrire des trucs dans une partie de sa mémoire, si l'automate t'y autorise.
Tu le fait en python comme tu pourrait le faire avec n'importe quel autre langage, et avec un M221 comme tu pourrait avoir n'importe quel autre automate (a condition qu'il supporte le MODBUS(Et les fonctions read/write register)).
A aucun moment tu contrôle ce que l'automate en fait. (et encore heureux).
Du coup on en est toujours au même point :
itasoft a écrit : 03 juil. 2023, 14:43 NON
Si tu veux piloter directement les sorties du M221 sans mettre de programme dedans, c'est possible, mais pas en modbus.
Il faut le faire en EtherNet/IP. Y'a le fichier eds qui est fourni directement avec le M221.(mais c'est un peu relou de le récupérer via son serveur web intégré).
Après, comment on exploite un fichier .eds en Python, j'en ai pas la moindre idée. Je suis pas persuadé que ce soit plus simple que de programmer directement l'automate pour qu'il fasse ce dont on a besoin. Par contre je suis a peu près sûr que c'est plus lent et moins fiable.
Répondre