TIA Mal eine Frege zu einer VB Funktion

Tmbiz

Level-2
Beiträge
634
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
Mal eine Frage zu einer VB Funktion

Ich habe mir vom Siemens Support sagen lassen, dass ich für das was ich machen möchte eine VB Funktion benötige. Der gute Mann hat mir dann den Text grob gesagt und ich habe das auch übernommen.

Ich möchte, dass sich auf den Bild "Dosierung" eine Pop Up öffnet wenn eine Variable die von der PLC kommt auf 1 gesetzt wird. Ich habe die Erfassung der VAR auf Zyklisch fortlaufend gestellt.
Wenn ich die Variable auf der PLC auf 1 setze und ich auf dem Bild Dosierung bin, wird das Pop Up geöffnet. Aber wenn ich die VAR auf 0 setzte, wird es nicht geschlossen. Ich muss die Var einige male um schalten und irgendwann verschwindet dann das Pop UP. Woran kann das liegen?

Wie kann man es denn z.B. so einrichte, dass die Funktion immer ausgeführt wird und nicht nur bei einer Wertänderung der VAR GlobalDB_PopUp_Waage

Denn jetzt ist es so, dass ich das Skript abhängig von der Wert Änderung der Var GlobalDB_PopUp_Waage ausführe.


Code:
If HmiRuntime.ActiveScreen.ObjectName="Dosierung" Then
 
       If GlobalDB_PopUp_Waage = True Then
              ShowPopupScreen "Warnung",600,90, hmiOn, hmiAnimationOff, hmiMedium
              GlobalDB_PopUp_Waage2 = 1
       Else
             ShowPopupScreen "Warnung",600,90, hmiOff, hmiAnimationOff, hmiMedium 
             GlobalDB_PopUp_Waage2 = 0 
  
       End If
 
End If
 
Zuletzt bearbeitet:
Zuerst würde ich mal nach der Aktualisierungszeit für die Variable GlobalDB_PopUp_Waage schauen.
Die sollte IMHO ziemlich kurz sein.

Anschließend würde ich nur das Öffnen des PopUps abhängig vom Bild machen (was gibt denn ActiveScreen eigentlich bei geöffnetem PopUp wieder?):
Code:
If GlobalDB_PopUp_Waage Then

    If HmiRuntime.ActiveScreen.ObjectName="Dosierung" Then

         ShowPopupScreen "Warnung",600,90, hmiOn, hmiAnimationOff, hmiMedium
         GlobalDB_PopUp_Waage2 = 1

    End If

Else

    ShowPopupScreen "Warnung",600,90, hmiOff, hmiAnimationOff, hmiMedium 
    GlobalDB_PopUp_Waage2 = 0 

End If
PS:
Bitte nutze die Code-Tags (der Button # ganz rechts in der unteren Icon-Leiste).
Wie Du hier drüber siehst, ist der Code dann besser lesbar und Du kannst auch Einrückungen nutzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Aktualisierung der VAR ist auf 100ms

Code:
If HmiRuntime.ActiveScreen.ObjectName="Dosierung" Then
 
    If GlobalDB_PopUp_Waage Then
      ShowPopupScreen "Warnung",600,90, hmiOn, hmiAnimationOff, hmiMedium
      GlobalDB_PopUp_Waage2 = 1
   Else
       ShowPopupScreen "Warnung",600,90, hmiOff, hmiAnimationOff, hmiMedium 
       GlobalDB_PopUp_Waage2 = 0 
  
   End If
 
End If

Sorry beim ersten Beitrag hatte ich die obere Zeile vergessen. Ich würde es gerne so einrichte, dass die Funktion immer Zyklisch ausgeführt wird und wenn die Bedingungen Bild Dosierung und Var GlobalDB_PopUp_Waage auf 1 dann wird das Pop Up geöffnet.

Jetzt ist es so, dass die Funktion ausgeführt wird, wenn das Bild Dosierung aufgebaut ist oder die Var GlobalDB_PopUp_Waage denn Wert ändert.
 
Ich würde es gerne so einrichte, dass die Funktion immer Zyklisch ausgeführt wird
So wie Du das meinst ist das nicht möglich. Und es ist auch nicht nötig, weil das Skript hat nur dann was zu tun, wenn sich der Wert der Triggervariable ändert oder wenn das Bild "Dosierung" abgebaut wird (falls das Popup da nicht sowieso automatisch geschlossen wird?).

Wenn etwas "zyklisch" ausgeführt werden soll, dann muß man einen zyklischen Trigger erzeugen oder einen bereits vorhandenen zyklischen Trigger nutzen. Der kleinste bereits vorhandene zyklische Ereignis-Trigger ist 1 Minute. Oder man sorgt dafür daß sich eine SPS-Variable im Rhythmus des Erfassungszyklus ändert - da könnte man auf Trigger-Ereignisse alle 100...200 Millisekunden kommen.

Jetzt ist es so, dass die Funktion ausgeführt wird, wenn das Bild Dosierung aufgebaut ist oder die Var GlobalDB_PopUp_Waage denn Wert ändert.
Das ist so nicht ganz korrekt. Die Funktion wird nur ausgeführt wenn GlobalDB_PopUp_Waage den Wert ändert - so hast Du ja den Trigger für den Funktionsaufruf eingestellt. Ob das Bild "Dosierung" aufgebaut ist, ist für den Skriptaufruf völlig egal.

PS: wenn Du willst, daß das Skript einschränkend nur aufgerufen wird, wenn das Bild "Dosierung" aufgebaut ist, dann verwende die Variable GlobalDB_PopUp_Waage nur in dem Bild und ändere die Erfassung der Variable zurück zum Standard "Zyklisch im Betrieb". Dann werden Änderungen der Variable nur erkannt wenn das Bild aufgebaut ist.

Harald
 
Zuletzt bearbeitet:
So das Problem ist gelöst. Ich habe eine Takt genommen und an der Veränderung die Ausführung des Skripts gehangen. Jetzt kann ich immer über meine VAR ein und aus schalten.

Danke für die Hilfe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab' die Vermutung, dass Dir "ActiveScreen" bei geöffnetem PopUp nicht mehr Bild "Dosierung" zurückgibt, sondern das PopUp.
Daher der Vorschlag, das Schließen des PopUp immer zu machen, wenn die Variable "GlobalDB_PopUp_Waage" von 1 auf 0 wechselt.

Selbst, wenn Du dann gerade auf einem anderen Bild bist, wird halt da das (eh' nicht sichtbare) PopUp geschlossen. Da passiert dann also nicht wirklich was.
 
Zurück
Oben