Connexion Schneider M340 / M221 / M241 au cloud via Modbus TCP

Ce guide couvre la configuration complète pour connecter les automates Schneider de la gamme Modicon à la plateforme Eziwan : M340 (BMX P34), M221, M241, M251 et M262. Chaque gamme a ses spécificités de configuration.


Tableau de compatibilité Schneider

Gamme M340 (BMX P34)

CPUFirmware%MW accessiblesModule ETHUnit ID CPU
BMX P34 1000≥ 2.300..1023 (1 024 mots)BMX NOE ou module ETH255
BMX P34 2010≥ 2.300..9999 (10 000 mots)ETH intégré255
BMX P34 2020≥ 2.300..9999ETH intégré255
BMX P34 2030≥ 2.300..9999ETH intégré255

Gamme M221 (TM221)

CPUFirmware%MW accessiblesUnit ID
TM221CE16R≥ 1.00..99991
TM221C16T≥ 1.00..99991
TM221ME16R (Ethernet)≥ 1.00..99991
TM221M16R (+ module ETH)≥ 1.00..99991

Gamme M241 (TM241)

CPUFirmware%MW accessiblesUnit ID
TM241CE40R≥ 1.00..99991
TM241CE40T≥ 1.00..99991
TM241C40R (+ module TMBM)≥ 1.00..99991

Gamme M251 et M262

CPUFirmwareProtocolesUnit ID
TM251MESE≥ 1.0Modbus TCP, EtherNet/IP1
TM262M15MESS8T≥ 1.0Modbus TCP, EtherNet/IP, MQTT natif1
astuce

Le M262 dispose d'un client MQTT natif — Eziwan peut recevoir directement les données publiées par le M262 sans passer par le polling Modbus. Contact le support Eziwan pour la configuration MQTT.


Configuration EcoStruxure — Gamme M340

Activer le serveur Modbus TCP sur BMX P34

Dans EcoStruxure Control Expert (Unity Pro) :

  1. Vue structurelle → double-clic sur la CPU BMX P34 xxxx
  2. Onglet "Configuration" → cliquer sur l'interface Ethernet (ETH 1 ou module NOE)
  3. Onglet "Services" → cocher "Modbus Server"
  4. Port : 502 (ne pas modifier sauf contrainte)
  5. Onglet "Adresses Ethernet" → saisir l'IP statique

Paramètres avancés (firmwares récents) :

  • Timeout connexion inactive : augmenter à 120s (défaut 30s) pour les connexions longues
  • Filtrage IP (firmware ≥ 2.60) : restreindre l'accès à l'adresse IP de la gateway Eziwan

Module BMX NOE 0100 / BMX NOE 0110

Pour les M340 avec module Ethernet externe :

ParamètreBMX NOE 0100BMX NOE 0110
Débit10/100 Mbit10/100 Mbit
I/O ScannerNonOui
Serveur ModbusOuiOui
ConfigurationVia CPU PropertiesVia module Properties
Unit IDConfigurableConfigurable
attention

Sur le BMX NOE 0110, le serveur Modbus TCP peut avoir un Unit ID différent de 255. Vérifier la configuration du module dans EcoStruxure et utiliser le Unit ID configuré dans Eziwan.


Configuration EcoStruxure — Gammes M221 / M241

SoMachine / EcoStruxure Machine Expert

La configuration Modbus TCP sur M221 et M241 se fait dans EcoStruxure Machine Expert (anciennement SoMachine) :

  1. Configuration → onglet "Ethernet"
  2. Saisir l'IP statique et le masque
  3. Configuration → onglet "Modbus TCP Slave" (ou "Modbus TCP Servant")
  4. Cocher "Enabled"
  5. Port : 502
  6. Unit ID : 1 (défaut sur M221/M241 — différent du M340 !)

Différence fondamentale M340 vs M221/M241

ParamètreM340 (BMX P34)M221 / M241 (TM2xx)
Unit ID par défaut2551
Logiciel de configEcoStruxure Control ExpertEcoStruxure Machine Expert
%MW max10 000 (CPU >= 2010)9 999
Serveur ModbusActivé dans propriétés CPUActivé dans config Ethernet
attention

C'est le piège le plus courant : si vous configurez Eziwan avec Unit ID 255 sur un M221 ou M241, la connexion échoue avec une exception Modbus ou un timeout. Utiliser Unit ID 1 sur M221/M241.


Adressage des registres Modbus par gamme

M340 — Correspondance %MW ↔ Registre Modbus

Variable EcoStruxure │ Adresse Modbus │ Type Modbus
─────────────────────────────────────────────────────
%MW0 │ 0 │ Holding Register (FC=03)
%MW100 │ 100 │ Holding Register
%MWn │ n │ (direct, 0-based)
%QW0.0 │ 0 │ Input Register (FC=04) *
%IW0.0 │ 0 │ Discrete Input (FC=02) *
%Q0.0 à %Q0.7 │ bit 0 à 7 │ Coil (FC=01)

*La correspondance exacte des entrées/sorties analogiques dépend de la configuration matérielle.

M221 / M241 — Correspondance %MW ↔ Registre Modbus

La correspondance est identique au M340 : %MWn correspond à l'adresse Modbus n.


Gestion des types de données avancés

Variables REAL (flottant 32 bits) sur 2 registres

Une variable REAL dans Unity Pro / EcoStruxure occupe deux %MW consécutifs en IEEE 754 :

Variable REAL "Temperature" stockée à %MW100 :
%MW100 : mot de poids fort (MSW, octets A et B)
%MW101 : mot de poids faible (LSW, octets C et D)
Ordre : ABCD (big-endian par défaut sur M340/M221/M241)

Type Eziwan à configurer : float32_abcd

Si les valeurs sont incorrectes (facteur d'erreur constant) : Essayer float32_cdab (little-endian par registre). Certains projets Unity Pro utilisent la fonction DWORD_TO_REAL avec un ordre différent.

Variables DINT / UDINT (entier 32 bits) sur 2 registres

Variable DINT "Compteur" à %MW200 :
%MW200 : partie haute (MSW)
%MW201 : partie basse (LSW)
Type Eziwan : int32_abcd

Compactage de booléens dans un %MW

Pour minimiser le nombre de requêtes Modbus, regrouper les états booléens dans un mot mémoire :

(* EcoStruxure Control Expert — Programme *)
(* Regroupement de 16 états dans %MW300 *)

%MW300 := 0; (* Remise à zéro *)
IF %Q0.0 THEN %MW300 := %MW300 OR 16#0001; END_IF; (* Pompe 1 *)
IF %Q0.1 THEN %MW300 := %MW300 OR 16#0002; END_IF; (* Pompe 2 *)
IF %I0.5 THEN %MW300 := %MW300 OR 16#0004; END_IF; (* Défaut P1 *)
IF %I0.6 THEN %MW300 := %MW300 OR 16#0008; END_IF; (* Défaut P2 *)
IF %M10 THEN %MW300 := %MW300 OR 16#0010; END_IF; (* Alarme *)

Avec cette technique, 16 booléens se lisent avec 1 requête Modbus (FC=03, 1 registre).


Organisation recommandée des %MW pour supervision

Pour maximiser l'efficacité des requêtes (grouping automatique par Eziwan) :

Zone %MW0 à %MW9 : Consignes opérateur (setpoints modifiables)
Zone %MW10 à %MW49 : Mesures analogiques simples (int16 ×10)
Zone %MW50 à %MW99 : Mesures analogiques double (REAL sur 2 registres)
Zone %MW100 à %MW149 : Compteurs 16 bits
Zone %MW150 à %MW199 : Compteurs 32 bits (DINT, 2 registres chacun)
Zone %MW200 à %MW249 : États machine (bitfields)
Zone %MW250 à %MW299 : Codes défaut
Zone %MW300 à %MW349 : Paramètres constructeur (lecture seule pour client)

Test de connexion

Test depuis Python

from pymodbus.client import ModbusTcpClient
import struct

def tester_connexion_schneider(ip: str, unit_id: int = 255):
"""
Test de connexion Modbus TCP.
unit_id : 255 pour M340, 1 pour M221/M241
"""
client = ModbusTcpClient(ip, port=502, timeout=3)

if not client.connect():
print(f"✗ Connexion TCP impossible à {ip}:502")
return

print(f"✓ Connexion TCP établie → {ip}:502 (Unit ID {unit_id})")

# Test lecture %MW100 à %MW109
result = client.read_holding_registers(
address=100, count=10, slave=unit_id
)

if not result.isError():
print(f"✓ Modbus FC=03 OK — %MW100 à %MW109 : {result.registers}")

# Décodage float32 si %MW100+101 contient un REAL (test)
if len(result.registers) >= 2:
raw = struct.pack(">HH", result.registers[0], result.registers[1])
float_val = struct.unpack(">f", raw)[0]
if abs(float_val) < 1e6: # Valeur plausible ?
print(f" → Si %MW100-%MW101 est un REAL : {float_val:.2f}")
else:
exc = getattr(result, 'exception_code', '?')
print(f"✗ Erreur Modbus FC=03 — exception code: {exc}")

# Diagnostics selon le code
messages = {
1: "FC non supporté → serveur Modbus non activé",
2: "Adresse invalide → plage %MW dépassée (M340 1000: max 1024)",
3: "Valeur invalide → count trop grand",
4: "Erreur serveur → serveur non initialisé, CPU en STOP",
6: "Serveur occupé → trop de connexions simultanées",
}
if exc in messages:
print(f" Diagnostic : {messages[exc]}")

client.close()

# Tests
tester_connexion_schneider("192.168.1.20", unit_id=255) # M340
tester_connexion_schneider("192.168.1.30", unit_id=1) # M221/M241

Dépannage étendu

SymptômeCause probableSolution
Connexion TCP refuséeServeur Modbus non activéVérifier "Modbus Server" dans EcoStruxure
Connexion TCP refuséeRéseau mal configuréPinger l'automate depuis un PC sur le même réseau
Exception 02 (adresse invalide)BMX P34 1000 — adresse > 1023Décaler la zone de supervision entre 0 et 1023
Exception 06 (serveur occupé)Trop de clients connectésFermer les connexions SCADA locales inutilisées
Unit ID incorrectM221/M241 avec Unit ID 255Changer en Unit ID 1 dans la config Eziwan
Valeurs toutes à 0Variables non affectées dans programmeVérifier que %MW100+ sont alimentés par le programme
REAL incorrectOrdre octets CDAB au lieu de ABCDEssayer float32_cdab dans Eziwan
Déconnexion toutes les 30sTimeout inactif par défaut M340Augmenter "inactive timeout" à 120s dans EcoStruxure
Module NOE non répondantIP du module différente de la CPUUtiliser l'IP du module NOE, pas celle de la CPU
Registres %IW et %QW inaccessiblesFC=04 ou FC=01 requis, pas FC=03Utiliser les FC appropriés ou copier dans des %MW

👉 Ressources complémentaires

Questions fréquentes

Quels automates Schneider sont compatibles ?

Toute la gamme Modicon communicante en Modbus TCP : M221, M241, M251, M340, M580, ainsi que les Premium et Quantum équipés de coupleurs Ethernet. Les gammes série (Twido, TSX) passent par le port RS-485 de la gateway.

Faut-il modifier le programme de l'automate ?

Non pour la lecture des données : la gateway interroge les mots %MW existants en Modbus TCP. Seule l'écriture éventuelle de consignes peut nécessiter de réserver une plage de mots dédiée dans le programme.

Quel port réseau doit être accessible ?

Le port Modbus TCP 502, uniquement sur le réseau local entre la gateway et l'automate. Rien n'est exposé sur Internet : la gateway établit un tunnel VPN sortant vers le cloud.

Comment diagnostiquer une liaison qui ne monte pas ?

Vérifiez dans l'ordre : ping de l'automate depuis la gateway, port 502 ouvert (pas de firewall local), Unit ID correct, et adressage %MW aligné (offset 0 vs 1 selon les outils). La console Eziwan affiche les trames et codes d'exception Modbus en temps réel.

Ressources associées