Archives par mot-clé : Python

Python-Snap7 / CSV / Pandas / Matplotlib

Bonjour,

Introduction

Je continue mes expériences en Python avec Snap7.

Les deux articles précédents montraient comment accéder aux données d’automates SIEMENS S7 grâce à Snap7 et les partager via MQTT, éventuellement dans le cloud Hilscher netFIELD.

A partir du moment où les données sont disponibles au niveau du broker MQTT, toutes sortes d’applications peuvent être envisagées comme par exemple de la surveillance avec un tableau de bord réalisé avec le combo InfluxDB + Grafana et Telegraph avec le plugin MQTT.

J’ai déjà eu l’occasion de jouer avec. Aussi j’avais envie de faire autre chose.

Courbe de tendance

Pour afficher une courbe de tendance, point n’est besoin de stocker les données. On les affiche en temps réel et un simple tampon est nécessaire en fonction de la durée affichée.

J’ai fourni un tel exemple avec Bokeh et Modbus TCP dans l’article suivant. Je m’amuserai sans aucun doute à en refaire un avec Snap7 un jour prochain.

Courbe d’historique

Afficher une courbe d’historique nécessite bien sûr de stocker les données d’une façon ou d’une autre, par exemple dans InfluxDB, mais on peut aussi faire à l’ancienne, dans des fichiers textes dans lesquelles les valeurs sont écrites de façon lisible, j’ai nommé les fichiers CSV.

Fichiers CSV

L’avantage est de pouvoir utiliser ces fichiers très facilement avec n’importe quelle application telle qu’un éditeur de texte, une feuille de calcul Libre Office ou Excel ou la librairie Python Pandas.

Python-Snap7 to CSV Writer

Je vous présente donc un petit script Python qui, comme le script précédent, va lire les données d’un automate SIEMENS S7 et les écrit dans des fichiers CSV au lieu de les envoyer au broker MQTT.

J’ai créé un dépot pour celui-ci :
https://gitlab.com/ada-for-automation/python/snap7/snap7-csv

Le script se connecte à l’automate et dans une boucle lit les quelques données nécessaires à mon exemple, les ajoute au fichier CSV avec un horodatage jusqu’à interruption de l’utilisateur.

Il crée un fichier par jour, qui fait grosso modo un peu moins de 4 Mo dans mon cas, et le compresse avec un ratio de 1/3 avant de l’effacer.

Matplotlib Reader

Bien sûr, il me fallait un exemple d’utilisation.

La librairie Pandas permet de lire le fichier CSV. Le script Matplotlib_read lit donc un fichier précédemment généré, affiche quelques informations et nous génère une belle courbe à mettre par exemple dans votre rapport de production.

On a effectué une sélection parmi les données selon une date et heure de début et une date et heure de fin.

Voici une trace de l’exécution :

(venv) slos@nexcom-debian:~/Python/Snap7/Snap7-CSV$ python Matplotlib_read.py
=======================================
  Matplotlib Read CSV Main !  
=======================================


df information :

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 71097 entries, 2024-03-13 01:00:01.277726 to 2024-03-14 00:59:58.989752
Data columns (total 4 columns):
 #   Column    Non-Null Count  Dtype
---  ------    --------------  -----
 0   db1_dbw0  71097 non-null  int64
 1   ew0       71097 non-null  int64
 2   aw0       71097 non-null  int64
 3   mw0       71097 non-null  int64
dtypes: int64(4)
memory usage: 2.7 MB
None

df head :

                            db1_dbw0    ew0   aw0    mw0
TimeStamp                                              
2024-03-13 01:00:01.277726     17441  29754 -6008  25173
2024-03-13 01:00:02.551340     17453  29874 -5768  25186
2024-03-13 01:00:03.734842     17465  30004 -5528  25198
2024-03-13 01:00:04.913253     17477  30124 -5288  25209
2024-03-13 01:00:06.178533     17489  30244 -5048  25222
2024-03-13 01:00:07.349238     17502  30364 -4808  25234
2024-03-13 01:00:08.528571     17513  30484 -4568  25245
2024-03-13 01:00:09.764152     17525  30604 -4328  25258
2024-03-13 01:00:10.948696     17538  30724 -4088  25270
2024-03-13 01:00:12.149329     17549  30844 -3848  25282

df tail :

                            db1_dbw0    ew0    aw0    mw0
TimeStamp                                                
2024-03-14 00:59:47.964036     29372  18002 -29532 -28432
2024-03-14 00:59:49.216738     29384  18122 -29292 -28419
2024-03-14 00:59:50.445935     29397  18242 -29032 -28407
2024-03-14 00:59:51.637861     29409  18372 -28792 -28395
2024-03-14 00:59:52.892681     29421  18492 -28552 -28382
2024-03-14 00:59:54.144326     29434  18612 -28292 -28370
2024-03-14 00:59:55.330005     29446  18732 -28052 -28358
2024-03-14 00:59:56.582545     29458  18862 -27812 -28345
2024-03-14 00:59:57.810606     29471  18982 -27552 -28333
2024-03-14 00:59:58.989752     29483  19102 -27332 -28321

df_sel information:


df_sel head :

                            db1_dbw0    ew0   aw0    mw0
TimeStamp                                              
2024-03-13 03:00:00.160961     23896  28768 -7980  31628
2024-03-13 03:00:01.427324     23908  28898 -7720  31641
2024-03-13 03:00:02.599103     23921  29018 -7480  31653
2024-03-13 03:00:03.812494     23933  29138 -7260  31665
2024-03-13 03:00:05.085449     23945  29268 -7000  31678
2024-03-13 03:00:06.256244     23958  29388 -6760  31689
2024-03-13 03:00:07.473895     23969  29508 -6520  31702
2024-03-13 03:00:08.728504     23982  29628 -6260  31714
2024-03-13 03:00:09.906623     23994  29748 -6020  31726
2024-03-13 03:00:11.156101     24006  29868 -5780  31738

df_sel tail :

                            db1_dbw0   ew0    aw0   mw0
TimeStamp                                              
2024-03-13 05:59:48.402080       711 -6474 -12928  8443
2024-03-13 05:59:49.664296       723 -6344 -12688  8456
2024-03-13 05:59:50.910385       736 -6224 -12428  8468
2024-03-13 05:59:52.090771       748 -6104 -12188  8480
2024-03-13 05:59:53.340047       760 -5984 -11948  8492
2024-03-13 05:59:54.592650       772 -5854 -11708  8505
2024-03-13 05:59:55.785718       785 -5734 -11468  8517
2024-03-13 05:59:57.038224       797 -5614 -11208  8529
2024-03-13 05:59:58.265424       809 -5484 -10968  8542
2024-03-13 05:59:59.438356       821 -5364 -10728  8553

Et on obtient une jolie courbe !

Cordialement,
Stéphane