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 :
=======================================
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