TP Modbus TCP avec Python: Communication Industrielle et Programmation

Telechargé par alaa.dib
TP : Communication Modbus TCP avec Python
1. Objectifs pédagogiques
- Comprendre le fonctionnement de Modbus TCP.
- Savoir utiliser un client Python pour lire et écrire des registres.
- Manipuler un serveur Modbus simulé.
- Analyser les valeurs reçues et vérifier la cohérence du protocole.
2. Matériel nécessaire
- Un PC par élève (ou des groups de 2).
- Python 3 installé.
- Bibliothèque pyModbusTCP installée.
- Serveur Modbus fourni par l’enseignant.
3. Description du système simulé
Le serveur Modbus simule trois capteurs industriels et un capteur TOR :
- HR0 : Température ×10 (ex : 235 = 23,5 °C)
- HR1 : Pression ×100 (ex : 123 = 1,23 bar)
- HR2 : Niveau (%) ×10 (ex : 550 = 55 %)
- Coil 0 : Capteur TOR (1 si température > 27 °C)
4. Travail demandé
1. Modifier dans le script client l’adresse IP du serveur fournie par l’enseignant.
2. Exécuter le client Python et observer les valeurs affichées.
3. Noter les variations de température, pression et niveau.
4. Vérifier à quel moment la sortie TOR passe à 1.
5. Ajouter une condition Python affichant une alarme lorsque la température dépasse 28 °C.
5. Questions
1. Quelle est la structure d’une trame Modbus TCP ?
2. Pourquoi le protocole utilise-t-il TCP ?
3. Quelle serait la différence avec Modbus RTU ?
4. Comment pourrait-on écrire une valeur dans un registre du serveur ?
6. Travail à rendre
- Le script Python modifié.
- Une capture d’écran montrant les valeurs lues.
- Une courte explication du comportement de la sortie TOR.
from pyModbusTCP.client import ModbusClient
import time
# -----------------------------
# Paramètres du serveur Modbus
# -----------------------------
# À adapter selon l'adresse IP du PC du professeur
SERVER_IP = "127.0.0.1" # ou l'IP de la machine serveur, ex : "192.168.1.10"
SERVER_PORT = 5020 # même port que le serveur
def lire_capteurs(client: ModbusClient):
"""
Lit les valeurs simulées :
- HR0 : Température * 10 (ex : 235 => 23,5 °C)
- HR1 : Pression * 100 (ex : 123 => 1,23 bar)
- HR2 : Niveau % * 10 (ex : 550 => 55,0 %)
- Coil 0 : capteur TOR (0 ou 1)
"""
# Lecture de 3 registres à partir de l'adresse 0
hr_vals = client.read_holding_registers(0, 3)
# Lecture de 1 coil à partir de l'adresse 0
coil_vals = client.read_coils(0, 1)
if (hr_vals is None) or (coil_vals is None):
print("󼤑 Erreur de lecture Modbus (aucune réponse du serveur).")
return
# Extraction des valeurs
# Affichage formaté
def main():
# Création du client Modbus
client = ModbusClient(
host=SERVER_IP,
port=SERVER_PORT,
auto_open=True, # ouvre la connexion automatiquement à la première requête
auto_close=False # reste connecté
)
print(f"Tentative de connexion au serveur Modbus TCP {SERVER_IP}:{SERVER_PORT} ...")
try:
while True:
# Si la connexion n'est pas ouverte, on tente de l'ouvrir
if not client.is_open:
if not client.open():
print("󼞴󼞵󼞶 Connexion impossible au serveur, nouvelle tentative dans 2
secondes...")
time.sleep(2)
continue
else:
print("󶢇󼜲 Connecté au serveur Modbus.")
# Lecture et affichage des valeurs
lire_capteurs(client)
# Période d'échantillonnage (en secondes)
time.sleep(1)
except KeyboardInterrupt:
print("\nInterruption par l'utilisateur (Ctrl+C).")
finally:
# Fermeture propre de la connexion
if client.is_open:
client.close()
print("Client Modbus arrêté.")
if __name__ == "__main__":
main()
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!