WinCC flexible VBScript Parameter an Funktion übergeben

xperia

Level-2
Beiträge
43
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Ich will in WinCCflexible ein paar Parameter an eine Funktion übergeben welche ich dann öfters aufrufe.

In den Einstellungen des Skripts bleibt aber das "Hinzufügen", "Ändern", "Entfernen" von Parametern ausgegraut.

Ich verwende eine flexible Runtime.

Was mache ich falsch bzw. muss ich die Parameter irgendwie anders übergeben?
 
Morgen
Ein zusammenklicken von Einstellungen zur Parameterübergabe geht in Scripten nicht. Dies musst du schon selber programmeieren.
z.B. "Funktion Meine_Funktion(ByVal Parameter1, ByRef Parameter2, ByVal Parameter3) Antwort"
Ob ByVal oder ByRef definiert wird, hängt von der Deklaration der Variablen ab.
Grüsse Holger
Schöne Ostern
 
Wie deklariere ich die Variablen in flex, im TIA portal ist das einfach weil ich hier meine Parameter nur anklicken und auswählen muss ob ByVal oder ByRef.
 
WinCC flexible Information System > Arbeiten mit WinCC flexible > Systemfunktionen und Runtime Scripting > Erstellen von Skripten > ...
oder schneller: Index > Skript > ... (projektieren, Parameterübergabe, ...)

WinCC flexible Information System - Neues Skript erstellen schrieb:
Wenn Sie im Skript Parameter benötigen, dann geben Sie im Eigenschaftsfenster den Parameternamen ein und klicken Sie auf "Hinzufügen".
siehe auch Beitrag #3 von Thomas_v2.1
Den Beitrag #2 von holgermaik kannst Du ignorieren, der hat nichts mit VBS unter WinCC flexible zu tun.

Datentyp und Übergabeart ByVal/ByRef kann nicht festgelegt werden.

WinCC flexible Information System - Aufruf von Skripten und Systemfunktionen in Skripten schrieb:
Parameter werden beim Aufruf eines Skripts als "Call by Reference" übergeben.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habs grad mal getestet. Es scheint so als ob die Parameter ByVal und nicht ByRef sind.

Code:
Sub TestByRefAendern( val1 )
val1 = 100
End Sub

und Testfunktion die über eine Schaltfläche aufgerufen wird:
Code:
Dim inValue
inValue = SmartTags("IntWertTest1")
TestByRefAendern(inValue)
SmartTags("IntWertTest2") = inValue

Dann hat IntWertTest2 nach Aufruf immer den gleichen Wert wie IntWertTest1, und nicht 100.

Edit:
getestet auf der PC Runtime, WinCCflex 2008 SP2 Upd3.
 
Datentyp und Übergabeart ByVal/ByRef kann nicht festgelegt werden.

Code:
Meine_Funktion(var1,var2, "ref1", "ref2")

Code:
Sub Meine_Funktion(Zahl1,Zahl2, Name1, Name2)

  HMIRuntime.SmartTags(Name1) = [I]......[/I]

End Sub

var1 und var2 wird als ByVal übergeben.
ref1 und ref2 wird als ByRef übergeben.
Grüsse Holger
 
Code:
Meine_Funktion(var1,var2, "ref1", "ref2")

Code:
Sub Meine_Funktion(Zahl1,Zahl2, Name1, Name2)

  HMIRuntime.SmartTags(Name1) = [I]......[/I]

End Sub

var1 und var2 wird als ByVal übergeben.
ref1 und ref2 wird als ByRef übergeben.
Ich bin zwar nicht der Vb-Experte, aber ich sehe da keine Unterscheidung in ByVal oder ByRef.
So wie du das verwendest, werden einzig und allein die Tagnamen "ref1" und "ref2" als Stringliterale übergeben. Das hat überhaupt nichts mit ByVal oder ByRef zu tun.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Thomas:
Naja ... der Trick ist schon interessant.
Dadurch, dass Holger den Item-Namen übergibt und den in seiner Funktion zum Adressieren des SmartTags hernimmt, ist es im Grunde schon das Verwenden als Referenz - es wird ja mit den gewünschten Variablen direkt gearbeitet und nicht mit deren Wert.
Ob das in jedem Fall aber immer praktikabel einsetzbar ist (Objekt-Referenz) ist eine andere Sache ...

Gruß
Larry
 
Morgen
Die ganze Sache ist bei Flex sicherlich nicht entscheidend Aufgrung der beschränkten Fähigkeit von Scripten. Wer aber mit Scripten anfängt landet wahrscheinlich auch irgendwann bei WinCC. Wenn nun in mehreren "Task" gearbeitet wird mit langen Scripten, kann es schon entscheident sein wann einer Variablen ein Wert zugewiesen wird.
Ich bin der Meinung man sollte es gleich richtig lernen um zu verstehen wo der Unterschied bei der Zuweisung ist um spätere ungewollte Erlebnisse zu vermeiden.
Grüsse Holger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Datentyp und Übergabeart ByVal/ByRef kann nicht festgelegt werden.
Code:
Meine_Funktion(var1,var2, "ref1", "ref2")

Code:
Sub Meine_Funktion(Zahl1,Zahl2, Name1, Name2)

  HMIRuntime.SmartTags(Name1) = [I]......[/I]

End Sub

var1 und var2 wird als ByVal übergeben.
ref1 und ref2 wird als ByRef übergeben.
Wie kommst Du da drauf? Woher nimmst Du diese Überzeugung?
Auf welches Programmiersystem beziehst Du Dich eigentlich??? :confused:
In dem VBS in WinCC flexible kann man Sub-/End Sub-Anweisungen nicht benutzen. Dein Code erzeugt da massenhaft Syntaxfehler.

Harald
 
Ich habs grad mal getestet. Es scheint so als ob die Parameter ByVal und nicht ByRef sind.
[...]
Code:
Dim inValue
inValue = SmartTags("IntWertTest1")
TestByRefAendern[COLOR="#FF0000"]([/COLOR]inValue[COLOR="#FF0000"])[/COLOR]
SmartTags("IntWertTest2") = inValue

Dann hat IntWertTest2 nach Aufruf immer den gleichen Wert wie IntWertTest1, und nicht 100.
Wenn man die Klammern um die Argumente des TestByRefAendern-Aufrufs wegläßt, dann funktioniert der Code wie erwartet - inValue und IntWertTest2 haben danach den Wert 100.
Code:
Dim inValue
inValue = SmartTags("IntWertTest1")
[COLOR="#0000FF"]TestByRefAendern inValue[/COLOR]
SmartTags("IntWertTest2") = inValue

Die Klammer um die Argumente gehört m.W. eigentlich nur bei Functions, wenn man den Function-Rückgabewert auswertet.


Nochmal das Zitat aus der WinCC flexible Hilfe, diesmal komplett:
WinCC flexible Information System - Aufruf von Skripten und Systemfunktionen in Skripten schrieb:
Parameter werden beim Aufruf eines Skripts als "Call by Reference" übergeben. Wenn Sie z. B. als Parameter eine Variable übergeben, wirken sich Wertzuweisungen im Skript unmittelbar auf den Wert der Variablen aus.
Ganz komplett ist diese Aussage allerdings auch nicht - das stimmt nämlich nur bei Variablen, die per Dim in der Sub oder Function deklariert sind. Wenn man eine SmartTag-Variable übergibt, dann wird der Wert des SmartTags nicht verändert. Möglicherweise ist das ein Fehler in der VBS-Implementation von Siemens (ähnlich wie das Problem, daß "SetValue SmartTags(myvar), 0" nicht funktioniert, jedoch "SmartTags(myvar) = 0" funktioniert).

Code:
[COLOR="#008000"]' Sub IncVarByRef(InOut_ByRefVar)[/COLOR]

InOut_ByRefVar = InOut_ByRefVar + 1

[COLOR="#008000"]' End Sub[/COLOR]
Code:
Dim testVar

testVar = SmartTags("IntWertTest1")
IncVarByRef testVar                    [COLOR="#008000"]' --> testVar = testVar + 1[/COLOR]
SmartTags("IntWertTest2") = testVar    [COLOR="#008000"]' --> IntWertTest2 = IntWertTest1 + 1[/COLOR]

[COLOR="#008000"]' Übergabe eines SmartTags funktioniert nicht:
' in der Sub wird das Argument InOut_ByRefVar zwar incrementiert und zugewiesen,
' das Schreiben auf den SmartTag funktioniert jedoch nicht[/COLOR]
IncVarByRef SmartTags("IntWertTest1")  [COLOR="#008000"]' Fehler: IntWertTest1 wird NICHT verändert!!![/COLOR]

[COLOR="#008000"]' Übergabe einer Konstante erzeugt interessanterweise keinen Runtime-Error:
' in der Sub wird 124 auf das Argument InOut_ByRefVar zugewiesen,
' kann aber natürlich nicht auf die Konstante schreiben[/COLOR]
IncVarByRef 123

Harald
 
Ich weiß schon warum ich Vb nicht mag...

Was macht Vb denn mit einer Variablen wenn diese in Klammern gesetzt wird?
Der Übersetzer schluckt es auf jeden Fall wenn ich den Parameter bei einer Sub in Klammern setze.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ergänzung:
Wenn man ein Call vor den Aufruf setzt, funktioniert es auch mit Klammern, d.h. dann ist der Parameter ByRef
Code:
Call TestByRefAendern(inValue)

Zusammengefasst (korrigieren wenn falsch):
Code:
Call TestByRefAendern(inValue)
-> Übergabe erfolgt ByRef

Code:
TestByRefAendern inValue
-> Übergabe erfolgt ByRef

Code:
TestByRefAendern( inValue)
-> Übergabe erfolgt ByVal

Ergänzung:
Dass man mit den Klammern ein "ByVal" forcieren kann steht so auch in diesem Microsoft Artikel für Vb:
http://msdn.microsoft.com/de-de/library/chy4288y.aspx
 
Zuletzt bearbeitet:
Was hat das mit VB zu tun ?
Das ist doch wohl eher die Syntax und die Tricks einer jeden Programmiersprache ...8)
Andere Sprachen (z.B. c#.net) sind da auch nicht besser (und byRef und byVal) gibt es überall).

Allerdings ... Siemens-VB-Script ist wirklich so eine Sache ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, dann genauer VB-Skript oder VBS, und Siemens setzt dem mit der Eigeninterpretation die Krone auf.
Vb.Net hat mit VBS ja nicht mehr ganz viel gemein.

Bei VBS stinken viele Sachen, wie die hier gezeigte Parameterübergabe. Das schlimmste ist aber finde ich die Fehlerbehandlung mit On Error ...
 
Zurück
Oben