Function erstellen und im Dynamikdialog von WinCC verwenden

Heinz

Level-1
Beiträge
657
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein kleines Problem, wo man mich mal auf die richtige Fährte schubsen muss....

Ich möchte einfach ein Element blinken lassen. Soweit kein Thema.

Nun zum Problem. Das Ding soll Blinken, wenn etliche Bedingungen erfüllt sind. Nun war meine Idee eine VBS-Funktion mit Parameterübergabe zu schreiben und diese im Dynamikdialog zu fütterrn. Die Funktion zu schreiben war auch nicht schlimm.

Klappt nicht, weil ich es nicht geschaft habe, WinCC meine Funktion so zu verkaufen, dass ich diese auswählen kann.

Da ich diese n-mal brauche darf die Function keine Objekte direkt ansprechen.

Wie löst Ihr das Problem :?:

Danke für Euer Tipps...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Haben die Bedingungen immer das gleiche Ende z.b.
xxxxxx.Bed1
xxxxxx.Bed2
...

yyyyyy.Bed1
yyyyyy.Bed2
...

Dann könntest du das sozusagen als Prefix an die Funktion übergeben und mittels Stringfunktionen zusammenschustern.

Kenne mich allerdings nicht mit VBS aus.
Mache sowas in C.
Ähnlich habe ich Faceplatefunktionen geschrieben die immer vom Objektnamen abhängen von dem aus sie aufgerufen werden.
 
Hallo,
also die Funktion ist etwas komplizierter.

Ich habe zwei Fälle:
Einmal soll eine Fläche Blinken, wenn
Variable a = 16 und ( B= 1 oder C =1)

Das zweite Mal soll eine Berechnung in Abhängigkeit von einem Parameter durchgeführt werden:
z.B.:
Wenn a = 1 => Ergebnis = b+c
Wenn a = 2 => Ergebnis = b*c
Wenn a = 3 => Ergebnis = b-c

Die Rechnung dient nur als Beispiel, sie in etwas komplizierter.

Nun möchte ich meine komplizierte Funktion im Grafikeditor aufrufen.
Zum Beispiel bein Blimken:
Ich beführte, dass sich die Funktion auch noch ändern wird. Daher war u.a. mein Ansatz zu sagen ich verwende ein Script. Wenn sich die Funktion ändert, muss ich nur eine Stelle ändern und das wars.
 
Was die Funnktion macht ist eigentlich nicht so wichtig.
Die Tags die abgefragt werden sollen sind der Knackpunkt.
Sollte das Skript vollkommen verschiedene Tags abfragen wirst du nicht drum rum kommen die von Hand zu ändern.
Sollten sie eine ähnliche Struktur haben kannst du dir das Leben leichter machen.
Wenn z.B. die Tags so aussehen
Area1.Tank1.ValveIn.value
Area1.Tank1.ValveOut.value
...
Area2.Tank1.ValveIn.value
Area2.Tank1.ValveOut.value
...
Dann kannst du im Skript einen String anlegen mit "ValveIn.value"... und der fehlende Teil wird durch einen Parameter übergeben.

Habe ich das soweit richtig verstanden? (bezieht sich bei mir immer auf C Skripte)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstelle im Global Script Editor für VB eine neues Projektmodul. Lösche die zwei Zeilen Code die automatsch eingeblendet werden.

Füge das ein :
Code:
Function Rechne ( Byval a, Byval b, Byval c )

Dim x ' Dummy

Select Case a
	Case 1	' a ist gleich 1
		x = b + c
		
	Case 2	' a ist gleich 2
		x = b * c
		
	Case 3	' a ist gleich 3
		x = b - c
		
	Case Else
		x = 0 ' x erhält den Wert 0 wenn nichts zutrifft

End Select

Rechne = x	' berechneten Wert zurückschreiben

End Function

Function abfrage ( Byval a, Byval b, Byval c )

If a = 16 And ( b = 1 Or c = 1 ) Then
		abfrage = 1
			Else
				abfrage = 0
End If

End Function

speichern und schliessen.
Jetzt stehen dir zwei Projektfunktionen in deinen Bildern zur verfügung.
Die erste heist rechne, und die zweite heist abfrage.

Rechen kannst du nun so ( beispielhaft an einen Button gehängt ) :

Code:
Sub OnClick(ByVal Item)  

' Tags holen

Dim ergebniss, wert, wertb, wertc, x, a, b, c

Set ergebniss = HMIRuntime.Tags("ergebniss")
Set wert = HMIRuntime.Tags("wert")
Set wertb = HMIRuntime.Tags("wertb")
Set wertc = HMIRuntime.Tags("wertc")

' rechnen

x = Rechne ( wert.Read , wertb.read , wertc.Read )

' ergebniss in Tag schreiben

ergebniss.Write x

' referenzen löschen

Set ergebniss = Nothing
Set wert = Nothing
Set wertb = Nothing
Set wertc = Nothing

End Sub

und etwas blinken lassen so ( beispielhaft an einen Button gehängt ) :

Code:
Sub OnClick(ByVal Item)     

Dim wert, wertb, wertc, x

' Tags holen

Set wert = HMIRuntime.Tags("wert")
Set wertb = HMIRuntime.Tags("wertb")
Set wertc = HMIRuntime.Tags("wertc")

' Grafikobejkt holen

Set x = ScreenItems("Rechteck1")

' abfrage

x.FlashBackColor = abfrage ( wert.Read , wertb.read , wertc.Read )

' referenzen löschen
Set x = Nothing
Set wert = Nothing
Set wertb = Nothing
Set wertc = Nothing

End Sub

Ich hoffe es ist verständlich
 
@KaffeesaufenderKamin
Bis dahin war ich auch :)

Mein Problem ist nur noch, wie kann ich diese Function Abfrage direkt verwenden für alle Attritute, die eine Ja/nein Möglichkeit haben. Außerdem brauche ich diese Funktionen N - Mal und daher ist die Lösung mit dem Verweis auf das Grafikobjekt nicht so günstig.


PS.: Am liebsten währe es, wenn es eine "Erweiterung" von WinCC wird, so ähnlich wie in Access, wo ich mir auch neue Funktionen schreiben kann, die im Formular-Editor zur Verfügung stehen.
 
Hallo Heinz,

so hatte ich dich auch verstanden.

Hab das jetzt mal in ein Projekt gepackt.
So erkannt man die zusammenhänge besser.
 

Anhänge

  • beispiel_161.zip
    641,3 KB · Aufrufe: 10
Zuviel Werbung?
-> Hier kostenlos registrieren
@KaffeesaufenderKamin
danke für das Projekt.

Ich habe es mir angeschaut das war soweit klar, einige andere Anregungen habe ich dadurch gewonnen.

Vielen Dank für die Hilfe.

Am Rande eine andere Sache.
Bei der WinCC Sp3 Hotfix 2 wurde ein Problem mit den Scripten behoben, insbesondere der Aufruf von "eigenen" Scripten soll dort fehlerfrei laufen.

PS. Sorry das ich erst jetzt antworte.
 
Zurück
Oben