J'avais déjà posté sur ce sujet il y a quelques temps, j'ai un peu avancé mais je me trouve confronté à un problème qui dépasse ma compréhension.
En résumé, j'ai d'un côté mon Modicon M221 qui est configuré comme client modbus TCP, et de l'autre un PC qui me sert à faire des tests. J'ai configuré un bloc modbus TCP, et de ce côté tout semble fonctionner correctement :

De l'autre côté, j'ai programmé en Python un petit utilitaire me permettant de créer un serveur Modbus TCP, de récupérer les trames et de les afficher dans l'invité de commande, dans un but de test (à terme les trames seront inscrites dans une base de données et exploitées depuis l'ERP de mon entreprise).
Voici le code du programme :
Mon programme semble fonctionner, le PLC ne me renvoie pas d'erreur, et lorsque je regarde avec Wireshark mes trames sont effectivement bien reçues par mon serveur :from pyModbusTCP.server import ModbusServer
import threading
import time
# Créer et démarrer le serveur
server = ModbusServer("0.0.0.0", 502, no_block=True)
server.start()
previous_values = []
current_values = []
def log_activity():
____previous_values = server.data_bank.get_holding_registers(620, 657)
____while True:
________current_values = server.data_bank.get_holding_registers(620, 657)
________if current_values != previous_values:
____________print(f"Valeurs mises à jour : {current_values}")
____________previous_values = current_values
________time.sleep(0.1) # Pause très courte pour éviter une surcharge CPU
# Créer un thread pour lire les registres
activity_thread = threading.Thread(target=log_activity)
activity_thread.daemon = True # Arrête le thread quand le programme principal se termine
activity_thread.start()
try:
____while True:
________time.sleep(1) # Le thread de lecture des registres fonctionne en arrière-plan
except KeyboardInterrupt:
____print("Arrêt du serveur Modbus TCP...")
____server.stop()

Cependant, le contenu des trames, les mots, ne semblent pas correspondre entre les valeurs enregistrées dans l'automate et celles reçues par mon PC :

Voilà ce que j'ai du côté de mon automate.

Et voilà les valeurs avec lesquelles je me retrouve sur Wireshark.
A chaque fois que j'ai un changement de valeur, mes valeurs s'affichent dans l'invité de commande. Elles correspondent à celles que j'obtiens sur Wireshark, par contre j'ai plein de valeurs "parasites", toutes égales à 0, alors que je suis censé avoir seulement 38 mots :
Voilà ce que j'obtiens dans mon invité de commande, je ne comprends d'ou viennent ces centaines de 0.Valeurs mises à jour : [0, 0, 1000, 0, 39322, 16837, 0, 17530, 0, 17530, 0, 16288, 0, 17116, 0, 49024, 0, 0, 0, 16928, 0, 17530, 0, 17530, 0, 0, 0, 0, 1, 0, 0, 0, 1000, 0, 0, 0, 1100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Si quelqu'un a déjà mené un projet similaire et/ou est un expert en Python je veux bien de l'aide parce que je sèche, je ne suis pas développeur, c'est dans le cadre d'un projet étudiant, et là on sort clairement de mon domaine de compétences :/
Merci d'avance
Léal

