TIA Zugriff auf ein Array in der SPS von der HMI aus

rzwodzwo

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

wie kann ich von der HMI aus, auf ein Array zugreifen was in der SPS liegt?
Ich habe in der SPS-Einheit einen eigenen UDT Datentyp erzeugt und in einem Datenbaustein liegt dann ein Array, welches 50 Elemente von diesem UDT-Typ enthält. Nun möchte ich in meinem HMI Gerät eine Variable erzeugen, die auf das Array aus dem Datenbaustein referenziert.
Ich habe bereits zwei Strings-Arrays in dem Datenbaustein, die ich erfolgreich hinzufügen konnte. Diese konnte ich einfach per Drag and Drop vom Datenbaustein hinzufügen. Wenn ich das mit dem neuen Array mache werden mir automatisch 50 neue Variablen generiert, welche dann auf den UDT-Datentyp verweisen. Das sieht dann wie folgt aus:

.... "DB140 Datenbank".array[0] ...
.... "DB140 Datenbank".array[1] ...
.... "DB140 Datenbank".array[2] ...
... und so weiter (siehe Bild)...

Das würde prinzipiell auch funktionieren, ist aber für die Ansicht aller Variablen nicht schön. Gibt es vielleicht einen Weg das nur das Array angelegt wird und ich anschließend via VBS Code und dem Befehl " HMIRuntime.Tags("array[0]"] " auf jedes Element einzeln zugreifen kann (bzw. in der Variablenansicht das Array ausgeklappt werden kann)?

Warum mache ich das?
Momentan habe ich viele einzelne interne Variablen als Arrays angelegt innerhalb der HMI, diese beinhalten Daten, bei dem aber alle unterschiedlich sind. Also ein Array hat Int, eins hat DInt, eins hat wieder Real, usw. Diese ganzen einzelnen Arrays finde ich ebenfalls nicht schön und am Ende gehören diese Daten auch alle zusammen daher die Konstruktion des UDTs bzw. Verwendung von Struct. Nur geht das ja nur in der SPS und daher muss ich die Daten wieder zur HMI bekommen, weil diese dort visualisiert dargestellt werden sollen...

Ich arbeite mit TIA Portal v17 und WinCC Professional (noch nicht sehr lange..)

Grüße
 

Anhänge

  • ist_zustand.png
    ist_zustand.png
    78,5 KB · Aufrufe: 29
Du kannst ganz einfach UDTs auch im HMI verknüpfen:
Screenshot 2023-09-18 130243.png

Du musst halt nur in der UDT die Variablen und andere UDTs als sichtbar/schreibbar anwählen in der UDT:
Screenshot 2023-09-18 130333.png

Falls dir die Spalten nicht angezeigt werden kannst du die über das Kontextmenü anzeigen lassen:
Screenshot 2023-09-18 130542.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Super danke, habe es jetzt hinbekommen wie ich es wollte.
Die Einstellungen waren allerdings bei mir schon und scheinen auch standardmäßig aktiviert zu sein (zumindest bei mir). Deine Antwort hat mich aber nochmal für einen anderen Lösungsweg angereizt und jetzt habe ich es so gemacht das nicht mein UDT Typ in einem Array liegt, sondern ein Array of Structs innerhalb von meinem UDT. Dann habe ich eine normale Variable im DAtenbaustein und damit auch nur eine Variable/Zeile in meinen HMI Variablen.
 

Anhänge

  • 2.png
    2.png
    26,6 KB · Aufrufe: 20
  • 1.png
    1.png
    10,8 KB · Aufrufe: 20
Super danke, habe es jetzt hinbekommen wie ich es wollte.
Die Einstellungen waren allerdings bei mir schon und scheinen auch standardmäßig aktiviert zu sein (zumindest bei mir). Deine Antwort hat mich aber nochmal für einen anderen Lösungsweg angereizt und jetzt habe ich es so gemacht das nicht mein UDT Typ in einem Array liegt, sondern ein Array of Structs innerhalb von meinem UDT. Dann habe ich eine normale Variable im DAtenbaustein und damit auch nur eine Variable/Zeile in meinen HMI Variablen.
Sowas verwende ich zum Beispiel für Datensätze von Einfachpositionierungen, wo dann Teachpunkt, Geschwindigkeit, Beschleunigung usw hinterlegt sind und den packe ich dann in ein Array, Quasi wie ein Paket
 
Hm also du machst ein "Array [0..x] of UDT_X" und wo erzeugst du das?

Wenn du in der HMI eine Variable als Array erzeugst dann wird der UDT Typ doch gar nicht angezeigt oder ? (bei mir werden dann nur die Standard Datentypen vorgeschlagen)

.. und wenn du erst ein Array erzeugst im Datenbaustein und dann in die HMI rüberholst, müsste es doch aussehen wie in meinem ersten Bild, wo dann alle Elemente des Arrays als eigene Variable angelegt werden?

.. oder holst du das Array dann gar nicht rüber in die HMI sondern arbeitest nur in der SPS damit?

:unsure:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm also du machst ein "Array [0..x] of UDT_X" und wo erzeugst du das?

Wenn du in der HMI eine Variable als Array erzeugst dann wird der UDT Typ doch gar nicht angezeigt oder ? (bei mir werden dann nur die Standard Datentypen vorgeschlagen)

.. und wenn du erst ein Array erzeugst im Datenbaustein und dann in die HMI rüberholst, müsste es doch aussehen wie in meinem ersten Bild, wo dann alle Elemente des Arrays als eigene Variable angelegt werden?

.. oder holst du das Array dann gar nicht rüber in die HMI sondern arbeitest nur in der SPS damit?

:unsure:
Arbeite damit nur in der SPS, fürs HMI hab ich dann einen eigenen Bereich und lade dann nur meinen Datensatz über einen Pointer rein, welcher gerade am HMI gewählt ist
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@DCDCDC hast du vielleicht nochmal einen Tipp wie ich in einem VBS Skript auf die Array-Elemente zugreifen kann?

Kurz nochmal meine aktuelle Ausgangslage:
Ich habe ein UDT erzeugt "UDT_DATABASE", darin liegt ein Array of Struct "udt_arr". Im Datenbaustein habe ich dann eine Variable "db_elem" erzeugt mit UDT_DATABASE als Datentyp. Anschließend habe ich in den HMI Variablen per Drag and Drop das "db_elem" vom Datenbaustein reingezogen und dort heißt es dann "DB140Datenbank". Die Variable DB140Datenbank kann ich aufklappen und komplett nachvollziehen.

Jetzt möchte ich von einem VBS Skript aus Daten in das Array bzw. die Structs reinschreiben und abrufen. Dazu habe ich folgenden Befehl zusammengeschustert:

writeStatus = HMIRuntime.Tags("DB140Datenbank.udt_arr" & "[0]" & ".elemInt").Write(1)

Syntaktisch kriege ich beim Übersetzen keine Fehlermeldung und beim Ausführen in der Simulation kriege ich auch kein "Unbekannter HMI Tag"-Fehler, ein On Error Resume Next welches davor liegt schlägt ebenfalls nicht an. Allerdings wird der Schreibbefehl nicht ordentlich ausgeführt und "writeStatus" ist FALSE. (Das elemInt ist eine Integer-Variable aus dem Struct.)

Ich weiß nicht ob es eine Rolle spielt aber ich habe gesehen, das bei meinem HMIVariablen überall "Absoluter Zugriff" steht außer bei dem reingezogenen "db_elem", das heißt in den HMI Variablen "DB140Datenbank" und hat "Symbolischer Zugriff". Im UDT und im Datenbausteine sind die Häkchen alle gesetzt bei Schreiben, Erreichbar und Sichtbar
 

Anhänge

  • hmivar.png
    hmivar.png
    26,3 KB · Aufrufe: 9
Zuletzt bearbeitet:
@DCDCDC hast du vielleicht nochmal einen Tipp wie ich in einem VBS Skript auf die Array-Elemente zugreifen kann?

Kurz nochmal meine aktuelle Ausgangslage:
Ich habe ein UDT erzeugt "UDT_DATABASE", darin liegt ein Array of Struct "udt_arr". Im Datenbaustein habe ich dann eine Variable "db_elem" erzeugt mit UDT_DATABASE als Datentyp. Anschließend habe ich in den HMI Variablen per Drag and Drop das "db_elem" vom Datenbaustein reingezogen und dort heißt es dann "DB140Datenbank". Die Variable DB140Datenbank kann ich aufklappen und komplett nachvollziehen.

Jetzt möchte ich von einem VBS Skript aus Daten in das Array bzw. die Structs reinschreiben und abrufen. Dazu habe ich folgenden Befehl zusammengeschustert:

writeStatus = HMIRuntime.Tags("DB140Datenbank.udt_arr" & "[0]" & ".elemInt").Write(1)

Syntaktisch kriege ich beim Übersetzen keine Fehlermeldung und beim Ausführen in der Simulation kriege ich auch kein "Unbekannter HMI Tag"-Fehler, ein On Error Resume Next welches davor liegt schlägt ebenfalls nicht an. Allerdings wird der Schreibbefehl nicht ordentlich ausgeführt und "writeStatus" ist FALSE. (Das elemInt ist eine Integer-Variable aus dem Struct.)

Ich weiß nicht ob es eine Rolle spielt aber ich habe gesehen, das bei meinem HMIVariablen überall "Absoluter Zugriff" steht außer bei dem reingezogenen "db_elem", das heißt in den HMI Variablen "DB140Datenbank" und hat "Symbolischer Zugriff". Im UDT und im Datenbausteine sind die Häkchen alle gesetzt bei Schreiben, Erreichbar und Sichtbar
Verwendest du denn nur optimierte DBs und auch im Programm rein symbolische Zugriffe? Das wird denke ich nichts damit zu tun haben wie Variablen in der HMI Tabelle eingefügt werden, bei mir stehen alle Variablen im HMI automatisch auf symbolischem Zugriff. Mit Skripten kenne ich mich nicht aus, schau mal hier im Forum im FAQ Bereich
 
Der Datenbaustein ist nicht optimiert. Ich habe mal ein paar DBs angeklickt ein paar sind optimiert ein paar nicht.. so die Stichprobe.. Zu der Thematik Optimierung und symbolische Zugriffe muss ich mich erst noch belesen. Da weiß ich nichts zu und kann da leider auch keine Aussage zu treffen. Aber Danke dann tauche ich mal im FAQ ab.
 

Anhänge

  • db_attribute.png
    db_attribute.png
    9,4 KB · Aufrufe: 5
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Datenbaustein ist nicht optimiert. Ich habe mal ein paar DBs angeklickt ein paar sind optimiert ein paar nicht.. so die Stichprobe.. Zu der Thematik Optimierung und symbolische Zugriffe muss ich mich erst noch belesen. Da weiß ich nichts zu und kann da leider auch keine Aussage zu treffen. Aber Danke dann tauche ich mal im FAQ ab.
Kapitel 2.6 https://cache.industry.siemens.com/...1318674_Programming_guideline_DOC_v161_de.pdf

Standardmäßig ist der optimierte Bausteinzugriff bei allen neuerstellten Bausteinen bei S7-1200/1500 aktiviert.
Hast du denn den Punkt in den Optionen deaktiviert? Wenn ja, warum?
 
writeStatus = HMIRuntime.Tags("DB140Datenbank.udt_arr" & "[0]" & ".elemInt").Write(1)
Mit WinCC Professionell kenne ich mich nicht aus. In WinCC Comfort/Advanced bastelt man mit VBS so ähnlich den Name einer einzelnen HMI-Variable zusammen ("DB140Datenbank.udt_arr[0].elemInt"), die in der WinCC Runtime so existieren muß. Ein Array-Zugriff ist das nicht.
Ich weiß auch nicht, ob WinCC Professionell überhaupt "Arrays of UDT" oder "Arrays of Struct" mit VBS ansprechen kann.
 
Ok, Danke für die Info.

Da ich momentan nicht weiter komme bei meinem Vorhaben möchte ich das hier nochmal kurz erwähnen was ich eig machen will und vielleicht habt ihr ja einen alternativen Lösungsweg für mich..

Ich möchte im TIA Portal via VBS Skripte Tabellendaten aus einer SQL Datenbank abrufen. Diese Daten soll dem Nutzer in der WinCC wieder als Tabelle grafisch präsentiert werden. Der Nutzer kann dann zum Teil damit interagieren, weitere Ansichten öffnen und dann auch Aufträge auslösen wodurch dann bestimmte Daten zur SPS gesendet werden müssen. So der Plan, früher wurde wohl ein Zusatztool wie GraphPic (glaube ich?) verwendet, was es jetzt nicht mehr gibt.

Bei meiner bisherigen Umsetzung kann ich die Daten von der Datenbank abrufen, gar kein Problem. Aber nun die Frage wie arbeite ich mit den Daten weiter? Momentan habe ich in den HMI Variablen für jede Spalte der abgerufenen Tabelle ein Array angelegt mit 100 Elementen vom jeweiligen Datentyp. In diese Arrays werden die Daten reingeschrieben (die jeweilige Index-Position im Array ist gleich zu der Zeile aus der Tabelle). Dann habe ich ein Bild angelegt und darin Textfelder angeordnet mit den Spaltennamen aus der Tabelle. Unter jedem Textfeld bzw. jeder Spalte sind dann 10 EA-Felder, was dann 10 Zeilen entspricht. Bei 9 Spalten habe ich in dem Bild also 90 EA-Felder und das ganze sieht dann aus wie eine Tabelle. Wenn man mir bis hierhin folgen konnte hat man sich das erste Bienchen verdient. Aber jetzt wirds tricky.
Ich kann aus meinem Skript heraus nicht auf die EA-Felder zugreifen. Aber ich kann in jedem EA-Feld in den Eigenschaften eine Variable hinterlegen, wo dann das EA-Feld den Wert aus der Variablen annimmt und präsentiert. Also habe ich wieder für jede Spalte ein Array angelegt, allerdings nur mit 10 Elementen (ich nenn diese jetzt EA-Arrays). Die EA-Arrays folgen dem gleichen Prinzip wie die allerersten Arrays für die Datenbank. Das heißt jedes EA-Array enthält Daten für eine Spalte der Tabelle und der Index entspricht wieder genau der Zeile aus der Tabelle. An dieser Stelle hat sich der aufmerksame Leser ein zweites Bienchen verdient.
Mit diesen ganzen Arrays mache ich nun folgendes. In dem erstellten Bild mit den ganzen EA-Felder, bekommt jedes EA-Feld sein eigenes Feldelement zugewiesen (z.B. EA-feld0 : eaFeldArraySpalteId[0]; EA-feld1 : eaFeldArraySpalteName[0]; EA-feld9 : eaFeldArraySpalteId[1] -> EA-feld9 ist dann ja wieder eine neue Zeile, aber wieder die Spalte Id.. vielleicht ist es mit den Bildern im Anhang deutlicher) Damit hat jedes EA-Feld eine direkte Zuordnung zu einem Feldelement aus den EA-Arrays. Und nun werden je nach Wunsch Daten von den Datenbank-Arrays in die EA-Arrays kopiert. Das funktioniert mit einem Aufgabenplaner und zwei Buttons. Damit werden dann die Daten in dem Bild in der Tabelle angezeigt und können geändert werden.
Ich weiß sehr komplizierter Text, aber ist auch etwas schwer zu beschreiben. Wer es bis hier geschafft und dann noch verstanden hat, hat sich das dritte Bienchen auf jeden Fall verdient.

Aus dem Text geht hervor das es ein Array Chaos gibt und das sieht man halt auch in den HMIVariablen. Ich möchte jetzt eig. die Datenstruktur optimieren, so dass ich nicht so viele einzelne Arrays habe. Das funktioniert in der Theorie, weil ich in der SPS ja mit Struct arbeiten könnte aber ich kriege es nicht hin die Daten in die WinCC/HMI rüber zu bringen und darauf aus dem VBS Skript heraus zuzugreifen. Und jetzt kommen eig. noch weitere Tabellenanfragen.. wenn ich mit dem gleichen Prinzip weiter mache dann wird die Anzahl der Arrays unüberschaubar und ist überhaupt nicht schön...

Ich weiß leider momentan auch noch zu wenig über das Programm, wodurch ich noch nicht ganz einschätzen kann - was überhaupt möglich ist und was nicht... Vielleicht habt ihr da eine andere Idee oder Tipps oder einen ganz anderen Lösungsansatz..?

Im VBS Skript kann ich beispielsweise so auf die Arrays zugreifen:
HMIRuntime.Tags("eaFields_col_id[" & row & "]").Write(HMIRuntime.Tags("database_col_id[" & index & "]").Read)
oder
HMIRuntime.Tags(tag & "[" & row & "]").Write(recordSet(item).Value)
 

Anhänge

  • feld0.png
    feld0.png
    30,4 KB · Aufrufe: 32
  • feld1.png
    feld1.png
    30,9 KB · Aufrufe: 30
  • feld9.png
    feld9.png
    29,7 KB · Aufrufe: 29
Zuletzt bearbeitet:
Zurück
Oben