TIA Automatisches Einlesen von Csv-Dateien, HMI oder in CPU

MartinJ12

Active member
Beiträge
43
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Guten Morgen zusammen,

ich bitte erstmal um Entschuldigung, falls ich das ein oder andere nicht direkt auf Anhieb verstehe, da ich sehr unerfahren bin in der Siemenswelt.

So jetzt zu meinem Vorhaben:

Gibt es eine Möglichkeit csv-Dateien automatisch in das HMI einzulesen und dann in in Arrays aufzusplitten. Nun kommt das erste Problem, der Dateipfad ist immer der gleiche, jedoch ändert sich der Dateiname der CSV alle 7 Minuten, somit müsste man immer alle 7 Minuten eine neue Datei einlesen und die andere Datei die vorher eingelesen wurde löschen [Hintergrund sparen von Powertags]. Geht das über ein VBScript, hab hierzu keinerlei Erfahrung (komme aus der Python, C, C++, Java-Welt)? Die Dateien sollen nicht per Knopfdruck auf dem Panel eingelesen werden, sondern direkt automatisch. Die csv-Datei die eingelesen wird, kommt von einer anderen Anlage die ich nicht kenne, sprich kenne nur die Csv-Datei.

Ich kann auch keinen Code posten, da ich keinen besitze und mich wie schon gesagt nur bedingt auskenne.
Jedoch hab ich diesen Beitrag gefunden und versteh ihn leider aber nicht wirklich:
https://support.industry.siemens.co...it-simatic-s7-1200-und-s7-1500?dti=0&lc=de-DE

Vielen Dank für die Unterstützung und Hilfe.
VG, Martin
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
16.865
Punkte Reaktionen
4.949
Wo werden die Daten gebraucht? In der CPU oder in der HMI?
Was ist, wenn die HMI nicht läuft?
Was für eine HMI hast Du zur Verfügung?

Wo sind die Dateien abzuholen?
Eine S7-1200/1500 CPU kann nicht auf Dateien in einer Netzwerk-Freigabe zugreifen, sondern nur auf Dateien auf der eigenen Memorycard (SMC).

In der HMI gibt es (vermutlich) einen Aufgabenplaner, wo man alle x Minuten z.B. ein Skript aufrufen kann.
Alternativ kann man den Trigger für den Skript-Aufruf auch in der SPS-CPU erzeugen, z.B. eine Variable alle x Minuten inkrementieren.

FAQ zu VBScript in WinCC Comfort/Advanced: Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script

Harald
 
OP
M

MartinJ12

Active member
Beiträge
43
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Harald,


Folgende Bauteile werden verwendet: S7-1500 Steuerung, Simatic IFP2200 Multitouch Panel, ein IPC auf dem WinCC Advanced läuft für das Panel.

Die Dateien werden direkt auf der Runtime gebraucht, dort werden Sie dann an die Steuerung vermutlich weiter gegeben und verabeitet. Warum auf der Runtime? Und zwar sollen die immer veränderlichen Daten eingelesen, verarbeitet, ergänzt und neu heraus geprintet werden.

Darüber hab ich mir keine Gedanken gemacht, da die Anlage eigentlich 24/7 laufen soll. Klar wenn Störung ist dann nicht.

Die Dateien werden in einem Dateipfad (immer im gleichen) abgelegt und müssen hieraus gezogen werden.

Martin
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
12.961
Punkte Reaktionen
2.677
Hallo Martin,
die Entscheidung für eine PC-Runtime ist schon einmal gut - so hast du nur wenige Einschränkungen in den Möglichkeiten.
Der Dateiname muss nicht immer gleich sein wenn du immer im gleichen Verzeichnis suchst und du die Datei irgendwie identifizieren kannst oder es in diesem Verzeichnis sowieso nur DIE Datei gibt.
Es gibt in VB-Script auch eine Möglichkeit, das Inhaltsverzeichnis eines Verzeichnisses einzulesen - so kommst du dann schon zu deiner Datei.
Gleiches gilt für weitere Datei-Operationen wie Umbenennen oder Löschen.

So weit bis hierhin ...

Gruß
Larry
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
16.865
Punkte Reaktionen
4.949
Zuviel Werbung?
->Hier kostenlos registrieren
Muss hier nicht der Dateiname immer der gleiche sein damit ich diesen richtig Abfrage?
Nö, der Dateiname für OpenTextFile kann variabel/generiert sein. Der Dateiname ändert sich nach bestimmten Regeln (z.B. Uhrzeit)? Dann mit der Regel im Skript den gesuchten Dateiname generieren. Oder mit der Files-Auflistung untersuchen welche Datei(en) vorhanden sind.

Harald
 
OP
M

MartinJ12

Active member
Beiträge
43
Punkte Reaktionen
0
Das heißt ich kann einen Datentrigger in meinem VBScript schreiben, der mir alle 7-10min nach einer Datei sucht? Also Ja der Dateiname ändert sich ca. alle 7 Minuten.
Wie läuft das dann, wenn die Vorgängerdatei noch im selben Zielverzeichnis ist? Wird diese dann einfach ignoriert oder muss die verschwinden?

Gibt es ein Beispiel wie man so etwas realisieren kann? Ich kann mir zwar vorstellen was gemeint ist, jedoch wüsste ich nicht wie ich es implementieren könnte.

Die übergebenden Daten speichere ich mir dann wahrscheinlich in eine Array-Variable vom HMI-Variablenliste stimmt's?
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
16.865
Punkte Reaktionen
4.949
Der Trigger wird nicht im Skript gebildet, sondern außerhalb (weil das Skript nicht in einer Schleifen warten darf, weil nur 1 Skript gleichzeitig laufen kann), und wenn der Trigger kommt dann wird das Skript aufgerufen und läuft einmal durch.

Wenn Du mehrere Dateien im Ordner findest, dann musst Du Dir überlegen bzw. im Skript entscheiden, welche davon die richtige ist. Oder mit dem Partner absprechen, daß es da nur 1 Datei gibt, am bestem mit gleichbleibendem Dateiname.

Die Daten aus der csv-Datei zeilenweise einlesen und mit Split() zerlegen und in eine HMI-Arrayvariable (oder in viele HMI-Variablen) kopieren (evtl. über ein lokales Zwischen-Array). Am besten in Rezeptur-Variablen kopieren und dann die Rezeptur-Variablen mit SetDataRecordTagsToPLC in die SPS-CPU schreiben.

Harald
 

faust

Well-known member
Beiträge
421
Punkte Reaktionen
94
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Martin,

da du ja lt. eigener Aussage in der Hochsprachenwelt zuhause bist:

Wie würdest du denn diese Aufgabe z.B. mit Python oder Java lösen?
Meiner Meinung nach ist die eigentliche Aufgabe dann nämlich (nur noch...) die Übertragung auf die VBS-Syntax plus das zugrundeliegende (TIA-)Objektmodell.

Wie meine Vorredner schon erwähnt haben lässt sich ein Trigger über den HMI-Aufgabenplaner (passendes Intervall wäre 1 Minute) oder über die Steuerung (Ereignis bei Variablen-Wertänderung) generieren.



Gruß, Fred
 
OP
M

MartinJ12

Active member
Beiträge
43
Punkte Reaktionen
0
Da sich der Dateiname fortlaufend ändert, wird es schwierig sein darauf zu reagieren, da man keine genaue Entscheidung treffen kann.

Vielen Dank damit kann ich schon mal etwas anfangen und arbeiten.
Der Link zum Protool/WinCCflex.. wird mir sicherlich auch noch weiterhelfen.

Martin
 
OP
M

MartinJ12

Active member
Beiträge
43
Punkte Reaktionen
0
Wie würdest du denn diese Aufgabe z.B. mit Python oder Java lösen?

Ich würde die Daten in eine SQLite Datenbank ablegen und diese dann immer wieder neu aufrufen. Zum Beispiel mit TimeSweep oder ähnliche Module nur um mal bei Python zu bleiben.
Was mir Probleme macht, sind die immer wieder neugenerierten Dateinamen, da wusste ich nicht wie ich dieses Problem lösen sollte.
 

JesperMP

Well-known member
Beiträge
6.273
Punkte Reaktionen
1.170
Zuviel Werbung?
->Hier kostenlos registrieren
Nur um es zu verstehen.
Warum müssen die CSV Daten zyklish jede 7 Minute eingelesen werden ?
Woher stammen die CSV Daten ? Wenn sie von eine anderen System generiert oder gesendet werden, konnte diese andere System nicht direkt in die S7 Steuerung schreiben ?
 
OP
M

MartinJ12

Active member
Beiträge
43
Punkte Reaktionen
0
Nur um es zu verstehen.
Warum müssen die CSV Daten zyklish jede 7 Minute eingelesen werden ?
Woher stammen die CSV Daten ? Wenn sie von eine anderen System generiert oder gesendet werden, konnte diese andere System nicht direkt in die S7 Steuerung schreiben ?

Hallo Jesper,

die CSV Daten stammen von einer anderen Anlage. Es darf keine direkte Verbindung zu dieser Anlage bestehen, da beide Anlagen unabhängig bei Störungsfall weiterlaufen sollen.
Die andere Anlage generiert mir ca. alle 7 Minuten eine neue CSV Datei, deshalb ca. die 7 Minuten.

VG
Martin
 

faust

Well-known member
Beiträge
421
Punkte Reaktionen
94
Hallo Martin,

Ich würde die Daten in eine SQLite Datenbank ablegen und diese dann immer wieder neu aufrufen. Zum Beispiel mit TimeSweep oder ähnliche Module nur um mal bei Python zu bleiben.
...

Warum der Umweg über eine Datenbank? Nur, weil du dann ein fertiges Modul zum Dateieinlesen verwenden kannst? (Sorry, wenn das jetzt überheblich klingt, nicht so gemeint.)

Ich formuliere meine Frage neu:
Wie würdest du denn diese Aufgabe mit Python lösen, wenn du KEINE Spezialfunktionen oder -module verwenden kannst?


Gruß, Fred
 
OP
M

MartinJ12

Active member
Beiträge
43
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Warum der Umweg über eine Datenbank? Nur, weil du dann ein fertiges Modul zum Dateieinlesen verwenden kannst? (Sorry, wenn das jetzt überheblich klingt, nicht so gemeint.)

Ich formuliere meine Frage neu:
Wie würdest du denn diese Aufgabe mit Python lösen, wenn du KEINE Spezialfunktionen oder -module verwenden kannst?

Hallo Fred,

den Weg über Datenbanken wäre deutlich bequemer, wie du schon erkannt hast hat man hier vorgefertigte Module die man verwenden könnte.
Auf Anhieb würde ich hier dann auch keinen anderen Weg wissen, da alle Wege dir mir spontan einfallen würden, immer irgendwelche externen Module besitzen würden.

Wie gesagt, mir bereitet Bauchschmerzen, dass sich der Dateiname immer wieder ändert. Ich weiß nicht zu ganz wie ich darauf reagieren soll.

Gruß, Martin
 

JesperMP

Well-known member
Beiträge
6.273
Punkte Reaktionen
1.170
die CSV Daten stammen von einer anderen Anlage. Es darf keine direkte Verbindung zu dieser Anlage bestehen, da beide Anlagen unabhängig bei Störungsfall weiterlaufen sollen.
Warum sollte eine Anlage nicht weiterfahren können wenn die andere steht ?
Indirekt erzählst du uns dass die Anlage mit die alte Daten weiterfahren kann. Egal ob es gibt die Zwischen-Station CSV Datei und WinCC Advanced oder nicht.

Wenn du die 'Lösung' (eher 'Krücke') mit die CSV Datei und zyklische Skript verwendest, wie stellst du sicher dass die CSV Datei fertig geschrieben ist. Wie erreichst du dass die Daten konsistent sind ?

Wenn die andere Anlage ein S7 Steuerung ist, dann wurde ich dies über BSEND/BRECV lösen. Es ist das einfachste, und da ist kein Problem mit konsistenz o.Ä.
 

MFreiberger

Well-known member
Beiträge
1.287
Punkte Reaktionen
214
Moin MartinJ12,

mit "DIR" kannst Du Dir doch alle Dateinamen ausgeben lassen. Wenn mehrere Dateien existieren in einer Schleife durchlaufen lassen.

- Wie erkennst Du, welche Datei die aktuelle (gültige) ist?
- Was passiert mit den gelesenen Dateien?
- Sammeln sich Dateien an, wenn die Verbindung unterbrochen ist?

Kann die Fremdmaschine vor dem Eintrag einer neuen Datei nicht einfach alle anderen (alten) Dateien löschen?


Vielleicht löscht Du die Datei nach dem Lesen einfach und die Fremdmaschine kopiert nur eine neue Datei hinein, wenn das Verzeichnis leer ist? Aber dann muss das Löschen natürlich sicher funktionieren (auch nach dem ersten lesen)...


VG

MFreiberger
 
OP
M

MartinJ12

Active member
Beiträge
43
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Wenn du die 'Lösung' (eher 'Krücke') mit die CSV Datei und zyklische Skript verwendest, wie stellst du sicher dass die CSV Datei fertig geschrieben ist. Wie erreichst du dass die Daten konsistent sind ?

Wenn die andere Anlage ein S7 Steuerung ist, dann wurde ich dies über BSEND/BRECV lösen. Es ist das einfachste, und da ist kein Problem mit konsistenz o.Ä.

1. Darüber hinaus habe ich mir noch keine Gedanken gemacht, da ich noch nicht mal die Syntax von VBScripten kenne.
2. Darüber weiß ich leider auch nichts, aber ich gehe stark davon aus dass es eine S7-Steuerung besitzt. Ich werde mich dahingehend jetzt erstmal informieren und auch nachlesen was du mit BSEND/BRECV meinst.
 

Heinileini

Well-known member
Beiträge
3.729
Punkte Reaktionen
717
Also Ja der Dateiname ändert sich ca. alle 7 Minuten.
Wie läuft das dann, wenn die Vorgängerdatei noch im selben Zielverzeichnis ist? Wird diese dann einfach ignoriert oder muss die verschwinden?
Wenn Du mit "der Dateiname ändert sich ca. alle 7 Minuten" meinst, dass der neuste bzw. aktuelle Stand der Datei neu in das Verzeichnis geschrieben wird, dann wird die VorgängerDatei dadurch nicht überschrieben und steht weiterhin zur Verfügung.

Wenn Du damit meinst, dass die VorgängerDatei umbenannt wird, dann gibt es unter dem Namen der VorgängerDatei keine Datei mehr.

Ob die VorgängerDatei einfach ignoriert werden soll/darf oder ob sie verschwinden soll/muss/darf, das können wir nicht für Dich entscheiden!
Was gefordert ist, musst Du uns mitteilen, dann können wir Dir helfen.

Wie sollst Du denn mit den VorgängerDateien verfahren? Grundsätzlich ignorieren oder, falls Du sie noch nicht ausgewertet hast, dies schleunigst nachholen?

Ich würde empfehlen, in etwas kürzeren ZeitAbständen als 7 min per Script im Verzeichnis nachzusehen, ob eine noch nicht ausgewertete Datei vorliegt.
Damit Du sie dann nicht unnötigerweise mehrmals auswertest, würde ich die ausgewertete Datei umbenennen oder, falls sie nicht noch anderweitig benötigt wird, löschen.
 
OP
M

MartinJ12

Active member
Beiträge
43
Punkte Reaktionen
0
mit "DIR" kannst Du Dir doch alle Dateinamen ausgeben lassen. Wenn mehrere Dateien existieren in einer Schleife durchlaufen lassen.

- Wie erkennst Du, welche Datei die aktuelle (gültige) ist?
- Was passiert mit den gelesenen Dateien?
- Sammeln sich Dateien an, wenn die Verbindung unterbrochen ist?

Kann die Fremdmaschine vor dem Eintrag einer neuen Datei nicht einfach alle anderen (alten) Dateien löschen?


Vielleicht löscht Du die Datei nach dem Lesen einfach und die Fremdmaschine kopiert nur eine neue Datei hinein, wenn das Verzeichnis leer ist? Aber dann muss das Löschen natürlich sicher funktionieren (auch nach dem ersten lesen)...
Hallo MFreiberger,

es wird alle 7-10 Minuten eine neue Datei ausgegeben, von dieser Datei benötige ich nur ein paar Daten, die ich mir wieder speichere und dann in eine neue CSV-Datei schreibe, die Alte Datei muss bestehen bleiben, da der Kunde diese braucht und nicht möchte, dass man diese entweder überschreibt oder löscht.

1. Genau dieses Problem müsste ich irgendwie lösen, die Frage ist nur wie? Mir ist nicht bekannt, dass man direkt auf Windowsdaten zugriff bekommen kann, ansonsten wäre dies schon wieder leichter.
2. Die gelesenen Dateien werden in ein Array gespeichert und bei Abschluss meiner Anlage wieder herausgegeben, die alte Datei bleibt ebenfalls bestehen, da dort die Auswertungen von der alten Anlage drinnen sind.
3. Darüber kann ich keine Infomation geben, da ich die selbst nicht besitze.

VG, Martin
 
Oben