TIA TIA VBS GetDataRecordName über Schleife auslesen

bernchen

Level-2
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,

habe hier ein kleines Problem mit dem Syntax im TIA VBS, explizit der o.g. Funktion.

Folgende Situation: Ich habe hier ein altes inTouch-Panel, das nun über Siemens RT Advanced auf einem Single Station PC umgesetzt werden soll.
Viele der Funktionen die es dort gibt, kann ich leider nicht 1:1 so im TIA Portal umsetzen und muss bisschen basteln.
Ursprünglich wurden die Rezepturen über eine Access-Datenbank an einen SQL-Server übertragen und über SQL in das inTouch-Panel.
Nun soll das ganze über die Rezeptverwaltung von Siemens umgesetzt werden. Soweit ja nicht weiter schlimm.

Der Bediener soll nun die Möglichkeit haben, gewisse Rezepte über Eingabe des Datensatznamens ein "Reihe" zu schalten.
Gibt der Bediener nun einen Namen ein, muss die Datenbank abgeglichen werden und ggf. ein Fehler bei falscher Eingabe ausgegeben werden.

Wollte also einfach die Gesamtzahl der Rezepte mit einer For-Schleife durchlaufen lassen und jeden Schritt GetDataRecordName aufrufen, für die Datensatznummer die Laufvariable nutzen und dann jeweils den aktuellen Datensatznamen mit der Eingabe abgleichen.

Habe bisschen gegoogled und auch das Forum durchforstet und bin auf einen Fehler in der Funktion Seitens Siemens gestoßen, hier müssen die Parameter anscheinend als Konstanten deklariert werden, weil die Funktion ansonsten nur Fehler ausspuckt.
Sieht dann folgendermaßen aus:

For i = 0 To 500
SmartTags("Script_DatensatzNr_2") = i
GetDataRecordName 1, SmartTags("Script_DatensatzNr_2"), "Script_Rezeptname_2", "Script_Datensatzname_2", "Script_Status"
Next

Dadurch dass sich die Funktion aber nur mit einer Konstanten "Script_Datensatzname_2" aufrufen lässt, hab ich keine Möglichkeit im nächsten Schritt die Strings abzugleichen, da sich der Wert in "Script_Datensatzname_2" nicht ändert....
Sobald ich statt der Konstanten eine lokale Variable oä. nehme gibt mir Siemens dann im Meldefenster einen Fehler aus, dass der Datentyp nicht richtig sei....

Hoffe mein Problem ist einigermaßen verständlich.

Im Anhang einmal das Skript, die Fehlermeldung, wenn ich keine Konstante verwende, sondern eine normale Variable und einmal die Ausgabe der 1. Zeile in der leider zu sehen ist, dass die Variable nicht beschrieben wird.

Besten Dank für eure Hilfe.
 

Anhänge

  • Typenkonflikt.PNG
    Typenkonflikt.PNG
    3,8 KB · Aufrufe: 17
  • Meldefenster.PNG
    Meldefenster.PNG
    5,9 KB · Aufrufe: 17
  • Qualitaet_suchen.PNG
    Qualitaet_suchen.PNG
    27,3 KB · Aufrufe: 16
Hallo Bernchen.

In Kürze:
Die WinCC-Systemfunktionen zur Rezepturbehandlung werden quasi asynchron ausgeführt, das bedeutet u.a., dass ein Script NICHt auf das Ende der Funktionsausführung wartet. Dazu passt auch die Systemmeldung "Datensatzbearbeitung nicht möglich, ...".

Abhilfe: Du musst den Rückgabewert der Systemfunktion nutzen (2: Funktion läuft, 4: Funktion erfolgreich, 12: Funktion mit Fehler beendet
So würde beispielsweise deine Schleife angepasst aussehen:
Code:
For i = 0 To 500
    SmartTags("Script_DatensatzNr_2") = i
    GetDataRecordName 1, SmartTags("Script_DatensatzNr_2"), "Script_Rezeptname_2", "Script_Datensatzname_2", "Script_Status"
    While SmartTags("Script_Status") = 2 : Wend
Next


Gruß, Fred
 
Dadurch dass sich die Funktion aber nur mit einer Konstanten "Script_Datensatzname_2" aufrufen lässt, hab ich keine Möglichkeit im nächsten Schritt die Strings abzugleichen, da sich der Wert in "Script_Datensatzname_2" nicht ändert....
"Script_Datensatzname_2" ist doch keine Konstante, sondern eine HMI-Variable vom Datentyp WString.
Der Wert in der HMI-Variable "Script_Datensatzname_2" wird sich erst ändern, wenn der Bearbeitungsstatus (deine Variable "Script_Status") von 2 auf 4 geht, das wertest Du aber gar nicht aus.

Bearbeitungsstatus
2 = Systemfunktion wird gerade ausgeführt.
4 = Systemfunktion wurde erfolgreich beendet.
12 = Systemfunktion wurde nicht ausgeführt, weil ein Fehler aufgetreten ist.

Teste das erstmal nur für wenige Rezepturdatensätze, weil das könnte eine Weile dauern und solange sind alle weiteren Skripte blockiert. (Ich würde sogar während dem Skript die Schleifenvariable i (also die HMI-Variable "Script_DatensatzNr_2") in einem Ausgabefeld oder einem Fortschrittsbalken anzeigen.)
Daß die Systemfunktion nur mit HMI-Variablen aufgerufen werden kann, hat damit zu tun, daß sie asynchron arbeitet und länger braucht. Man könnte nach Absetzen der Funktion das Skript beenden (da werden alle Skript-internen Variablen ungültig) und außerhalb des Skripts auf Änderung der Bearbeitungsstatus-Variable warten.

Code:
Dim i, rdStat, ...

For i = 0 To 4
    SmartTags("Script_DatensatzNr_2") = i
    GetDataRecordName 1, SmartTags("Script_DatensatzNr_2"), _
                      SmartTags("Script_Rezeptname_2"), SmartTags("Script_Datensatzname_2"), SmartTags("GDRN_Status")

    Do
        rdStat = SmartTags("GDRN_Status")
    Loop While (rdStat And 4) = 0 Or SmartTags("Suche_Abbrechen") <> 0 ' 4=fertig OK / 12=abgebrochen mit Fehler

    If SmartTags("Suche_Abbrechen") <> 0 Then Exit For

    If rdStat = 4 Then
        If SmartTags("Script_Datensatzname_2") = quali Then
            gefunden = 1
            ShowSystemAlarm "Datensatz gefunden mit Nr: " & i
            ' ...
        End If
'    ElseIf rdStat = 12 Then
'        ShowSystemAlarm "Kein Datensatz gefunden für Nr: " & i
    End If

Next

PS: was ist denn das für eine furchtbare Schriftart im Skript-Editor? Kann man ja fast nicht lesen.
PPS: Welche TIA Version verwendest Du?
PPPS: zu lange getippselt...

Harald
 
Zuletzt bearbeitet:
Zurück
Oben