Archives par mot-clé : Python

Python-Snap7 / MQTT Gateway

Bonjour,

De l’acquisition de données automate

Devenu Data Scientist depuis la fin de l’année dernière, (yeah !), j’essaie de m’améliorer en Python, ce langage faisant partie du bagage qu’un Data Scientist se doit de posséder, tout en réalisant quelque chose de réutilisable dans le contexte Industrie 4.0.

L’acquisition des données fournit la matière première de la Data Science.
Il est donc essentiel de pouvoir accéder aux données des automates, ceux-ci concentrant des données issues des capteurs et actionneurs, mises en forme (mise à l’échelle, calculs divers…), ainsi que des données process, comptage (de produits consommés ou délivrés, de cycles, d’énergie…), défauts et alarmes…

Bien sûr, il est nécessaire d’une part de pouvoir y accéder, connexion au réseau et autorisation au niveau configuration de l’automate, et d’autre part d’avoir une connaissance du programme de l’automate pour déterminer les adresses des données qui nous intéressent.

Snap7

J’ai déjà eu l’occasion de mettre en œuvre la librairie Snap7 et le « binding Ada » comme indiqué ici.
Cette superbe librairie permet de communiquer avec les automates SIEMENS de la série 7 et d’accéder ainsi aux données de ces automates.

Il existe un « wrapper » Python pour cette librairie, Python-Snap7, qui permet donc de l’utiliser depuis un programme en Python.

Aussi, il m’a paru intéressant de réaliser un exemple de passerelle Python-Snap7 vers MQTT.

Manipulation

Cette manipulation utilise le même matériel que la démo en Ada :
https://demo.ada4automation.org/app3.html
https://a4a-k0-s7.demo.ada4automation.org/

On a donc une CPU SIEMENS S7 315-2 DP sur laquelle on a installé une passerelle Hilscher netLINK NL 50-MPI qui permet d’y accéder en Ethernet selon le protocole ISO on TCP (RFC 1006).

Cette passerelle netLINK est configurée avec une adresse IP fixée à 192.168.253.240 et la CPU a une adresse MPI fixée à 3.
102 est le port par défaut en ISO on TCP

Ces informations sont nécessaires pour l’établissement de la connexion :

snap7_client.connect("192.168.253.240", 0, 3, 102)

Le broker mosquitto est installé sur la même machine et donc :

broker_address = "localhost"
...
mqtt_client.connect(broker_address)

On a également défini quelques topics MQTT correspondants aux données que l’on souhaite remonter.

Une structure pour les informations de la CPU :

ps7/s7-315-2dp/cpu_info

Et des topics pour les variables de l’automate DB1.DBW0 pour un mot de DB, EW0 pour un mot d’entrée, AW0 pour un mot de sortie, MW0 pour un mot de mémento :

ps7/s7-315-2dp/db1.dw0
ps7/s7-315-2dp/ew0
ps7/s7-315-2dp/aw0
ps7/s7-315-2dp/mw0

Pour tester, on utilise le client mosquitto_sub.

Pour des topics individuels :

mosquitto_sub -h localhost -t ps7/s7-315-2dp/db1.dw0 \
                           -t ps7/s7-315-2dp/ew0 \
                           -t ps7/s7-315-2dp/aw0 \
                           -t ps7/s7-315-2dp/mw0 -v

Ou tous les topics d’une branche :

mosquitto_sub -h localhost -t ps7/s7-315-2dp/# -v
mosquitto_sub -h localhost -t ps7/s7-315-2dp/cpu_info/# -v

Passerelle vers MQTT

Et c’est fait !

Vous pouvez y trouver dans le dépôt GitLab :
https://gitlab.com/ada-for-automation/python/snap7/snap7-mqtt

Avec les passerelles Modbus TCP (ou RTU) vers MQTT et Hilscher cifX vers MQTT dont il a déjà été question, cela permet de collecter beaucoup de données depuis des installations industrielles.

Bien sûr, il vous faudra mettre un peu du vôtre pour analyser le programme automate et déterminer les adresses des variables qui vous intéressent.

Voire même vous aurez peut-être à modifier le programme afin d’optimiser l’accès à ces données en les regroupant, par exemple dans un bloc de données (DB), une grosse requête étant préférable à de nombreuses petites.

Il peut être utile aussi de regrouper les données par type (entier, réel…), ce qui peut optimiser les traitements.

Il vous faudra aussi définir les topics MQTT selon une hiérarchie qui dépend bien sûr de votre analyse.

Enfin, le code fourni n’est qu’un exemple, un point de départ.
Il faudra vous l’approprier et le faire évoluer en fonction de vos besoins.

Pourquoi vers MQTT

MQTT est un protocole très utilisé et pour lequel il existe de nombreuses ressources, libres et commerciales.

Il a déjà fait l’objet de quelques articles précédemment. Il sera alors possible d’envisager des solutions mettant en œuvre Node-RED, InfluxDB, Grafana…

Le code fourni est indépendant de la plateforme matérielle, c’est du Python. Il tournera aussi bien sur un PC Windows que sur un Raspberry Pi.

Cependant, Hilscher fournit des solutions matérielles industrielles qui trouveront facilement place dans vos armoires électriques.

netFIELD Cloud

Le broker MQTT est un élément central de la panoplie cloud de Hilscher où il est utilisé comme un bus de données.

Les applications conteneurisées clientes MQTT communiquent entre elles via le broker Mosquitto comme décrit ici.

Vous pouvez retrouver toute la documentation relative à Industrie 4.0 / IIoT dans la base de connaissance Hilscher ici.

Parmi les applications Hilscher disponibles aujourd’hui, le « Platform Connector » permet de sélectionner les données du bus MQTT et de les mettre à disposition du cloud Hilscher, afin par exemple de les visualiser.
Cf. le chapitre « Dashboard Manager » dans la documentation.

Et ensuite ?

Dans un prochain épisode, je me propose de créer une image Docker Python, d’instancier un conteneur pour y exécuter ce script en le connectant au broker MQTT et envoyer les données au Cloud Hilscher pour les visualiser.

Cordialement,
Stéphane