TIA vbs: variabel auf ein mehrdimensionales zugreifen

Beiträge
45
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum
verwendete Komponenten:
CPU1512P F-1 PN
Comfort Panel 1500
in der Steuerung habe ich ein mehrdimensionales Feld angelegt und auch beschrieben.
Messwerte Array[1..40, 1..30] of DInt [1..40 Messpunkte , 1..30 Messungen]


nun muss ich die Werte per VB Script in eine csv Datei schreiben. Funzt grundsätzlich aber der Teil mit den Messwerten halt noch nicht so wie gewünscht:

Code:
For ii = 1 To SmartTags("DB_general_MIF_counter") 
    fo.LinePrint("Messung" & ii & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{2,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{3,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{4,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{5,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{9,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{10,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{21,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{22,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{23,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{24,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{27,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{28,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{32,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{33,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{35,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{36,"&ii&"}") & delimiter _
            & SmartTags("DB_Mess_MIF_Messwerte{37,"&ii&"}") & delimiter)
Next


es stehen leider überall nur "0" drin
vom Grundsatz funzt folgende Adressierung, ist aber nicht variabel:


Code:
[INDENT]& SmartTags("DB_Mess_MIF_Messwerte{1,1}") & delimiter _

[/INDENT]
hat jemand eine Idee für die Syntax ?



mfg themenstarter
 
Hallo,

& SmartTags("DB_Mess_MIF_Messwerte{2,"&ii&"}") & delimiter _

wenn du das so schreibst fügst du an die stelle einen Text.

& SmartTags("DB_Mess_MIF_Messwerte{2,ii}") & delimiter _

ii ist ja eine variable die du direkt einträgst dann sollte es gehen.


Gruß

Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hört sich für mich logisch an, allerdings ist die Syntaxprüfung anderer Meinung:

,Es wurde kein Objekt HMI_Variable mit dem Namen 'DB_Mess_MIF_Messwerte{23,ii}' gefunden in Zeile 190, Spalte 16,,,12:34:07
das für jede verwendete Variable


Ich habe bei HMI Variablen das ganze Feld per drag and drop eingefügt. Es sind alle Variablen einzelnd hinzu gefügt worden.
Also : {1,1} {1,2} usw da sollte es auch keine Probleme geben.

Ratlosigkeit macht sich breit.
 
Ich habe bei HMI Variablen das ganze Feld per drag and drop eingefügt. Es sind alle Variablen einzelnd hinzu gefügt worden.
Also : {1,1} {1,2} usw da sollte es auch keine Probleme geben.
Da wird es ganz sicher Probleme geben... ;) :cool:

Das Feld was in der PLC als Array mit 1200 DINT deklariert wurde hast Du nun als 1200 einzelne Variablen im HMI. In Deinem Skript versuchst Du die Namen der Variablen zusammenzubasteln, deshalb weiß die WinCC-Runtime höchstwahrscheinlich nichts von der Verwendung der Variablen und liest die erst NACH dem Zugriff im Skript aus der CPU. Im Skript werden alte Werte bzw. nie gelesene Werte verwendet.

Falls Du tatsächlich lieber mit einem Array arbeiten willst, dann wirf mal einen Blick in das TIA WINCC V13 Handbuch "Prozesse visualisieren / Arbeiten mit Arrays"
Da wird dokumentiert:
  • Arrays welche in WinCC benutzt werden, dürfen nur 1 Dimension haben
  • der untere Index muß mit 0 beginnen
  • auf Array-Elemente greift man in VBS mit der Syntax " SmartTags("Arrayname")(index) " zu, z.B. SmartTags("DB_Mess_MIF_Messwerte")(2)
  • Bei einem Zugriff auf ein Array-Element wird immer das komplette Array gelesen oder geschrieben. Kommunikationsüberlastung droht. Abhilfe: das komplette Array am Anfang des Skriptes in ein Skript-lokales Array einlesen.

Schau dir mal folgende Themen an:
http://www.sps-forum.de/hmi/73704-w...vieren-aktualisierungszeit-der-variablen.html
http://www.sps-forum.de/hmi/47637-p...uf-speicherkarte-eines-tp277-6-speichern.html
Benutze mal die Forums-Hilfe mit den Stichworten "vbs csv" und "vbs array"

Mache Dir mal eine Meldeanzeige für Systemmeldungen in ein Bild, damit Du die Runtime-Errors des Skriptes siehst.

Harald
 
Hallo

Ich habe letztens auch mal versucht eine Struktur, die ich aus der PLC übernommen habe (1512SP), auf diese Art zu adressieren, mir hat TIA gesagt das ich keine Strukturen mit Variablen Index adressieren kann. Vielleicht ist das eher das Problem.

Versuch doch eher deine 30 Messwerte als Array anzulegen und den Startpunkt deines Arrays im Script zu verschieben und anschließend die Werte in eine CSV zu schreiben, wenn mich nicht alles täuscht werden die Werte nach der Ausführung aktualisiert. Dazu müsstest du aber deinen Array Aufbau ändern. der letzte Array Bereich liegt immer hinter einander, also müsstest du den Array [1..30, 1..40] haben. Ich weiß nur nicht ob das bei dir Realisierbar ist.

Mir fällt gerade auf das in deinem Script die Arrays anders angesprochen werden als es bei mir bisher Funktioniert hat, bei nimmt TIA nur "SmartTags("PLC_Mux_Real")(0)" als Array Index an.

Gruß Neon
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na super:-(

dann kann ich mal alles ändern, ich werde dann nach jeder Messung die aktuellen Werte in die csv schreiben (eindimensionales Feld) diese müssen dann zyklisch gelesen werden.
Das array werde ich dann trotzdem in eine interne variable am Anfang schreiben.

Ich werde berichten wenn es fertig ist.

Danke schonmal
 
nicht nötig kannst doch die 40 Messerte 30 mal hintereinander in einen DB packen als 1200 Werte im DB.
Du weißt die Schrittweite pro Messwert und die pro Messung damit lässt sich immer die absolute Adresse im DB berechnen.

Gruß

Jens
 
Ja aber ich muss auch 1200 Varablen im HMI aktualisieren lassen. Die kann ich ja schlecht auch zyklisch stellen.

Ich werde das Feld in dem DB so lassen, ist alles fertig.Auch die abschließende Auswertung.
Aber das schreiben in die csv für die aktuellen Werte mache ich dann halt nach jeder Messung mit einem eindimensionalen array.
Das geht auch ist aber mehr Arbeit, ich hatte das ganze schon offline ohne Fehler in der Syntaxüberprüfung fertig und habe heute morgen an der Anlage gemerkt das es so nicht geht. Das ist nur ärgerlich.

....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein im HMI brauchst du nur eine.

Schau mal hier leg die erste Variable aus dem DB an und änder den wert Adresse in dynamisch dann kannst du durch deinen ganzen DB springen.

Adresse.png


Gruß

Jens
 
Du kannst trotz Allem mit deinem 2D-Array weiter arbeiten. Du mußt halt nur den Index dann selber berechnen. Dein 2D-Array wird ja von der Visu "geschluckt" - es kann allerdings nur 1D verarbeitet werden. Schau dir dazu einfach mal die Datensicht des DB's in der SPS an - ich kann es gerade schlecht beschreiben.
Du bekommst dann die Elemente des Array's 30,40 so gelesen :
meinArray[1,1] entspricht FlexArray[0]
meinArray[1,40] entspricht FlexArray[39]
meinArray[2,1] entspricht FlexArray[40]
meinArray[2,40] entspricht FlexArray[79]
usw.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es läuft :)

Ich habe nun nur noch ein array im HMI Messwerte_akt [0..29] of DINT
Hier schreibe ich nach jeder Messung die aktuellen Werte rein und füge Sie im Protokoll unten an.
Diese Werte stehen auf zyklisch aktualisieren und damit passt dann auch der Inhalt. Es gibt kein Bild auf dem die Werte drauf sind.
Das gleiche gilt für die Variablen im Kopf-Bereich der csv Datei.

Den anderen Vorschlag habe ich verstanden, die Frage ist ob ich es hätte umsetzten können wenn ich nur symbolisch adressiere?
Damit meine ich wie ich die Variabe bei HMI Variablen einfügen kann.
 
Zurück
Oben