L'intégration Siemens S7 MQTT permet à un S7-1200 ou à un S7-1500 de publier ses données process directement vers des tableaux de bord, des historians, des applications cloud ou un jumeau numérique de la ligne, sans serveur SCADA intermédiaire. Dans ce tutoriel, vous comparerez les deux approches réalistes, la bibliothèque LMQTT native de l'automate et une passerelle externe, puis vous construirez une passerelle Python fonctionnelle qui lit un bloc de données et le publie vers un broker MQTT en TLS. Vous terminerez avec une structure de topics testée et une checklist pour passer en production.
Deux façons de faire du Siemens S7 MQTT
Les automates S7 ne parlent pas MQTT nativement comme ils parlent la communication S7, PROFINET ou OPC UA. Vous avez deux options réalistes.
Option 1 : un client MQTT dans l'automate. Siemens fournit pour TIA Portal une bibliothèque gratuite, généralement appelée LMQTT, qui implémente un client MQTT 3.1.1 au-dessus des blocs d'open user communication (TCON, TSEND, TRCV). L'automate ouvre lui-même une connexion TCP ou TLS vers le broker et publie. Des variantes de cette approche existent aussi sur les processeurs de communication et les équipements edge Siemens.
Option 2 : une passerelle externe. Un petit PC industriel, un équipement edge ou un conteneur lit les tags de l'automate via la communication S7 (PUT/GET) ou le serveur OPC UA de l'automate, et les publie en MQTT. Le programme automate ne change pas, ou très peu.
| Critère | LMQTT dans l'automate | Passerelle externe |
|---|---|---|
| Matériel supplémentaire | Aucun | PC industriel, équipement edge ou VM |
| Modifications du programme automate | Oui : appels de FB, buffers, construction du JSON | Aucune ou minimes |
| Impact sur le temps de cycle | Faible mais réel ; la manipulation de chaînes est coûteuse | Aucun |
| TLS | Pris en charge sur les firmwares récents, avec certificats dans TIA Portal | Géré par l'OS et la bibliothèque de la passerelle |
| Mise en forme du payload | Construite en SCL, outils de chaînes limités | N'importe quel format, JSON ou Sparkplug faciles |
| Stockage et retransmission (store-and-forward) | Limité par la mémoire de l'automate | Buffer sur disque dans la passerelle |
| Qui la maintient | L'automaticien | L'équipe IT/OT ou logicielle |
| Idéal pour | Peu de signaux, pas de boîtier supplémentaire autorisé | Beaucoup de signaux, beaucoup d'automates, logique plus riche |
Si vous n'avez besoin que de quelques dizaines de valeurs d'un seul automate et qu'ajouter du matériel est difficile, LMQTT est intéressant. Si vous connectez une ligne ou une usine, l'approche passerelle passe mieux à l'échelle et laisse l'automate se consacrer à la commande. Les compromis d'architecture sont abordés plus largement dans connectivité des automates vers le cloud.
Option 1 : la bibliothèque native LMQTT
Dans TIA Portal, la démarche est la suivante :
- Téléchargez la bibliothèque LMQTT et sa documentation depuis Siemens Industry Online Support et ajoutez-la à votre projet en tant que bibliothèque globale.
- Faites glisser le bloc fonctionnel client dans votre programme et créez un bloc de données d'instance.
- Configurez les paramètres de connexion : nom d'hôte du broker, port, client ID, nom d'utilisateur et mot de passe, keep alive.
- Pour TLS, importez le certificat d'AC racine du broker dans le gestionnaire global de certificats de TIA Portal et affectez-le à l'automate. Un broker utilisant un certificat Let's Encrypt nécessite le certificat ISRG Root X1. Consultez la documentation de la bibliothèque pour connaître les versions minimales de firmware CPU prenant en charge l'open user communication sécurisée.
- Construisez le payload en SCL sous forme de tableau d'octets ou de chaîne, puis déclenchez une publication sur front montant avec le topic, la QoS et le flag retain.
- Surveillez les sorties d'état et d'erreur ; le bloc signale les échecs de connexion, les timeouts et les refus du broker.
Quelques leçons tirées du terrain :
- Construisez le JSON avec soin. La concaténation de chaînes en SCL est verbeuse et source d'erreurs. Gardez des payloads courts et des formats fixes, ou publiez de simples chaînes numériques sur des topics séparés.
- Déclenchez sur changement, pas à chaque cycle. Publier à chaque cycle de l'OB1 saturera le broker et les ressources de communication de l'automate. Utilisez une temporisation ou une comparaison avec bande morte.
- Surveillez le client ID. Deux automates avec le même client ID se déconnectent mutuellement en boucle. Sur un broker MQTT managé qui lie les client IDs aux identifiants, chaque automate a besoin de son propre jeu d'identifiants.
- Utilisez TLS dès le premier jour. Ajouter des certificats après la mise en service implique un nouveau chargement et une nouvelle fenêtre d'arrêt.
Option 2 : passerelle Python avec python-snap7
L'approche passerelle utilise python-snap7 pour lire un bloc de données via la communication S7 et paho-mqtt pour publier. Elle fonctionne sur toute machine Linux ou Windows capable d'atteindre l'automate sur le port TCP 102.
Préparer l'automate dans TIA Portal
Les CPU S7-1200 et S7-1500 bloquent par défaut les lectures S7 externes. Effectuez deux modifications puis chargez :
- Dans les propriétés de la CPU, sous Protection et sécurité, activez Permettre l'accès via la communication PUT/GET avec un partenaire distant.
- Dans les propriétés du bloc de données à lire, décochez Accès optimisé au bloc pour que les variables aient des offsets d'octets fixes.
Créez ensuite un bloc de données, par exemple DB10, avec cette structure :
| Offset | Nom | Type |
|---|---|---|
| 0.0 | Temperature | Real |
| 4.0 | Pressure | Real |
| 8.0 | MotorSpeed | Int |
| 10.0 | Running | Bool |
PUT/GET n'est pas authentifié : ne l'activez que sur un réseau segmenté où la passerelle est le seul client. Si ce n'est pas acceptable sur votre site, lisez plutôt les mêmes données via le serveur OPC UA du S7-1500, comme décrit dans le tutoriel passerelle OPC UA vers MQTT.
Installer les bibliothèques
python -m venv s7mqtt
source s7mqtt/bin/activate
pip install python-snap7 "paho-mqtt>=2.0"
Le script de la passerelle
Ce script lit le DB10 chaque seconde, applique une bande morte et ne publie que les changements significatifs. Il entretient aussi un topic de statut retenu avec un Last Will, pour que les consommateurs sachent quand la passerelle passe hors ligne.
import json
import time
import uuid
from datetime import datetime, timezone
import snap7
from snap7.util import get_real, get_int, get_bool
import paho.mqtt.client as mqtt
PLC_IP = "192.168.0.10"
RACK, SLOT = 0, 1 # les CPU S7-1200 et S7-1500 utilisent le rack 0, emplacement 1
DB_NUMBER, DB_SIZE = 10, 12
# Testez d'abord sur le broker public. Utilisez un préfixe aléatoire : l'espace public est lisible par tous.
BROKER = "broker.connectmq.com"
PORT = 1883
USE_TLS = False
USERNAME = None # production : "YOUR_USERNAME"
PASSWORD = None # production : "YOUR_PASSWORD"
CLIENT_ID = f"s7-gw-{uuid.uuid4().hex[:8]}" # production : "YOUR_CLIENT_ID"
BASE = f"connectmq/demo/{uuid.uuid4().hex[:6]}/plant1/packaging/line2/filler"
DEADBANDS = {"temperature": 0.2, "pressure": 0.05, "motor_speed": 5}
def read_plc(plc):
data = plc.db_read(DB_NUMBER, 0, DB_SIZE)
return {
"temperature": round(get_real(data, 0), 2),
"pressure": round(get_real(data, 4), 3),
"motor_speed": get_int(data, 8),
"running": get_bool(data, 10, 0),
}
def changed(name, new, last):
if name not in last:
return True
if isinstance(new, bool):
return new != last[name]
return abs(new - last[name]) >= DEADBANDS.get(name, 0)
def on_connect(client, userdata, flags, reason_code, properties):
print("MQTT connected:", reason_code)
client.publish(f"{BASE}/status", "online", qos=1, retain=True)
def main():
mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=CLIENT_ID)
if USERNAME:
mq.username_pw_set(USERNAME, PASSWORD)
if USE_TLS:
mq.tls_set() # le magasin d'AC du système valide le certificat Let's Encrypt
mq.will_set(f"{BASE}/status", "offline", qos=1, retain=True)
mq.on_connect = on_connect
mq.connect(BROKER, PORT, keepalive=30)
mq.loop_start()
plc = snap7.client.Client()
last = {}
last_full = 0.0
print("Publishing under", BASE)
while True:
try:
if not plc.get_connected():
plc.connect(PLC_IP, RACK, SLOT)
values = read_plc(plc)
now = time.time()
force = now - last_full > 300 # rafraîchissement complet toutes les 5 minutes
ts = datetime.now(timezone.utc).isoformat(timespec="seconds")
for name, value in values.items():
if force or changed(name, value, last):
payload = json.dumps({"value": value, "ts": ts, "quality": "good"})
mq.publish(f"{BASE}/{name}", payload, qos=1)
last[name] = value
if force:
last_full = now
except Exception as exc: # automate injoignable, mauvaise structure de DB, etc.
print("PLC read failed:", exc)
mq.publish(f"{BASE}/quality", "bad", qos=1, retain=True)
try:
plc.disconnect()
except Exception:
pass
time.sleep(5)
time.sleep(1)
if __name__ == "__main__":
main()
Voir arriver les données
Lancez le script, notez le préfixe affiché et abonnez-vous-y depuis un autre terminal :
mosquitto_sub -h broker.connectmq.com -p 1883 -i s7-watch-01 \
-t 'connectmq/demo/+/plant1/packaging/line2/filler/#' -v
Modifiez une valeur dans la table de visualisation de l'automate : le topic correspondant se met à jour en moins d'une seconde. Les valeurs qui varient moins que leur bande morte restent silencieuses, ce qui est exactement le comportement souhaité sur un réseau d'usine chargé. Le serveur MQTT public gratuit convient pour ce test, mais n'y envoyez jamais de vraies données de production.
Passer à un broker privé avec TLS
Pour la production, créez un broker privé et modifiez trois paramètres : PORT = 8883, USE_TLS = True, ainsi que le nom d'utilisateur, le mot de passe et le client ID fournis dans le portail. Comme ConnectMQ utilise un certificat Let's Encrypt, tls_set() avec le magasin d'AC du système le valide sans fichier d'AC personnalisé. Supprimez le préfixe connectmq/demo/... et utilisez un chemin ISA-95 propre comme plant1/packaging/line2/filler/temperature ; le portail ConnectMQ reconnaît les topics de style ISA-95 et affiche les équipements organisés par entreprise, site, zone et ligne.
Si vous hésitez entre faire tourner votre propre broker à côté des automates et utiliser un broker MQTT managé, demandez-vous qui le mettra à jour, renouvellera les certificats et surveillera les limites de connexions à 3 heures du matin.
Checklist de mise en production
- Un jeu d'identifiants et un client ID unique par automate ou passerelle.
- TLS sur le port 8883 ; pas de TCP en clair hors du réseau de l'usine.
- PUT/GET activé uniquement sur un réseau segmenté, ou OPC UA à la place.
- Bandes mortes dimensionnées par signal avec un rafraîchissement complet périodique.
- Topic de statut retenu avec un Last Will pour l'état en ligne et hors ligne.
- QoS 1 pour les mesures ; QoS 0 uniquement pour les données à haute fréquence dont la perte est acceptable.
- La passerelle tourne comme un service avec redémarrage automatique et journalisation.
- Les noms de topics suivent une hiérarchie ISA-95 convenue sur toutes les lignes.
Dépannage des connexions Siemens S7 MQTT
- Erreur snap7 « CLI : function refused by CPU ». PUT/GET n'est pas activé, ou la CPU n'a pas été rechargée depuis la modification.
- « Address out of range ». Le DB est plus petit que le nombre d'octets demandés, ou il est encore en accès optimisé. Vérifiez la colonne des offsets dans TIA Portal.
- Les valeurs semblent incohérentes. Les offsets sont erronés. Rappelez-vous qu'un Real occupe 4 octets, un Int 2, et que les Bool sont regroupés en bits.
- Boucle de reconnexion MQTT. Client ID en double, identifiants erronés, ou passerelle qui se connecte en TLS sur le port 1883.
- LMQTT bloqué en connexion. Le DNS n'est pas configuré sur la CPU, ou le certificat d'AC manque dans le magasin de certificats de l'automate.
Pour le reste du paysage industriel, notamment Sparkplug B, les passerelles edge et la conception de l'espace de noms, lisez le guide de l'IoT industriel avec MQTT. Vous avez aussi du matériel Rockwell ? Le tutoriel Allen-Bradley MQTT suit le même principe avec EtherNet/IP.
Connectez vos automates Siemens à ConnectMQ
Votre passerelle S7 a besoin d'un broker MQTT dans le cloud sécurisé vers lequel publier. Créez un broker Serverless gratuit sur app.connectmq.com, sans carte bancaire, copiez les identifiants générés dans le script et regardez les tags de votre automate apparaître dans l'explorateur de topics en direct.
Questions fréquentes
Un S7-1200 peut-il publier directement en MQTT ?
Oui. Grâce à la bibliothèque Siemens LMQTT, un S7-1200 ou un S7-1500 peut jouer le rôle de client MQTT. Consultez la documentation de la bibliothèque pour connaître les versions de firmware prises en charge, surtout si vous avez besoin de TLS.
Siemens S7 MQTT prend-il en charge MQTT 5 ?
La bibliothèque native de l'automate implémente MQTT 3.1.1. Si vous avez besoin de fonctions MQTT 5 comme l'expiration des messages, utilisez une passerelle externe avec une bibliothèque telle que paho-mqtt.
L'activation de l'accès PUT/GET est-elle sûre ?
PUT/GET ne comporte aucune authentification : ne l'activez que sur un réseau segmenté où la passerelle est le seul client. Sur S7-1500, le serveur OPC UA de l'automate avec authentification des utilisateurs est l'alternative la plus sûre.
Quelle QoS utiliser pour les données d'automate ?
La QoS 1 est un bon choix par défaut pour les mesures et les états. Utilisez des messages retenus pour les topics d'état, afin que les nouveaux abonnés reçoivent immédiatement la valeur courante.



