WinCC Tia PC Runtime Advanced V17 HMI UDT Array per VBA Skript über Index Variable zugreifen.

Speedevil

Level-2
Beiträge
38
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich muss einen CSV Export machen, sprich ich erfasse alle ca 200-1000ms einen Datensatz (UDT) mit ca. 13 Werten.

Also ein Array mit 1800 x diesem UDT erstellt und als HMI Variable deklariert. (1800 einfach mal Testweise, bei 200ms ist der Speicher natürlich nicht allzugroß).

Nun eine Schleife
For I =0 TO 1800
Möchte ich den UDT (I) 1800 mal adressieren. Leider geht das nicht, ich habe schon im Forum gelesen bin aber nicht ganz sicher ob der Fehler bei mir liegt bzw. Ob es nicht doch geht, da die Variablen ja in den HMI Variablen auch angelegt sind über den UDT. Anbei Screenshot (Testweise nur den Wert Q adressiert). Sobald ich diesen aber mit (i) adressiere, wird der Wert nur einmal in die Excel geschrieben.
1744814015854.png

1744814090756.png
 
Code:
'Listview ausfüllen
    For i = 0 To UBound(arrData,2)
        SmartTags("LISTVIEW_PRODUKTE_Datum_Abschluss")(i) = arrData(2,i)
        SmartTags("LISTVIEW_PRODUKTE_Auftragsnummer"&"["&i&"]") = arrData(3,i)
    Next
End If

Ausschnitt aus nem alten Programm. Datum_Abschluss ist Datentyp Date
Auftragsnummer String. Nur bei String muss ["&i&"] verwendet werden.
Allerdings hatte ich auch nur Arrays ohne UDTs...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bist du sicher, dass du keinen Fehler "no tag" bekommst?

Ich habs kurz nachgestellt, da hatten wir gerade erst das Thema.

Wenn du alle deine Variablen vorher irgendwo mal deklarierst, geht es.
Code:
Dim dummy
dummy = SmartTags("csv.csv[0].Q")
dummy = SmartTags("csv.csv[0].Dichte")
...
2025-04-16 17_29_32-HmiRTm (Debugging) - Microsoft Visual Studio.png
 
Zuletzt bearbeitet:
Ich versteh es nicht zu 100%...
Sobald ich diesen aber mit (i) adressiere, wird der Wert nur einmal in die Excel geschrieben.
Es wird nur eine Zeile geschrieben oder 1801 Zeilen mit dem selben Wert?

Weil ich erst das Thema hatte, allerdings bei WinCC RT Prof V19:
Behauptung meinerseits: Du hast zusätzlich zu dem Typ noch mindestens eine der Variablen separat in der HMI-Variablentabelle deklariert.

Es darf nur der Typ angelegt sein. Wenn du Elemente an z.B. ein EA-Feld anbinden willst, musst du über den Typen gehen.
Beispiel: Wenn an einem EA-Feld die Variable "Typ.ABC" eingetragen ist statt "Typ".ABC

Die Deklarationen der einzelnen Variablen ("Typ.ABC") in der HMI-Variablentabelle löschen und an dem EA-Feld durch "Typ".ABC ersetzen.
 
Zuletzt bearbeitet:
ich muss einen CSV Export machen, sprich ich erfasse alle ca 200-1000ms einen Datensatz (UDT) mit ca. 13 Werten.
Ich würde mal behaupten, das geht nicht mit der WinCC Advanced Runtime. Oder nur scheinbar/sporadisch. Da brauchst du eine andere Lösung außerhalb der WinCC Runtime.
Vielleicht schaffst du es, alle 200-1000ms einen Datensatz in die csv-Datei zu schreiben, aber nicht mit garantiert aktualisierten Variablenwerten. Die Werte der Variablen in der PLC bekommt man nur mit Handshake garantiert aktualisiert ins HMI eingelesen, z.B., als Rezeptur. Und das geht nicht so schnell mit der WinCC Advanced Runtime. siehe Forumssuche nach: GetDataRecordTagsFromPLC
oder hier:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@PN/DP Ich denke er "loggt" die Werte in der SPS in die 1801 Arrayelemente und will sie nach dem Sammeln in der SPS übers WinCC exportieren.
Andere Frage: Sind das dann nicht viel zu viele Powertags? Da müsste doch schon der Compiler meckern...
 
Hier mal noch ein Beispiel für Datenlogger von mir. Zuerst die Überschriften eintragen, dann die Werte in die Zeilen darunter mit der Schleife.
Allerdings habe ich hier den Zugriff über den Index nur ungetestet eingefügt. Da waren das alles Einzelvariablen:

'Daten schreiben
'Überschriften In erste Zeile eintragen
MeineDatei.Write ( "Datum" &";" _
&"Uhrzeit" &";" _
&"Selektiert" &";" _
&vbCrLf)


For i = 0 To 1800
MeineDatei.Write ( Date &";" _
&Time &";" _
&SmartTags("Edit.Data.Layer["&i&"].Sel")&";" _
&" "&";" _
&vbCrLf)

Next

MeineDatei.Close
Set fso = Nothing
Set MeineDatei = Nothing
 
@PN/DP Ich denke er "loggt" die Werte in der SPS in die 1801 Arrayelemente und will sie nach dem Sammeln in der SPS übers WinCC exportieren.
Dann hätte er lediglich mehr Zeit zum holen der Variablenwerte ins HMI (wenn das loggen in der SPS nicht dauerhaft fortlaufend aktiv ist). Am grundsätzlichen Problem der garantierten Variablenaktualisierung im HMI ändert das aber nichts.
Einfach in einer Schleife 1800 * 13 = 23400 Variablennamen zusammenbasteln und einmal auf jede Variable zugreifen sorgt nicht dafür, dass der Wert in dem Moment in der HMI verfügbar wird. Ganz davon abgesehen, dass er da 23400 einzelne HMI-Variablen anlegen müsste und eine Lizenz für ca. 24000 Powertags bräuchte.

Die Werte müssten mit Handshake ins HMI gelesen werden, z.B. als Rezeptur. Wenn die Rezeptur nur genau einen Datensatz von 13 Variablen umfasst, dann dauert die Übertragung eines Rezeptur-Datensatz (mit Handshake) vielleicht 0,5 bis 1 Sekunde - die Übertragung von 1800 Datensätzen würde also ca. 15 bis 30 Minuten dauern! Möglicher Ausweg: die Rezeptur so groß machen, dass z.B. 30 Datensätze hineinpassen und jedesmal gleich 30 Datensätze auf einmal einlesen, dann müsste die Rezeptur 390 Variablen haben und es müssten auch 390 Rezepturvariablen projektiert werden. Dann würde alleine das einlesen der 1800 Datensätze "nur" noch 30 bis 60 Sekunden dauern. Wie man sowas programmiert siehe meinen Link in Beitrag #5

Was für eine SPS-CPU wird verwendet? Kann diese CPU vielleicht selber die csv-Datei erstellen? Und evtl. per FTP (oder ein eigenes Protokoll) an einen Fileserver im Netzwerk senden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine andere Variante wäre die Daten über x Zyklen in eine Datenbank zu schreiben:
S7-PLC_MySql_MariaDB von Forenmitglied Marvm wäre eine Lösung.
Natürlich wird dafür dann irgendwo ein Rechner mit der entsprechenden SW benötigt.
Aber DB ist mir persönlich lieber als CSV und viel schneller wird es bei den Mengen an Daten nicht gehen.

Oder wie PN/DP gesagt hat in der SPS als CSV speichern, wobei ich hier Bedenken wegen Schreibzyklen auf die MemoryCard hätte:
S7 Data logging // Doku zum Beispielprojekt
 
Zuletzt bearbeitet:
Guten Abend,

nur kurz von der Couch aus, genau die Daten werden in der SPS im DB gespeichert und dann Zeit Unkritisch ins die CSV über das HMI übertragen.
Logging über die PLC dachte ich auch, aber hier habe ich auch "Angst" das die MemoryCard Flöten geht.
Das mit der verwendeten Variable im HMI am EA Feld prüfe ich, wobei das genau diese eine Q Variable zum testen wäre. Ich prüfe das über Ostern nochmal.

Fehler "No Tag" habe ich nicht, alle Variablen (1800 sind eher zum testen das soll gegen 5-8000 Datensätze (a 13Variablen) gehen laut Kunden Wunsch.) kann ich nicht nicht deklarieren.

Steinigt mich, aber ich hoffte durch die Array Variable nur einen "PowerTag" zu brauchen, alles andere wäre ja utopisch.

@Marvm deinen Baustein habe ich erfolgreich in Benutzung, ich bin der "Speedevil" aus den Github Fragen :-) Danke nochmal für deinen Support.

@EliteGurke ich würde die Daten auch gerne in der SPS lassen, einen Umweg über die Datenbank wäre eventuell Möglich, IT Entwicklung etc. arbeiten hier alle gut zusammen beim Kunde.

Schade ein Script im HMI wäre halt schön gewesen auch um ein bisschen Autark von der DB zu sein.

Falls dir noch was einfällt gerne her damit, ich prüfe am Wochenende das Projekt nochmal.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist so, wie schon von @PN/DP beschrieben. Du wirst nicht den UDT als eine Variable einlesen können und wenn du alles einzelne Variablen anlegst wirst du niemals Konsistenz über den gesamten Bereich erhalten (es stehen also wenn dann irgendwelche Werte in den Variablen).
Den einzigen Ausweg, den ich hier sehe, wäre auf eine seperate Software (z.B. auf .Net-Basis) auszuweichen und hiermit die Daten einzulesen - aber auch das setzt schon einiges anInsider-Wissen voraus ...
 
Ok, aber warum reden wir über Konsistenz, die „schnelle Erfassung“ findet doch in der plc statt. Das „träge Hmi“ hat ja dann alle Zeit der Welt die Daten die sich in diesem Baustein befinden und nicht mehr verändern in die csv zu schreiben.

Echt Tricky überall eine Sackgasse, wenn ich die Daten Logging Funktion auf der 1500er nutze und sagen wir mal im Schnitt 120x im Jahr Einen kompletten Datensatz mit 50.000Variablen speichere meint ihr die mmc macht das ein Jahr mit? (Ich habe da gar kein Gefühl).

Kann diese csv auch an einen ftp Server gesendet werden? Händisch per Websever ist etwas umständlich

Alternativ bleibt wohl nur 3. Software oder die sql Anbindung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was für eine SPS-CPU wird verwendet?
wenn ich die Daten Logging Funktion auf der 1500er nutze
Heißt das nun, dass du eine S7-1500 hast? Und vielleicht noch zusätzliche CP?
Wenn du auch Beispielprogramme sehen willst, dann solltest du mal genauer bekannt geben, welche CPU du verwendest.

und sagen wir mal im Schnitt 120x im Jahr Einen kompletten Datensatz mit 50.000Variablen speichere meint ihr die mmc macht das ein Jahr mit? (Ich habe da gar kein Gefühl).
Ja
(das hängt eigentlich auch schon wieder davon ab, welche CPU und welche Speicherkarte du verwendest)

Kann diese csv auch an einen ftp Server gesendet werden?
Sehr wahrscheinlich Ja. Wie? Das hängt von deiner verwendeten SPS-Hardware ab.

Alternativ bleibt wohl nur 3. Software oder die sql Anbindung.
Anstatt auf die Speicherkarte der CPU könnte die CPU auch per Open User Kommunikation (OUC) per TCP aktiv die Datensätze an einen TCP-Server senden (ggf. auch schon als csv formatiert), der dann die Daten in eine Datei oder Datenbank speichert. Der TCP-Server könnte z.B. auf demselben PC wie die WinCC Runtime laufen.
Die S7-1200 könnte die csv-Datei auf einen PC im Netzwerk kopieren, z.B. per ftp oder tcp an einen Fileserver.
Daten an einen Server-PC im Netz senden z.B. TCP-Fileserver für S7-Controller (keine Lizenzkosten)
oder FTP-Client Kommunikation mit S7-1200/1500

Es müsste auch was per OPC gehen.
Im Beitrag #5 hatte ich ein Thema verlinkt, in dem u.A. alternative Möglichkeiten und Drittsoftware genannt wurden.

Wie wichtig sind die aufgezeichneten Daten? Wie lange vertraust du der SPS-CPU, dass die die Daten nicht vor dem Export verliert?
Der Bediener der Visu auf dem PC könnte auch (z.B. direkt nach Aufzeichnung) mit Excel oder einer anderen Drittsoftware die Daten aus der CPU lesen und speichern.
 
Ok, aber warum reden wir über Konsistenz ?
Die Daten, die bei einer so großen Menge in der Visu landen sind nicht unbedingt die, die du aktuell in der SPS hast. Es sind mit großer Sicherheit auch viele Daten von irgendwann (vorher) dazwischen. Die Visu liest die Daten ein wie es passt und nicht so, wie es in deinem Script steht. Das kannst du nur über die von Harald schon beschriebene Rezept-Variante erreichen oder über etwas, dass tatsächlich einen kompletten Block einlesen kann. Selbstverständlich ist das Versenden der daten von der SPS auch eine Variante - da wird dann das geschickt, was sich gerade in dem DB befindet. Du hast da dann nur das Problem, dass es ja auch wieder irgendwo entgegen genommen werden und "zerpflückt" werden muss ...
 
Variablen in UDTs werden aber nie als ein Powertag gezählt. Arrays sehr wohl.
Ja, aber...
RT Advanced: Array als 1 Powertag, und auch nur dann, wenn mindestens 1 Element verwendet wird, egal ob im Bild oder Script.
RT Prof: JEDES Array-Element, auch wenn KEINES der Array-Elemente verwendet wird. Es reicht das Anlegen in der Variablentabelle.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Heißt das nun, dass du eine S7-1500 hast? Und vielleicht noch zusätzliche CP?
Wenn du auch Beispielprogramme sehen willst, dann solltest du mal genauer bekannt geben, welche CPU du verwendest.


Ja
(das hängt eigentlich auch schon wieder davon ab, welche CPU und welche Speicherkarte du verwendest)


Sehr wahrscheinlich Ja. Wie? Das hängt von deiner verwendeten SPS-Hardware ab.


Anstatt auf die Speicherkarte der CPU könnte die CPU auch per Open User Kommunikation (OUC) per TCP aktiv die Datensätze an einen TCP-Server senden (ggf. auch schon als csv formatiert), der dann die Daten in eine Datei oder Datenbank speichert. Der TCP-Server könnte z.B. auf demselben PC wie die WinCC Runtime laufen.

Im Beitrag #5 hatte ich ein Thema verlinkt, in dem u.A. alternative Möglichkeiten und Drittsoftware genannt wurden.

Wie wichtig sind die aufgezeichneten Daten? Wie lange vertraust du der SPS-CPU, dass die die Daten nicht vor dem Export verliert?
Der Bediener der Visu auf dem PC könnte auch (z.B. direkt nach Aufzeichnung) mit Excel oder einer anderen Drittsoftware die Daten aus der CPU lesen und speichern.
Es wird einen et200sp 1514 F CPU verwendet. Cp‘s habe ich keine.

Die Daten sollen nach einer Prüfung in der csv ausgewertet werden. „Lebenswichtig“ sind diese jetzt nicht also sie dienen nur der Entwicklung als Analyse.

Das TCP Tool, schaue ich mir auch mal an.

Das mit der MemoryCard wäre auch ein Weg, dann würde man diese jährlich bei der Wartung proforma tauschen. (Klingt trotzdem nach Murks) :-).

Schade ich dachte halt echt mit meinem Skript per Schleife die arrays hochgezählt und fertig. Komisch dass so eine Aufgabe in der heutigen Zeit noch ein Problem darstellt.
 
Jetzt kam die Antwort von Siemens,

Funktioniert das so einfach oder meint der Support was anderes? Werde es am Wochenende prüfen. Bin nicht mehr im Büro und Dienstag geht es wieder zum Kunde


Siemens:
für den Zugriff auf den Wert eines Array-Elements können Sie in VB folgende Syntax verwenden:

SmartTags("ExportData")(0)
oder
SmartTags("ExportData<0>")

Mit der Tastenkombination <Strg> + <J> wird ein Dialog zum Auswählen einer beliebigen Variable geöffnet. Auf diese Weise können Sie die Variablen über das GUI im Skript adressieren.

Mit freundlichen Grüßen

Ihr Technical Support für Digital Industries
 
Hallo zusammen,

da es ja um TIA V17 geht würde ich das gesamte Array überhaupt nicht in der HMI Anlegen, sondern für jeden Wert eine Multiplexvariable die mit einer internen Variable den Index zuweist.

Das Problem ist dann eben die Aktualisierung der Variablen Einstellung auf 100ms zyklisch fortlaufend, im Script muss man in der For schleife noch einen Wartebefehl einbauen um sicherzustellen das die Variablen mit dem Index aktualisiert werden bevor man sie in die CSV schreiben kann. In meinen Fall war es eine Schaltfläche die den export in die CSV auslöst und man konnte darauf hinweisen das dieser Vorgang länger dauert je nachdem wie groß das Array ist ca 60s / 300Einträge. Durch die Bearbeitung des Scriptes ist die Visu in dieser Zeit auch nicht bedienbar.

Ich würde in dem Fall den Weg gehen und die Daten "live"schreiben, also die Aktuellen Werte in einen HMI Puffer schreiben, danach 150ms später ein Bit Setzen das Daten bereit sind und damit ein script triggern das die Daten an die csv dranhängt, den HMI Puffer leert und bereit zurücksetzt.
Mit der Einstellung 100ms zyklisch fortlaufend sollten die Werte in der HMI dann aktuell sein beim Script ausführen
Code:
For i = 0 To Anz

    'Warten zum aktualisieren der HMI Variablen
    SmartTags("Restdauer") = (Anz - i)
    StartTime = Now
    StopTime = StartTime + 0.2 / 24 / 3600
    Do
    Loop While Now < StopTime

    Line =     i                                                 &SEP& _
            SmartTags("Wert_01")            &SEP& _
            SmartTags("Wert_02")            &SEP& _
            SmartTags("Wert_03")            &SEP& _
            SmartTags("Wert_04")            &SEP& _
            SmartTags("Wert_05")            &SEP& _
            SmartTags("Wert_06")   
            
    ' Neue Zeile in CSV eintragen
    FileAddLine SmartTags("RT"),Path_File,Line               
Next
 
Zuletzt bearbeitet:
Zurück
Oben