# WinCC flexible VBScript Parameter an Funktion übergeben



## xperia (18 April 2014)

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?


----------



## holgermaik (18 April 2014)

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


----------



## Thomas_v2.1 (18 April 2014)

Die Schaltfläche "Hinzufügen" wird erst aktiv, wenn du einen Parameternamen eingegeben hast.


----------



## xperia (22 April 2014)

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.


----------



## PN/DP (22 April 2014)

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


----------



## Thomas_v2.1 (22 April 2014)

Ich habs grad mal getestet. Es scheint so als ob die Parameter ByVal und nicht ByRef sind.


```
Sub TestByRefAendern( val1 )
val1 = 100
End Sub
```

und Testfunktion die über eine Schaltfläche aufgerufen wird:

```
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.


----------



## holgermaik (22 April 2014)

PN/DP schrieb:


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




```
Meine_Funktion(var1,var2, "ref1", "ref2")
```


```
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


----------



## Thomas_v2.1 (22 April 2014)

holgermaik schrieb:


> ```
> Meine_Funktion(var1,var2, "ref1", "ref2")
> ```
> 
> ...


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.


----------



## Larry Laffer (23 April 2014)

@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


----------



## holgermaik (23 April 2014)

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


----------



## Thomas_v2.1 (23 April 2014)

holgermaik schrieb:


> 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.



Richtig lernen heißt aber auch dass man weiß, wann ein Parameter als Wert (ByVal) oder als Referenz/Zeiger übergeben wird. Und was du oben geschrieben hast ist ganz einfach falsch.


----------



## PN/DP (23 April 2014)

holgermaik schrieb:


> PN/DP schrieb:
> 
> 
> > Datentyp und Übergabeart ByVal/ByRef kann nicht festgelegt werden.
> ...


Wie kommst Du da drauf? Woher nimmst Du diese Überzeugung?
Auf welches Programmiersystem beziehst Du Dich eigentlich??? 
In dem VBS in WinCC flexible kann man Sub-/End Sub-Anweisungen nicht benutzen. Dein Code erzeugt da massenhaft Syntaxfehler.

Harald


----------



## PN/DP (23 April 2014)

Thomas_v2.1 schrieb:


> Ich habs grad mal getestet. Es scheint so als ob die Parameter ByVal und nicht ByRef sind.
> [...]
> 
> ```
> ...


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.

```
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).


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

InOut_ByRefVar = InOut_ByRefVar + 1

[COLOR="#008000"]' End Sub[/COLOR]
```


```
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


----------



## Thomas_v2.1 (23 April 2014)

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.


----------



## Thomas_v2.1 (23 April 2014)

Ergänzung:
Wenn man ein Call vor den Aufruf setzt, funktioniert es auch mit Klammern, d.h. dann ist der Parameter ByRef

```
Call TestByRefAendern(inValue)
```

Zusammengefasst (korrigieren wenn falsch):

```
Call TestByRefAendern(inValue)
```
-> Übergabe erfolgt ByRef


```
TestByRefAendern inValue
```
-> Übergabe erfolgt ByRef


```
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


----------



## PN/DP (23 April 2014)

Thomas_v2.1 schrieb:


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


*ACK*

Harald


----------



## Larry Laffer (23 April 2014)

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


----------



## Thomas_v2.1 (23 April 2014)

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 ...


----------



## Larry Laffer (24 April 2014)

Thomas_v2.1 schrieb:


> ... Das schlimmste ist aber finde ich die Fehlerbehandlung mit On Error ...



Ja ... *ACK* ... es ist halt nur ein Behelf ... aber man kann schon Einiges damit anstellen ...


----------

