VBSkritpt: Variable in einer if-Abfrage testen

Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe ein VBSkript geschrieben. Das Skript dreht ein Polygon (das funktioniert bereits). Nun soll das Skript so erweitert werden, dass sich das Polygon nur dann dreht, wenn das 0-te Bit der Variable DrehenBeginnen gesetzt ist. DrehenBeginnen ist eine interne Variable. Leider funktioniert dieser Teil noch nicht. Findet jemand den Fehler?

Function Left_Trigger(Byval Item)

Dim angle, txt
Set txt = HMIRuntime.ActiveScreen.ScreenItems("Polygon1")
angle = txt.RotationAngle
Dim DrehenBeginnen0
Set DrehenBeginnen0 = HMIRuntime.Tags("DrehenBeginnen")

If (DrehenBeginnen0 And &h00) = 1 Then
txt.RotationAngle = angle + 30
End If

End Function

Hinweise:
mit "And &h00" möchte ich das erste Bit Maskieren (das habe ich auf einem anderen Forumseintrag gelesen). Wenn ich die Maskierung weglasse, funktioniert es auch nicht.

Vielen Dank im Vorraus für die Hilfe

 
Hallo,
schreib mal &h01 - dann wird es funktionieren.
Das Bit 2^0 hat den Wert &h01
usw. ...

Gruß
Larry

Nachsatz:
was hier noch offen bleibt ist allerdings ob und wann dein Skript aufgerufen wird ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort. Leider funktioniert es trotzdem noch nicht. Ich habe folgenden zwei Varianten ausprobiert:

If (DrehenBeginnen0 And &h01) Then 'Variante 1
If (DrehenBeginnen0 And &h01) = 1Then 'Variante 2

Ich bin mir auch sicher, dass das Bit in "DrehenBeginnen" tatsächliche gesetzt wird(ich habe die Anzeige zweier Bilder mit DrehenBeginnen verknüpft, jenachdem welchen Wert "DrehenBeginnen" hat, ändert sich das Bild - und das funktioniert).

Das Skript wird über Objekteigenschaften/Eigenschaften/Position X aufgerugen (ist zwar nicht ganz korrekt, doch ohne if-Bedingung funktioniert die Drehung).

Was könnte noch falsch sein?
 
Ist "DrehenBeginnen" eine Byte Variable?
Bei Word und DWord werden ja gelegentlich die Low & High-Bytes getauscht.
Vllt mal mit &h0100 versuchen.

Ansonsten für DrehenBeginnen mal die Bits aufschlüsseln, und dann schauen, welches bit dann mit toogelt.
 
Das Skript wird über Objekteigenschaften/Eigenschaften/Position X aufgerugen (ist zwar nicht ganz korrekt, doch ohne if-Bedingung funktioniert die Drehung).

Ähh ... noch einmal bitte ...
Bei welchem Ereignis wird das Script aufgerufen ?
Und vielleicht noch etwas ... in welcher Umgebung befinden wir uns eigentlich ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Set txt = HMIRuntime.ActiveScreen.ScreenItems("Polygon1")
angle = txt.RotationAngle
Dim DrehenBeginnen0
Set DrehenBeginnen0 = HMIRuntime.Tags("DrehenBeginnen")

If (DrehenBeginnen0 And &h00) = 1 Then
txt.RotationAngle = angle + 30
End If
Es ist auch möglich, dass das Objekt "txt" in der Funktion gedreht wird, aber nicht das ScreenItem "Polygon1". Ich bin mir hier nicht sicher, ob txt eine Referenz auf das Polygon darstellt (dann sollte es sich drehen) oder eine lokale Kopie dessen ist (dann wird nur die Kopie gedreht).

Vieleicht zum Schluss folgendes ausprobieren:
HMIRuntime.ActiveScreen.ScreenItems("Polygon1") = txt

Oder das Polygon der Funktion "ByRef" direkt übergeben (anstelle "ByVal Item").
 
Das folgende VBScript in WinCC sollte funktionieren:

Code:
Function Left_Trigger(ByVal Item)
 
Dim intDrehenBeginnen
 
intDrehenBeginnen = HMIRuntime.Tags("DrehenBeginnen").Read
 
If intDrehenBeginnen And &H01 Then
    Item.RotationAngle = Item.RotationAngle + 30
End If
 
End Function

Gruß Kai
 
Bei welchem Ereignis wird das Script aufgerufen ?
Und vielleicht noch etwas ... in welcher Umgebung befinden wir uns eigentlich ?

Hallo Larry,

es geht hier um WinCC (nicht WinCC flexible) und ich gehe davon aus, dass als Trigger ein Standardzyklus (z.B. 2 Sekunden) verwendet wird.

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Skript wird über einen Trigger aufgerufen. Das Programm ist WinCC 6.2.
Danke für die zahlreichen Rückmeldungen. Morgen, wenn ich wieder an den PC mit WinCC arbeiten kann, werde ich die Vorschläge ausprobieren.
 
Da in der Aufgabenstellung der Rotationswinkel eines Polygons dynamisiert werden soll, sollte man das VBScript in den Objekteigenschaften des Polygons unter dem Attribut Rotationswinkel aufrufen:

Code:
Function RotationAngle_Trigger(ByVal Item)
 
Dim intDrehenBeginnen
 
intDrehenBeginnen = HMIRuntime.Tags("DrehenBeginnen").Read
 
If intDrehenBeginnen And &H01 Then
    Item.RotationAngle = Item.RotationAngle + 30
End If
 
End Function

WinCC_Explorer.jpg

WinCC_Graphics_Designer_1.jpg WinCC_Graphics_Designer_2.jpg WinCC_Graphics_Designer_3.jpg

WinCC_Graphics_Designer_4.jpg

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nachtrag:

Damit es zu keinem Überlauf des Rotationswinkels (Rotationswinkel > 360°) kommt, muss das VBScript wie folgt geändert werden:

Code:
Function RotationAngle_Trigger(ByVal Item)
 
Dim intDrehenBeginnen    
 
intDrehenBeginnen = HMIRuntime.Tags("DrehenBeginnen").Read
 
If intDrehenBeginnen And &H01 Then
    If Item.RotationAngle < 360 Then
        Item.RotationAngle = Item.RotationAngle + 30
    Else
        Item.RotationAngle = 30
    End If
End If
 
End Function

WinCC_Graphics_Designer_2.jpg

Gruß Kai
 
Rotation von einem Objekt mit VBSkript

Hallo SPS Forum Freunde,

ich möchte gerade ein Polygon mittels VBSkript rotieren lassen, aber ich bekomme

immer folgende Fehlermeldung sieh Bild.

Hier ist mein Code im VBSkript:

Sub Test()

Dim angle, Poly

Set Poly= HMIRuntime.ActiveScreen.ScreenItems("Polygon1")
angle = Poly.RotationAngle
Poly.RotationAngle = angle + 45

End Sub

Was mache hier dann falsch

Ich benutze Wincc Advanced V13

Fehler.jpg


Gruss

alainbk
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
In WinCC Advanced können Polygone nicht gedreht werden, die Polygon-Objekte haben keine Eigenschaft oder Methode "RotationAngle". Das geht nur in der WinCC Professional RT.

Harald
 
Zurück
Oben