TIA VBScript Smarttags schreiben

Azrael666

Level-1
Beiträge
239
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich hab mal wieder ein Problem. Verwende aktuell WinCC V14 Professional

Ich habe in meinem Projekt eine HMI Variable, die eine projektierte Verbindung zur SPS hat.
Diese Variable ist ein ARRAY [0..1999]

Ich habe ein Script geschrieben, dass mir über eine Schleife diese Variable beschreiben soll.
Das Problem ist, sie beschreibt diese Variablen nur, wenn ich sie vorher einem E/A Feld zuweise.

Weiß jemand eine Lösung zu diesem Problem?
 
Ja,
du musst die Zugriffsart der Variable auf zyklisch fortlaufend einstellen. Ansonsten wird die Variable nie aktualisiert.
Sobald du sie in ein E/A Feld legst, wird sie aktualisiert, weil sie vermutlich auf zyklisch bei Verwendung steht.

Mit Grüßen
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja,
du musst die Zugriffsart der Variable auf zyklisch fortlaufend einstellen. Ansonsten wird die Variable nie aktualisiert.
Sobald du sie in ein E/A Feld legst, wird sie aktualisiert, weil sie vermutlich auf zyklisch bei Verwendung steht.

Mit Grüßen

Danke für den Tipp, hab ich aber schon auf "Zyklisch Fortlaufend" stehen. In beiden Fällen funktioniert es nur wenn ich sie vorher einem E/A - Feld zuweise
 
Code:
If fso.FileExists(tagFilename) Then         
Dim objFile : Set objFile = fso.OpenTextFile(tagFilename, 1, 0, -2)
        
        If Case_ID = 1 Then
            Dim i : i = 0
            Do While i < Header
            objFile.SkipLine
            i = i+1
            Loop
            
            Dim strLine, objTag
            Dim j :  j = 0
            Do While j <> Fl
            strLine = objFile.ReadLine
                    
            Set objTag = SmartTags("RAW_INPUT_ARRAY_0"&"["&j&"]")
            objTag.Value = strLine
            j = j+1
            shell.Popup objTag
            Loop
                
            SmartTags ("Daten_bereit") = True
                                
        End If
        
Else shell.Popup "Datei nicht gefunden",4        
End If

Das ist der Code den ich ausführe. Ich nutze übrigens zum Testen den PLCSim, evtl. ist das ja relevant.

Zu deiner Frage, wenn ich zum Beispiel auf einem Bild, E/A- Felder für ARRAY[0] bis ARRAY[25] anlege und dann das Script ausführe, bekomme ich in jedem Datenfeld den korrekten Wert geschrieben. Wenn ich jetzt diese Felder lösche und die Runtime neustarte, dann funktioniert es auch noch mit dem Schreiben.
Wenn ich jetzt allerdings das Projekt schließe oder auf "Übersetzen -> Bausteine komplett übersetzen" gehe, dann funktioniert es danach wieder nicht mehr.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Azrael,
ich nehme mal an, dass es sich hier nicht wirklich um ein Array handelt sondern um deine String-Variablen, die du anders nicht Array-siert bekommst.
Du hast jetzt folgendes Problem : Dadurch, dass du den Variablennamen nicht im Klartext sondern als selbst erstellten Namensstring verwendest "weiß" TIA beim Übersetzen gar nicht von welcher Variablen hier die Rede ist. Wobei, das will ich hier ausdrücklich sagen, für mich diese Vorgehensweise vollkommen legitim so ist. Auf jeden Fall ... ich vermute hier sehr stark, dass dadurch die Variable nicht wirklich aktualisiert wird, da du sie ja auch noch schreibst (zur SPS) - beim Lesen aus der SPS müßte es eigentlich so gehen (also mjit Aktualisierung "zyklisch fortlaufend").
Dadurch, dass du die Variablen im Klartext noch irgendwelchen Bildelementen zuordnest umgehst du das - das würde wahrscheinlich auch funktionieren, wenn du die im Klartext im Script beschreiben würdest.
Das Eine wie das Andere stelle ich mir bei 1999 Variablen sehr "lustig" vor - vor Allem im Hinblick auf dein eigentliches Projekt (ich denke wir sprechen auch hier immer noch von der Ablauf-Datei mit den ca. 60000 Eintragszeilen mit jeweils x Variablen unterschiedlichen Typs darin).

Du wirst im Zuge deine weiteren Beschäftigung mit diesem Thema noch viele weitere Unzulänglichkeiten von TIA / WinCCFlexibel aufdecken, die dich immer wieder zum Stillstand bringen.
Ich würde dir wirklich empfehlen, in deinem Haus den Einen oder Anderen der gemachten Vorschläge ernsthaft zu erwägen - ich würde jetzt allerdings nicht werten wollen, welches der beste Weg ist ...

Gruß
Larry
 
@ Larry Laffer,
:) ja du hast in der Tat recht, es handelt sich um ein weiteres kleines Teilproblem meines "Großproblems"
Ok ich hab es schon irgendwie vermutet, dass es etwas mit dem zusammensetzen des Arrays in VBScript zu tun hat. Dies war aber die einzige Variante, die ich gefunden hatte um in der Schleife Step-by-Step die Werte schreiben zu können bzw die VBScript ohne Syntaxfehler geschluckt hat (RAW_INPUT_ARRAY_0[j] mag er nicht) .

PS: Die Variabel "RAW_INPUT_ARRAY_0" ist in WinCC als ARRAY[0..1999] of STRING angelegt und mit einer identischen Variable in einem SPS-DB verknüpft.
 
Zuletzt bearbeitet:
Wenn ich jetzt diese Felder lösche und die Runtime neustarte, dann funktioniert es auch noch mit dem Schreiben.
Wenn zwischen dem Felder löschen und dem Runtime neustarten auch noch übersetzen und Runtime laden stattfand, dann dürfte es schon da nicht mehr funktionieren. Wenn doch, dann ist das ein Bug.

Ansonsten schließe ich mich Larry an und meine, daß WinCC Advanced für Deine Aufgabe mit den zigtausend csv-Zeilen in die SPS übertragen absolut nicht geeignet ist. Es ist auch nicht förderlich, daß dies offenbar Dein erstes Projekt mit WinCC-VBS ist, weil da lauern sooo viele spezielle Fallstricke und Unzulänglichkeiten, die man für wenige Variablen aufwendig gerade so umschifft bekommt, aber für zigtausend csv-Zeilen wird es quasi unlösbar, weil viel zu aufwendig und untragbar unperformant. Was nützt es, wenn ein erfahrener WinCC-VBS-Programmierer ein...zwei Manntage Arbeit aufwendet und die Lösung dann 15 Minuten für die Übertragung braucht? Oder wenn ein unerfahrener Programmierer eine Woche Arbeit reinsteckt und am Ende funktioniert es immer noch nicht sicher? Die WinCC-Advanced-Runtime ist keine geeignete Ablaufumgebung für das Übertragungsprogramm, selbst wenn man in dem VBS die Libnodave-DLL verwenden würde. Ich meine, für Deine Aufgabe brauchst Du eine externe Exe und S7-Kommunikation oder einen TCP-Server.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn zwischen dem Felder löschen und dem Runtime neustarten auch noch übersetzen und Runtime laden stattfand, dann dürfte es schon da nicht mehr funktionieren. Wenn doch, dann ist das ein Bug.

Ansonsten schließe ich mich Larry an und meine, daß WinCC Advanced für Deine Aufgabe mit den zigtausend csv-Zeilen in die SPS übertragen absolut nicht geeignet ist. Es ist auch nicht förderlich, daß dies offenbar Dein erstes Projekt mit WinCC-VBS ist, weil da lauern sooo viele spezielle Fallstricke und Unzulänglichkeiten, die man für wenige Variablen aufwendig gerade so umschifft bekommt, aber für zigtausend csv-Zeilen wird es quasi unlösbar, weil viel zu aufwendig und untragbar unperformant. Was nützt es, wenn ein erfahrener WinCC-VBS-Programmierer ein...zwei Manntage Arbeit aufwendet und die Lösung dann 15 Minuten für die Übertragung braucht? Oder wenn ein unerfahrener Programmierer eine Woche Arbeit reinsteckt und am Ende funktioniert es immer noch nicht sicher? Die WinCC-Advanced-Runtime ist keine geeignete Ablaufumgebung für das Übertragungsprogramm, selbst wenn man in dem VBS die Libnodave-DLL verwenden würde. Ich meine, für Deine Aufgabe brauchst Du eine externe Exe und S7-Kommunikation oder einen TCP-Server.

Harald

Es ist auch demnächst ein Termin mit dem Kunden anberaumt, wo diese Möglichkeiten bzw. Probleme angesprochen werden sollen.
In der Zwischenzeit wollte ich den Versuch mit VBScript noch nicht so einfach verwerfen. Schon alleine aus dem Grund dass man ja nie Auslernt. Und so sammel ich zumindest schonmal weitere Erfahrung in diesem Bereich.

Kennt ihr vieleicht noch eine Möglichkeit, die Arrays in der Schleife durchlaufen zulassen? Meine Version funktioniert ja wohl nur mit E/A Feldern.
Oder gibt es eine Möglichkeit einem E/A-Feld dynamisch Variablen zuzuweisen?
 
Ja ... das meinte ich.
Ich kann mir das im Augenblick nur so erklären, dass das an deinem String-Array liegt.
In meiner (allerdings TIA V13-) Applikation habe ich das so (wie oben) gemacht - allerdings mit REAL-Variablen ...
 
Guten Morgen,
also ich hab scheinbar ne Möglichkeit gefunden wie es funktioniert.
Und zwar habe ich folgendes gemacht:
- Ein neues VBScript angelegt und in dieses folgende Werte geschrieben
Code:
Smarttags("RAW_INPUT_ARRAY_0[0]")=Smarttags("RAW_INPUT_ARRAY_0"&"["&"0"&"]")
Das Ganze für alle Werte von 0 bis 1999.

Ist also ne ziemliche Liste (lässt sich ganz gut mit Excel erzeugen)
Dieses Script muss ich jedoch weder ausführen noch irgendwo verwenden, es muss einfach nur existieren

Jetzt kann ich den kompletten Array mit meinem anderen Script beschreiben

PS: ich vermute mal das es keine besonders elegante Methode darstellt :D

Gruß
 
Also ... erstmal zu der indirekten Adressierung :
Ich muss tatsächlich zugeben, dass ich hier mit internen Variablen gearbeitet habe. Vom Grundsatz sollte es da jedoch keinen Unterschied zu den SPS-Variablen (Array's) geben. Ich werde das später auf jeden Fall noch einmal checken ...

Nun zu deinem "Work-Around" :
Wenn das funktioniert dann nur deshalb, weil du vorne die Variable nicht zusammengesetzt benennst. Damit kennt die Visu sie (irgendwie) - wobei sie die Variable aus meiner Sicht auch allein schon aus ihrer Deklaration in der Variablenliste heraus kennen sollte. Das ein nicht verwendetes Script dann dazu führt, dass du sie (die Variable) auch zusammengesetzt (also mit einem selbst erstellten String) verwenden kannst ist witzig - aber überhaupt nicht logisch. Ich glaube dir, dass das funktioniert - ich halte das aber für einen Bug (der vielleicht irgendwann einmal von Siemens aufgedeckt und beseitigt wird). Darauf würde ich so nicht setzen ...
Auf jeden Fall halte ich es aber für unpraktikabel, deine Applikation mit Code (in dem Fall Scripten) vollzupropfen deren Sinn nicht wirklich ersichtlich ist - du mußt hier dann auch vielleicht "ein bißchen" an die denken, die nach dir kommen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich vermute mal, dass es so ist, dass WinCC beim übersetzen schaut welche von den PLC_Variablen überhaupt in irgendeiner Form verwendet wird.
Da ich aber die expliziten Arrays gar nicht in der Visu verwendet habe (sondern nur etwas "Zusammengebautes"), werden sie beim übersetzen vermutlich einfach ignoriert um Systemressourcen zu sparen.
Dadurch dass ich jetzt jedes einzelne Array-Element einmal in ein Script eingetragen habe, erkennt WinCC vermutlich beim übersetzen, dass sie verwendet wird.
Evtl. müsste ich noch nichtmal die komplette Zuweisung schreiben, sondern einfach nur einmal jede Variabel auflisten.
 
Und zwar habe ich folgendes gemacht:
- Ein neues VBScript angelegt und in dieses folgende Werte geschrieben
Code:
Smarttags("RAW_INPUT_ARRAY_0[0]")=Smarttags("RAW_INPUT_ARRAY_0"&"["&"0"&"]")
Das ist jeweils eine Zuweisung auf sich selber - rechts wird der selbe Variablenname zusammengebastelt wie links direkt angegeben. Wozu soll das gut sein, außer daß ein Zugriff ausgelöst bzw. dokumentiert wird?

Dieses Script muss ich jedoch weder ausführen noch irgendwo verwenden, es muss einfach nur existieren
Bist Du sicher daß Du es nirgendwo verwendest/referenzierst? Es scheint so, daß dadurch, daß jede einzelne Variable im Skript aufgeführt ist, die RT von der Verwendung der Variablen weiß und deshalb auch die Variablen selber aktualisiert werden. Wenn das Skript nirgends verwendet oder referenziert wird, dann darf das blose Vorhandensein des Skriptes nicht die Arbeitsweise der RT beeinflussen - wenn doch, dann wäre das ein Bug. Wie sieht es nach einem komplett-Übersetzen aus?

Jetzt kann ich den kompletten Array mit meinem anderen Script beschreiben
Wie machst Du das? Hast Du mal 'ne Programmzeile?
Kommen Deine Zuweisungen auch in der SPS an?
Erhältst Du Systemmeldungen wegen Kommunikationsüberlastung? Kannst Du Systemmeldungen in der WinCC RT sehen?

Irgendwie scheint da was ganz falsch zu laufen. Die Schreibweise SmartTags("RAW_INPUT_ARRAY_0[0]") adressiert kein Array-Element, sondern eine HMI-Variable mit dem Name "RAW_INPUT_ARRAY_0[0]". Die offizielle bisher korrekte Schreibweise für die Adressierung eines Array-Elementes ist SmartTags("RAW_INPUT_ARRAY_0")(i) - hat Siemens da wieder was 'rumgeschraubt an der symbolischen Adressierung?
Noch ein Problem: normalerweise/bisher löst jeder Zugriff auf ein externes Array ein Lesen oder Schreiben des gesamten Arrays aus - gilt das nicht mehr? Bekommst Du Systemmeldungen wegen Kommunikationsüberlastung?

Harald
 
Zu 1) wie gesagt, ich weiß noch nicht genau ob das überhaupt notwendig ist, solch eine Zuweisung zu machen.

Zu 2) Nein das Script wird nirgends verwendet, es ist einfach nur vorhanden. Auch nach einem Komplett-Übersetzen funktioniert es (nicht ohne Problem, siehe unten)

Das Problem das jetzt aktuell auftritt ist, dass mir sobald ich die Runtime starte, die SPS-Simulation "abschmiert". Wenn ich z.b. in einen DB schaue, kann ich keine Onlinedaten mehr dort sehen. Die Powertags werden vermutlich (kann es ja nicht sehen) auch nicht in die SPS geschrieben.
Außerdem bekomm ich ne Fehlermeldung "Systeminterner Fehler: Fehlercode 46". Ob das jetzt nur was mit der PLCSim zu tun hat oder auch bei ner echten SPS der Fall wäre, keine Ahnung.
Muss mal schaun ob ich die Ursache finde, oder ob es tatsächlich einfach so ist, dass ich mit meinen zig Tausend Variablen (die alle 100ms aktualisiert werden) die Datenkommunikation zerlege.

Zu 3) Ich nutze eine ganz normale While-Schleife um die Daten in die Arrays zu schieben.
Da habe ich herausgefunden:
interne Arrays : Smarttags("Array")(i)
Powertags : Smarttags("Array")

Zu deiner Frage wegen der Kommunikationslast (siehe Problematik oben :D)

PS: bei einer Test mit nur 26 geschriebenen Variablen des Array, hat es funktioniert. Wurde alles korrekt in den SPS-DB übertragen.
 
Zuletzt bearbeitet:
Zurück
Oben