TIA-Portal WinCC V11: Problem mit GetDataRecordName in Skript

HelmiMUC

Level-1
Beiträge
95
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich verzweifle noch an dem Skriptbefehl "GetDataRecordName" im TIA-Portal WinCC V11 (SP2, Update 5).

Vorab:
Ich habe zwei interne Variablen "act_Recipe_Name" und "act_dataset_name" - beide als Typ WString

Egal wie ich GetDataRecordName aufrufe, erhalte ich in der RunTime immer den Fehler "Typen unverträglich".

Ich hab folgendes probiert:

Code:
Dim function_state

Call GetDataRecordName(1, 1, SmartTags("act_Recipe_Name"), SmartTags("act_dataset_name"), function_state)
Call GetDataRecordName(1, 1, CStr(SmartTags("act_Recipe_Name")), CStr(SmartTags("act_dataset_name")), function_state)
Call GetDataRecordName(1, 1, CStr(act_Recipe_Name), CStr(act_dataset_name), function_state)
Jeder Aufruf gibt die o. g. Meldung.

Im WinCC flex 2008 funktioniert der erste Aufruf (mit SmartTags) problemlos.

Ich vermute, dass es Probleme mit dem Typ "WString" gibt. Denn WinCC Flex kennt nur den Typ "String"

Was könnte das Problem sein?
 
Hat für dieses Problem schon einer eine Lösung?

Ich sitze gerade auch vor diesem Problem.

Code:
Dim i, Rezeptname, Datensatzname, Status

Rezeptname = ""
Datensatzname = ""
Status = 0

Call GetDataRecordName (1, 1, Rezeptname, Datensatzname, Status)
SmartTags("recdataname") = Datensatzname

Beim aufrufen dieses Codes passiert in der Simulation nix. Keine Fehlermeldung, keine Ausgabe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Damit Du die Runtime-Fehlermeldungen siehst:
Mache in das Globale Bild ein Meldefenster für anstehende (und unquittierte) Meldungen rein und in irgendein Bild eine Meldeanzeige für Meldeereignisse. Bei beiden die Anzeige der Meldeklasse "System" aktivieren.

Harald
 
Ich habe nun noch zusätzlich eine Meldeanzeige eingefügt. Alle Meldeklassen aktiviert bei anstehende und nicht quittierte.
Dann habe ich mein Script auf ein Button gelegt und die Simulation gestartet.
Wieder nix. Datensatzname wurde nicht eingetragen und Fehlermeldung wurde auch nicht angezeigt.

Panel ist ein TP1500 Comfort
TIA V13 SP1 Update 1
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Harald für deinen Test,

das mit den Typen habe ich mir fast schon gedacht. Die Funktion verlangt "String" das Panel alleine kann aber nur "WString".
Ich habe den Siemens Support kontaktiert und warte nun auf die Antwort.
 
Hallo Helmi und Stefan,

folgende Syntax ist richtig (gerade getestet auf TIA V13 SP1 UPD4):


GetDataRecordName 1, 1, "act_Recipe_Name", "act_dataset_name", function_state


Diese Form der Parameterübergabe habe ich bis jetzt nur bei Siemens gesehen, scheint eine Übergabe des Variablennamens zu sein und nicht der Variable selbst.

Muss man auch erst einmal drauf kommen...:confused:


Gruß, Fred
 
TIA-Hilfe zu GetDataRecordName
Rezepturname
Die Variable, in die der Rezepturname geschrieben wird. Die Variable muss vom Typ STRING sein.

Datensatzname
Die Variable, in die der Name des Rezepturdatensatzes geschrieben wird. Die Variable muss vom Typ STRING sein.

Das geht anscheinend nur mit globalen Panel-Variablen (SmartTags-Variablen).

Probiere mal:
Code:
Dim Status

Status = 0

GetDataRecordName 1, 1, SmartTags("Stringvariable_RezepturName"), SmartTags("Stringvariable_DatensatzName"), Status

'GetDataRecordName 1, 1, Stringvariable_RezepturName, Stringvariable_DatensatzName, Status
'ist das selbe, man sieht nur nicht so deutlich die SmartTags-Verwendung

(Es könnte sein, daß man in dem verhuntzten TIA nun die Variablennamen in Anführungsstrichen schreiben muß - doch wie unterscheidet TIA dann zu String-Literalen?)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will im Script diese Variable danach noch weiter verwenden, weswegen ich Sie im Script brauche.
Der Umweg über die SPS-Variable kann zwar funktionieren aber entspricht nicht meiner Vorstellung von Qualität.

Wenn ich in die Funktion die Variable als SmartTag schreibe, bemängelt der Compiler das es sich im einen falschen Parametertypen handelt.
-> Weil die Variable halt ein WString ist und kein String.

Bei ihrer tollen Umstellung auf WString, haben die TIA Leute wohl vergessen die Funktion umzustellen...

Ich bin auf die Antwort des Supports gespannt.
 
SmartTags("Stringvariable_RezepturName") heißt nicht, daß das eine SPS-Variable sein muß. Das soll eine Runtime-interne Variable sein mit dem Datentyp String.
Um die Variablen wenigstens ein bisschen zu kapseln, kann man sie ja in extra Ordnern anlegen: SmartTags("SkriptVars\Stringvariable_RezepturName")

Ich glaube nicht, daß dieses störrische Verhalten mit TIA oder WString eingeführt wurde - es war schon in WinCC flex so, daß es nicht mit Skript-internen Variablen funktioniert, sondern nur mit globalen Variablen (SmartTags).

Rezepturname und Datensatzname in Skript-Variablen holen:
Code:
Dim Rezeptname, Datensatzname, Status

Status = 0

GetDataRecordName 1, 1, SmartTags("SkriptVars\Stringvariable_RezepturName"), SmartTags("SkriptVars\Stringvariable_DatensatzName"), Status
Rezeptname = SmartTags("SkriptVars\Stringvariable_RezepturName")
Datensatzname = SmartTags("SkriptVars\Stringvariable_DatensatzName")
...

Harald
 
Zuletzt bearbeitet:
Hallo Harald,

OK ich verstehe das mit den Globalen Variablen.
Man kann ich TIA aber keine "String" Variablen anlegen, es gibt nur noch "WString" Variablen. Deshalb meine Vermutung mit der Umstellung auf "WString" Variablen.

String Variablen kann das Panel nur verarbeiten wenn Sie von einer SPS-Verbindung kommen.

Siehe Bild:
GetDataRecordName.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann ich TIA aber keine "String" Variablen anlegen, es gibt nur noch "WString" Variablen.
Die Funktion verlangt "String" das Panel alleine kann aber nur "WString".
Ich habe den Siemens Support kontaktiert und warte nun auf die Antwort.
Ahh, jetzt verstehe ich das Problem mit TIA: für interne Variablen gibt es den Datentyp STRING gar nicht. Jedenfalls laut TIA Dokumentation schon mindestens seit V11. Da sollte es nach sooo langer Zeit doch eine Lösung geben - also berichte uns bitte, was der Siemens Support antwortet.

Harald
 
Der Siemens Support hat geschrieben.

1. Die Funktion mit den SmartTags von Harald wird vermutlich funktionieren.
Der Support hat folgenden Syntax empfohlen:

Code:
GetDataRecordName SmartTags("Script_RezeptNr"), SmartTags("Script_DatensatzNr"), "Script_Rezeptname", "Script_Datensatzname", "Script_Status"

2. Warum funktionierte dies bei mir nicht?

Ich habe in ein Bild eine Schaltfläche und ein E/A Feld zum Testen erstellt. Die Schaltfläche hat das Script gestartet, das E/A Feld den Datensatznamen ausgegeben.
Zum Testen des Scriptes habe ich die Simulation immer aus diesem Testbild gestartet. -> Script ging nicht.
Wenn ich die Simulation aus dem Script-Editor starte -> Simulation startet mit Startbild. Ich navigiere zum Testbild -> Script geht

Es ist also wohl ein Bug in der TIA Portal Simulation. Ich werde jetzt grundsätzlich sie Simulation so Starten das sie vom Startbild aus startet.


Stefan
 
Zuletzt bearbeitet:
Ich habe dieses TIA nicht, möchte aber gerne die undokumentierten Fallstricke kennen, falls ich mal muß...

Zum Testen des Scriptes habe ich die Simulation immer aus diesem Testbild gestartet. -> Script ging nicht.
Wenn ich die Simulation aus dem Script-Editor starte -> Simulation startet mit Startbild. Ich navigiere zum Testbild -> Script geht
Verstehe ich das richtig, daß das TIA die Panel-Simulation unterschiedlich ausführt, je nachdem aus welchem Bearbeitungsfenster man die startet??! Versucht TIA, nur ein einzelnes Bild zu "simulieren"???
Oder hattest Du die falsche Simulation gestartet? Wie heißt der Menüpunkt bzw. Button genau?



Der Support hat folgenden Syntax empfohlen:

Code:
GetDataRecordName SmartTags("Script_RezeptNr"), SmartTags("Script_DatensatzNr"), "Script_Rezeptname", "Script_Datensatzname", "Script_Status"
Die Variablen "Script_Rezeptname", "Script_Datensatzname", "Script_Status" - sind das SmartTags oder Variablen, welche im Skript mit Dim deklariert sind?

Bei diesem Code werden nicht Variablen übergeben, sondern Variablennamen in String-Konstanten. Wenn man unsinnige/nicht vorhandene Variablennamen angibt ("Script_Variable_xxx"), erkennt der Compiler das oder crasht es erst zur Laufzeit?

Hat der Support etwas gesagt, wann die fehlerhafte bzw. unvollständige Dokumentation korrigiert wird und dieser Trick in die offizielle Dokumentation eingepflegt wird?


Übrigens hatte schon Fred (faust) in #7 diese Schreibweise angegeben:
folgende Syntax ist richtig (gerade getestet auf TIA V13 SP1 UPD4):


GetDataRecordName 1, 1, "act_Recipe_Name", "act_dataset_name", function_state


Diese Form der Parameterübergabe habe ich bis jetzt nur bei Siemens gesehen, scheint eine Übergabe des Variablennamens zu sein und nicht der Variable selbst.
@Fred: Weißt du noch, WO Du das bei Siemens gesehen hast? Gibt es eine offizielle/öffentliche Quelle?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
@Fred: Weißt du noch, WO Du das bei Siemens gesehen hast? Gibt es eine offizielle/öffentliche Quelle?

Harald

Das kann ich nicht sagen, ich hatte/habe das damals (WinCC flex.) bzw. vor meinem Posting (WinCC Adv.) selbst herausgefunden.

Siemens nutzt diese Art der Parameterübergabe bei einigen Systemfunktionen, weiß gerade nicht bei welchen noch.


Gruß, Fred
 
Hallo,

@Harald
Ja es scheint so als ob TIA die Simulation unterschiedlich ausführt. Gestartet habe ich sie immer über das PC Symbol in der Symbolleiste (sprich die "Standard-Simulation" = Online -> Simulation -> Starten ).
Jedenfalls ist es für die sonstige Bedienung der Simulation egal wie sie gestartet wird. Es fallen keine unterschiede auf.
Dieses Verhalten habe ich auch den Support geschildert allerdings noch keine Antwort erhalten.

Die Variablen in "Script_Rezeptname", "Script_Datensatzname", "Script_Status" sind interne HMI Variablen. Ebenfalls sind allerdings auch die Variablen mit "SmartTag" interne HMI Variablen.
Wenn man "SmartTag" schreibt sind es richtige Variablen, wenn man sie nur mit "" schreibt werden sie als Konstanten interpretiert.

Über die Dokumentation wurde nichts gesagt.

Nochmal das vollständige lauffähige Script:
Code:
Dim i

For i = 1 To 8
 SmartTags("Script_DatensatzNr") = i
 GetDataRecordName 1, SmartTags("Script_DatensatzNr"), "Script_Rezeptname", "Script_Datensatzname", "Script_Status"
 Do
  If Script_Status = 12 Then
   SmartTags("Anzahl_Datensätze") = i - 1
   Exit For
  End If
 Loop Until Script_Status = 4
 Select Case i
  Case 1
   SmartTags("Datensatz_1") = Script_Datensatzname
  Case 2
   SmartTags("Datensatz_2") = Script_Datensatzname
  Case 3
   SmartTags("Datensatz_3") = Script_Datensatzname
  Case 4
   SmartTags("Datensatz_4") = Script_Datensatzname
  Case 5
   SmartTags("Datensatz_5") = Script_Datensatzname
  Case 6
   SmartTags("Datensatz_6") = Script_Datensatzname
  Case 7
   SmartTags("Datensatz_7") = Script_Datensatzname
  Case 8
   SmartTags("Datensatz_8") = Script_Datensatzname  
 End Select
 Script_Status = 0
Next

Var_TIA.PNG

Welche TIA Version hast du denn Harald?

Stefan
 
Hallo!

Ich muss das Thema noch einmal ausgraben. Habe etwas Ähnliches vor wie Stefan592.
Ich würde gerne anstatt "Script_Status" eine Scriptinterne Variable (welcher vorher mit DIM erzeugt wurde) verwenden.
Dabei bekomme ich aber immer die Fehlermeldung Pufferüberlauf.
Weiß jemand was ich da falsch mache?
 
Zurück
Oben