×
Siemens Industry Online Support
Siemens AG
Beitragstyp: FAQ Beitrags-ID: 26165877, Beitragsdatum: 09.04.2015
(6)
Bewerten

Tipps und Tricks für das Erstellen von Skripten

  • Beitrag
  • Betrifft Produkt(e)
Nachfolgend finden Sie Informationen zur Handhabung von Skripten.
  1. Warum wird ein Skript, das am Ereignis "Wertänderung" einer internen Variable projektiert ist, nicht ausgeführt?
    Wird über eine interne Variable eine weitere interne Variable aufgerufen, über die wiederum z. B. ein Skript ausgeführt wird (z. B. bei Wertänderung), dann verhindert ein Sicherheitsmechanismus die Ausführung dieser Funktion.
    Durch diese Sicherheitsfunktion soll eine mögliche "Endlosschleife" verhindert werden.

    Beispiel
    Über die Eigenschaften der internen Variable "HMI_Tag_01" wird bei dem Ereignis "Wertänderung" in der internen Variablen "HMI_Tag_02" ein "Bit" gesetzt.
    An dieser zweiten internen Variablen "HMI_Tag_02" wird über die Eigenschaften bei dem Ereignis "Wertänderung" ein Skript aufgerufen.
    Ergebnis: Das Skript wird nicht ausgeführt.

    Hinweis
    Auf Grund dieses Loop Breakers wird ein Script an einer internen Variablen nur ausgeführt, wenn die interne Variable durch direkte Werteingabe des Benutzers geändert wird.

    Abhilfe
    Verwenden Sie eine externe Variable, die an eine Steuerung angebunden ist.
     
  2. Wie kann in einem Skript auf einzelne Elemente eines Arrays zugegriffen werden?
    Der Zugriff auf einzelne Array-Elemente erfolgt durch den Namen des Arrays und der Angabe des Array-Feldes -> SmartTags("Namen des Arrays")(Array-Feld) 

    Beispiel (Array Variable mit Steuerungsanbindung)
    Dim Tag_01    'Interne Skript Variable

    Tag_01 = SmartTags("DB10_HMI_Data")(2)
                   
    Lokale Skript-Arrays (Arrays, die nur innerhalb von einem Skript zur Verfügung stehen) können nach dem gleichen Prinzip selektiert werden. Bei mehrdimensionalen lokalen Arrays können die einzelnen Dimensionen des Arrays durch ein Komma getrennt werden.

    Beispiel (Array Variable ohne Steuerungsanbindung)
    Dim HMI_Data(10,10)        'Interne Skript Array-Variable
    Dim Tag_01                         'Interne Skript Variable

    Tag_01 = HMI_Data(0, 5)

    Hinweis
    Es empfiehlt sich bei der Verwendung von "Array-Elementen mit Steuerungsanbindung", diese zu Beginn eines Skriptes auf "interne Skript Variablen" zu kopieren und im weiteren Verlauf dann mit diesen "internen Variablen" weiter zu arbeiten.
    Am Ende des Skriptes müssen dann die Werte von den "internen Variablen" wieder auf die Array-Elemente zurückgeschrieben werden.
     
  3. Wie können Sie Prozessvariablen-Arrays zwischen einer Steuerung und einem lokalen Skript effizient hin und her kopieren?
    Um ein Array von Prozessvariablen aus der Steuerung in ein Skript zu kopieren, müssen Sie die Arrayelemente einzeln kopieren, z.B. in einer Schleife. Ein lokales Skript-Array können Sie jedoch mit einer einzigen Anweisung direkt auf ein Prozessvariablen-Array kopieren:

    Beispiel
    ' CPU_Array sei ein Array von Prozessvariablen
    Dim local_array(10)
    Dim i
    ...
    ' Kopieren von der CPU in das Skript:
    For i = 0 To 9
        local_array(i) = SmartTags("CPU_Array")(i)
    Next
    ...
    ' Zurückkopieren in die CPU:
    SmartTags("CPU_Array") = local_array

    Hinweis
    Durch das Arbeiten mit Arrays können hohe Kommunikationslasten und Dateninkonsistenzen entstehen. Beachten Sie hierzu den Hinweis im WinCC flexible Systemhandbuch mit der Beitrags-ID 18796010 unter Grundlagen zu Arrays.
     
  4. Wie kann in WinCC flexible auf dynamische Bibliotheken (DLL) zugegriffen werden?
    In WinCC flexible kann auf dynamische Bibliotheken (DLL - Dynamic Link Library) nicht zugegriffen werden.
     
  5. Wie kann die aktuelle Mausposition ermittelt werden?
    Um die aktuelle Mausposition auszulesen, muss auf das API (Application Programming Interface) des Betriebssystems zugegriffen werden.
    Der Zugriff auf das API des Betriebssystems über DLLs wird in VB-Skripts nicht unterstützt. Alternativ kann die aktuelle Mausposition über ein selbst programmiertes ActiveX Control, das auf das API des Betriebssystems zugreift, ausgelesen werden.
     
  6. Warum kann der Befehl "MsgBox" in einem Skript von WinCC flexible nicht verwendet werden?
    Der Befehl "MsgBox" ist in WinCC flexible aus Sicherheitsgründen gesperrt.
     
  7. Wie können in einem Skript hexadezimale Zahlen einer Variable zugewiesen werden?
    Die Wertübergabe einer hexadezimalen Zahl erfolgt im Skript-Editor
    mit der Voranstellung von "&h".

    Beispiel
    Dim Tag_01

    Tag_01 = &h45E     'Vorgabe für den Dezimalwert "1118"
     
  8. Wie können einzelne Ebenen in einem Skript ein- bzw. ausgeblendet werden?
    Das Arbeiten mit Ebenen ist eine Funktionalität des Entwicklungssystems von WinCC flexible ES. Die Ebenen dienen als Projektierungshilfe und können nur dort ein- bzw. ausgeblendet werden.
    Am Bediengerät bzw. auf einem PC-Runtime System steht Ihnen diese Funktionalität nicht zur Verfügung. Die "Ebenen" können somit nicht über ein Skript ein- bzw. ausgeblendet werden.

    Abhilfe
    Unter dem Register  "Eigenschaften > Animation > Sichtbarkeit" des entsprechenden Objektes, können Sie abhängig vom Wert der projektierten Variablen, das Objekt ein- bzw. ausblenden.
     
  9. Wie können "Strings" (Zeichenketten) in einem Skript miteinander verknüpft werden?
    Strings können durch den Verkettungs-Operator "&" miteinander verknüpft werden:

    Beispiel
    Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03

    Tag_01 = Tag_Text_01  &  Tag_Text_02  &  Tag_Text_03
     
  10. Wie kann ein "Platzhalter" (Leerzeichen) zwischen den einzelnen "Strings" (Zeichenketten) in einem Skript eingefügt werden?
    Um z. B. zwischen zwei Texten ein Leerzeichen einzufügen, verwenden Sie zwei
    Anführungszeichen  " ".
    Die Anzahl der "Leerzeichen" ist abhängig vom Abstand zwischen dem Ausführungszeichen "   ".
    Eine "Verknüpfung" mit nachfolgenden Zeichen erfolgt wieder mit dem Verkettungs-Operator "&".

    Beispiel 1
    Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03

    Tag_01 = Tag_Text_01  &  " "  &  Tag_Text_02 & " "  &  Tag_Text_03

    Beispiel 2
    In dem Beispiel 2 wird über ein Skript eine Systemmeldung ausgegeben, in der innerhalb des Textes eine Steuerungsvariable als "Maschinenindex" hinzugefügt wurde.

    ShowSystemAlarm "Machine" & "_" & SmartTags("Tag_MachineIndex") & " " & "must be checked"

    Ergebnis
    Machine_15 must be checked
     
  11. Wie wird ein Rückgabewert an ein Skript projektiert?
    Damit ein Skript einen Wert zurückgeben kann, muss das Skript vom Typ "Function" sein.
    Unter dem Register "Eigenschaften > Allgemein > Einstellungen" können Sie den Typ des Skriptes vorgeben. Wählen Sie hierzu über die Klappliste den Typ "Function".
    Unter dem Menüpunkt "Parameter" können Sie Variablen vorgeben, über die dem Skript Werte übergeben werden können.

    Um einen Rückgabewert zu projektieren, weisen Sie den Wert/Ergebnis einer Variablen dem aktuellen Skript zu.
     
    Name des Skriptes: Sample_01
    Skript-Typ: Function
    Parameter: Param_01, Param_02
    Rückgabewert: Variable vom Typ "Integer"

    Öffnen Sie das Skript "Sample_01"
     

    Dim Result  
    Result = Param_01 + Parm_02  
    Sample_01 = Result 'Hier wird dem Skript "Sample_01" das Ergebnis der Berechnung zugewiesen -> Rückgabewert

     
    Beim Aufruf des Skripts z. B. über eine Schaltfläche erhalten Sie neben den in den Eigenschaften hinterlegten Parametern ("Param_01" und "Param_02")  zusätzlich den Parameter "Rückgabewert" angezeigt, den Sie dann entsprechend mit einer Variablen versehen können.
     

  12. Wie kann die Länge eines Linien-Objekts über ein Skript verändert werden?
    Die beiden Parameter "height" und "width" stehen beim Linien-Objekt nur lesend zur Verfügung.
    Bei horizontaler oder vertikaler Lage kann statt des Linien-Objekts ein Rechteck verwendet werden und über die Eigenschaften im Skript dynamisiert werden.

    Weiterführende Informationen zu dem Thema finden Sie unter der Beitrags-ID: 24249449.
     
  13. Welche Ursache kann die Meldung "Maximale Verschachtelungstiefe erreicht" auslösen?
    Die maximale Verschachtelungstiefe kann erreicht werden, wenn z.B. in einem Skript über Wertänderung erneut ein anderes Skript aufgerufen wird und dies nach diesem Prinzip so fortgeführt wird.
    Diese Meldung kann auch bei einem rekursiven Skriptaufruf - Skript ruft sich ständig selber auf - schnell erzielt werden.

    Abhilfe
    Überprüfen Sie die Abarbeitung der Skripte und reduzieren Sie ggf. die Verschachtelungen der Skripte.
     
  14. Wie kann die aktuelle Bildnummer bzw. Bildname ermittelt werden?
    In dem Beispiel 01 wird der komplette Name des Bildes über den Rückgabewert eines Skriptes ausgegeben.
      
Bildname: Screen_01
Name des Skriptes: Script_01
Skript-Typ: Function
Rückgabewert: Variable vom Typ "String"

Öffnen Sie das Skript "Script_01"

Dim Obj, StrScreenName

Set Obj = HmiRuntime
StrScreenName = Obj.BaseScreenName
Script_01 = StrScreenName    'Rückgabewert

Ergebnis
Der Rückgabewert des Namens ist "Screen_01"

In dem Beispiel 02 wird der Name des Bildes "gesplittet". Es werden nur die Zeichen/Namen vor dem Trennzeichen "_" als Rückgabewert eines Skriptes ausgegeben.
 

Bildname: 02_MachineData
Name des Skriptes: Script_02
Skript-Typ: Function
Rückgabewert: Variable vom Typ "String"

Öffnen Sie das Skript "Script_02"

Dim Obj, StrScreenNumber

Set Obj = HmiRuntime
StrScreenNumber = Split(Obj.BaseScreenName, "_")
Script_02 = StrScreenNumber(0)     'Rückgabewert

Ergebnis
Der Rückgabewert des Namens ist "02"

Hinweise

  • Ein direktes Auslesen des Bildnamens/Nummer über die "Eigenschaften" des entsprechenden Bilds ist via "Skript" nicht möglich.
  • Alternativ können Sie auch den Bereichszeiger "Bildnummer" verwenden. Durch die Projektierung einer Variable, die den gleichen Adressbereich wie der Bereichszeiger hat, kann dann die Bildnummer über die Steuerung ausgelesen werden. Beachten Sie bei dieser Variante die Baudrate des Busses und den Erfassungszyklus der Variable.
     
  1. Wie können Multiplex-Variablen im Skript verwendet werden?
    Multiplex-Variablen können in einem Skript nicht verwendet werden.
     
  2. Wie können Struktur-Variablen in einem Skript verwendet werden?
    Struktur-Variablen können in einem Skript nicht verwendet werden.
     
  3. Wie können in einem Skript Variablen-Informationen gesichert werden, damit diese beim nächsten Skriptaufruf wieder zur Verfügung stehen?
    Informationen, die nach Ablauf eines Skripts erhalten bleiben sollen, müssen in globalen Variablen gespeichert werden. Die nachfolgende Tabelle gibt hierzu einen Überblick..
     
    Deklaration

    Gültigkeit

    im Skript

    Skript WinCC flexible Projekt Steuerung
    Externe Variable X X X global
    Interne Variable X X --
    Skript-Variable X -- -- lokal

     

  4. Wie kann der Text eines Textfeldes über ein Skript geändert werden?
    Der Text eines Textfelds kann über ein Skript zur Runtime verändert werden. Beachten Sie, dass der geänderte Text nur "temporär" vorhanden ist. Nach einem Bildwechsel wird der geänderte Text wieder mit dem in der Projektierung hinterlegten Text überschrieben.
     
    Bildname: MachineData
    Skript-Typ: Sub
    Objektname des Textfeldes: Text_Field_01

    Öffnen Sie Ihr Skript

    Dim obj

    Set obj = HmiRuntime.Screens("MashineData").ScreenItems("Text_Field_01")
    obj.Text = "NewText"
     

  5. Wie kann über ein Skript aus der Kennwortliste oder Benutzeranzeige das Passwort eines beliebigen Benutzers ausgelesen werden?
    Dieses ist in WinCC flexible aus Sicherheitsgründen nicht möglich.
     
  6. Wie kann die WinCC flexible Runtime beendet und anschließend der PC bzw. das Panel heruntergefahren werden?
    Die WinCC flexible Runtime und das Betriebssystem können mit dem Befehl
    "StopRuntime - Modus" beendet werden.

    Hinweis
    Das Betriebssystem eines Windows-basierten Panels kann nicht heruntergefahren werden.
     
    Modus
    Parameter Bedeutung

    0 = hmiStopRuntime

    Beendet die Runtime

    1 = hmiStopRuntimeAndOperationSystem

    Beendet die Runtime und OS

     
    Beispiel
    StopRuntime hmiStopRuntime
    StopRuntime hmiStopRuntimeAndOperationSystem
     

  7. Wie können Objekte aus einer Vorlage bzw. einem Bild über ein Script angesprochen werden?
    Objekte in einem Bild können über die Funktion "ActiveScreen" angesprochen werden.

    In diesem Beispiel ist in einem Bild ein Kreis mit dem Objektnamen "Circle_01" projektiert. Über eine Schaltfläche im Bild wird der Kreis "unsichtbar" geschaltet. Beachten Sie, dass die Ansicht des Objektes nur "temporär" vorliegt. Nach einem Bildwechsel wird wieder die in der Projektierung hinterlegte Ansicht übernommen.
     
    Skript-Typ: Sub
    Objektname z. B. von dem Kreis: Circle_01

    Öffnen Sie Ihr Skript

    HmiRuntime.ActiveScreen.ScreenItems("Circle_01").Visible=False

    Hinweis
    Die in den Bildern projektierten Objekte müssen eindeutige Namen haben.

 

Securityhinweise
Um technische Infrastruktur, Systeme, Maschinen und Netzwerke gegen Cyber-Bedrohungen zu sichern, ist es erforderlich, ein ganzheitliches IT Security-Konzept zu implementieren (und kontinuierlich aufrechtzuerhalten), das dem aktuellen Stand der Technik entspricht. Die Produkte und Lösungen von Siemens formen nur einen Bestandteil eines solchen Konzepts. Weitergehende Informationen über Cyber Security finden Sie unter
https://www.siemens.com/cybersecurity#Ouraspiration.
Unterstützung zur Statistik
Mit dieser Funktion werden die IDs des Suchergebnisses nach gewünschter Anzahl ausgegeben (Format .txt)

Liste generieren
URL kopieren
Diese Seite in neuem Design anzeigen
mySupport Cockpit