Page 1 sur 2

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

Posté : 03 juil. 2023, 14:34
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()

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

Posté : 03 juil. 2023, 14:43
par itasoft
NON

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

Posté : 03 juil. 2023, 14:44
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

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

Posté : 03 juil. 2023, 14:47
par Charles2a
itasoft a écrit : 03 juil. 2023, 14:43 NON
Au moins ça a le mérite d'être clair :lol:

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

Posté : 03 juil. 2023, 14:48
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

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

Posté : 03 juil. 2023, 16:08
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

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

Posté : 04 juil. 2023, 08:06
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 ?

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

Posté : 04 juil. 2023, 08:59
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 ;)

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

Posté : 04 juil. 2023, 09:34
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.

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

Posté : 04 juil. 2023, 10:07
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.