# Aktueller Bildname mit VBScript



## mkd (23 Oktober 2008)

Hallo,

ich möchte in einer Statusleiste in einem WinnCC flex Projekt (MP277) einen Text passend zum aktuellen Bild Schreiben.
In der Vorlage habe ich ein EA Feld angelegt und als Anzeigevariable eine interne String Variable zugewiesen.

Jetzt geht es mir darum in einem Script den aktuellen Bildnamen auszulesen und mit einem Switch oder if Konstrukt einen Text der internen Variablen zuzuweisen.
Die Switch / if the... Geschichte werde ich als VBScript Neuling ohne Probleme hinbekommen. Was mir Sorgen macht ist die Abfrage woher ich komme, das heißt welche Taste ich gedrückt habe. 
Ich möchte nicht für jede Taste ein Script hinterlegen sondern alles über eins Organisieren.


Über konstruktive Tips und Hilfestellungen würde ich mich sehr freuen!


Gruß
mkd


----------



## marlob (23 Oktober 2008)

Wenn ich mich nicht täusche sollte man mit 
HmiRuntime.BaseScreenName
den aktuellen Bildanamen heraus bekommen
[EDIT]
Ich habe wohl deine Frage nicht zu Ende gelesen
Du wolltest ja was anderes wissen, muss ich also noch mal gucken
[\EDIT]


----------



## johnij (23 Oktober 2008)

mkd schrieb:


> Hallo,
> 
> ich möchte in einer Statusleiste in einem WinnCC flex Projekt (MP277) einen Text passend zum aktuellen Bild Schreiben.
> In der Vorlage habe ich ein EA Feld angelegt und als Anzeigevariable eine interne String Variable zugewiesen.
> ...


 

Ein Skript in dem Fall wäre nicht nötig........
Du kannst in der Vorlage mehrere Textfelder (übereinander) projektieren
Mit der Scihtbarkeit kannst du mit einer Variable (Var_Sps) aus der SPS
den Text des akt. Bildes einblenden.
Die Var_Sps (Wort) sollst du in Verbindungen-->Bereichzeiger-->Bildnummer projektieren
Dadurch wird die aktuellle aufgeschlagene Bildnummer in die Steuerung übertragen.

Die Hilfe zum Bereichzeiger kannst Du der Hotline-Doku entnehmen...


----------



## mkd (23 Oktober 2008)

johnij schrieb:


> Ein Skript in dem Fall wäre nicht nötig........
> Du kannst in der Vorlage mehrere Textfelder (übereinander) projektieren
> Mit der Scihtbarkeit kannst du mit einer Variable (Var_Sps) aus der SPS
> den Text des akt. Bildes einblenden.
> ...




Hallo,

das ist schon richtig, ich könnte ja auch mit Textlisten arbeiten.
Ich möchte die Kommunikation mit der SPS Vermeiden, da ich das dann zusätzlich im S7 Programm integrieren muss.
Ein Script könnte ich auch schneller in neue Projekte einbinden.
Zusätzlich möchte ich mal was mit Scripten machen


----------



## mkd (23 Oktober 2008)

So, habe ein wenig herumgespielt.

Mit: 
	
	



```
'If    (HmiRuntime.ActiveScreen.ObjectName = "Bild_3") Then
    Bildname = "Behälter"
End If
```

Klappt es soweit. Wenn ich mit einer Taste Bild_3 aufrufe und mit der gleichen Taste im Loslassen Event das Script ausführe erscheint schonmal der Text.
Leider muss ich aber dann zweimal drücken bis der richtige Text erscheint.

Gibt es da so eine Art Verzögerung die ich am Anfang in das Script einbauen kann?

Was mich auch noch stört: Bei allen Tasten (Bildaufruf) klappt es, nur bei einer Taste bekomme ich im Simulator immer folgende Meldung.

"Objekt erforderlich HMI.Runtime.ActiveScreen wurde nicht behandelt." 
Warum nur bei der einen Taste?


----------



## johnij (23 Oktober 2008)

.
Du kannst auch eine Var_intern projektieren.

Beim Bild-Aufbau (Allegemein-->Ereignisse-->Aufgebaut) soll Var_Intern=Akt. Bildnummer
Anschließend kannst Du Var_Intern im Skript einsetzen.........


----------



## rostiger Nagel (23 Oktober 2008)

...es gebe auch noch die möglichkeit die Variablen übern den Aufgabenplaner zu bearbeiten. Da gibt es ein Ereignis "Bildwechsel",
dieses Ereignis kann dann eine Funktion aufrufen die dann dein Script bearbeitet.
So mußt du das nicht bei jedem Bild projektieren...

gruss Helmut


----------



## mkd (23 Oktober 2008)

@Helmut:
Danke für den Tip! Genau so mache ich es jetzt. Ich lege eine Aufgabe Bildwechsel an und führe hier mein Script aus.


```
Select Case HmiRuntime.ActiveScreen.ObjectName
    Case "Bild_01"
        Bildname = "Übersicht"    
    Case "Bild_02"
        Bildname = "Entladung"
    Case "Bild_03"
        Bildname = "Behälter"
    Case "Bild_04"
        Bildname = "Entnahme"          
End Select
```
Klappt soweit wunderbar.
Komischerweise kommt es bei Wechsel auf Bild_03 im Script zu dem Fehler:

"Objekt erforderlich HMI.Runtime.ActiveScreen wurde nicht behandelt." 

Kann jemand mir da weiterhelfen?

Gruß
mkd


----------



## rostiger Nagel (23 Oktober 2008)

...schau doch einmal nach ob du das Bild richtig bezeichnet hast....


----------



## mkd (23 Oktober 2008)

Ja, habe ich richtig bezeichnet. Das Problem habe ich bei mehreren Bildern.

Stelle ich jetzt vor den Code

```
Dim objActiveScreen
Set objActiveScreen = HmiRuntime.ActiveScreen

'wenn ein Bild gefunden wurde
If Not objActiveScreen Is Nothing Then
...
End If
```

Dann kommt es schon einmal nicht mehr zur VB Script Fehlermeldung.

In der Hilfe steht dazu:
"Wenn Sie in einem Skript die Eigenschaft "ActiveScreen"  abfragen, so kann es z.B. aufgrund eines ScreenSavers vorkommen, dass die  Eigenschaft kein gültiges "Screen"-Objekt sondern "Nothing" zurückliefert und  eine Systemmeldung angezeigt wird."




Toll, warum ist das dann bei manchen Bildern und bei anderen nicht?


Es handelt sich um ein neues Projekt, also alles neue Bilder...


----------



## rostiger Nagel (23 Oktober 2008)

...ich denke die Hilfe bezieht sich darauf wenn der Bildschirmschoner gestartet wird dieses natürlich bei deiner Anwendung zu fehlern führen könnte. 
Schalte doch erst einaml den Bildschirmschoner ab....!


----------



## mkd (23 Oktober 2008)

Hallo,

ich benutze gar keinen Bildschirmschoner...


----------



## rostiger Nagel (23 Oktober 2008)

...O.K. ich meinte ja auch nur weil du es erwähnt hast, ist den dein Fehler mit Bild 3 reproduzierbar oder ist es sporadisch....

gruß Helmut


----------



## mkd (23 Oktober 2008)

Der Fehler tritt beim dritten, sechsten,siebten ... Bild auf.
Die Bildnummern sind aber nicht in der Reihenfolge vergeben.

Wäre ja zu schön wenn es klappen würde....

EDIT: Habe ich eigentlich erwähnt das ich im Momen tnur mit dem Simulator arbeite?


----------



## rostiger Nagel (23 Oktober 2008)

...du hast doch schon eine Fehlerauswertung geschrieben. Las dir doch Anzeigen was in deiner Variablen steht. Mit ShowSystemAlarm objActiveScreen, ich weiß jetzt nicht ob das mit der Variablen direkt geht aber ein versuch ist es wert...


----------



## Kai (23 Oktober 2008)

mkd schrieb:


> ich möchte in einer Statusleiste in einem WinnCC flex Projekt (MP277) einen Text passend zum aktuellen Bild Schreiben.
> In der Vorlage habe ich ein EA Feld angelegt und als Anzeigevariable eine interne String Variable zugewiesen.
> 
> Jetzt geht es mir darum in einem Script den aktuellen Bildnamen auszulesen und mit einem Switch oder if Konstrukt einen Text der internen Variablen zuzuweisen.


 
Mit dem folgendem VBScript wird der aktuelle Bildname ausgelesen und je nach Bildname ein unterschiedlicher Text in eine interne Variable vom Datentyp String geschrieben. 

Die interne Variable vom Datentyp String wird in der Vorlage einem EA-Feld zugewiesen.

Das VBScript wird beim Aufbau des Startbildes sowie im Aufgabenplaner bei einem Bildwechsel ausgeführt.


```
' BaseScreenName-Eigenschaft
'
' Legt das aktuelle Grundbild fest oder gibt es zurück
 
Dim Bildname
 
Bildname = HmiRuntime.BaseScreenName
 
If Bildname = "Startbild" Then
   SmartTags("Bildtext") = "Text für Startbild"
End If
 
If Bildname = "Systembild" Then
    SmartTags("Bildtext") = "Text für Systembild"
End If
```
 
Gruß Kai


----------



## mkd (23 Oktober 2008)

Hallo Kai,

jupp, genauso habe ich es jetzt auch gelöst. Zusätzlich lasse ich die entsprechenden LED´s auch noch leuchten , indem ich eine interne Variable mit Werten versehe.

Mein Fehler lag im Detail, ich hatte programmiert:

```
HmiRuntime.ActiveScreen.ObjectName
```
Richtig ist ja:

```
HmiRuntime.BaseScreenName
```
Trotzdem ein großes Danke für deine Ausführliche Erklärung!

Gruß
mkd


----------



## rs-plc-aa (23 Oktober 2008)

Nur mal noch so als Dreingabe:

Wenn man ein Projekt mit dem Projektassistent erstellt kann man auch u.A. diese Funktion automatisch integrieren lassen -> das hierbei generierte Script "DisplayCurrentScreenName" lässt sich dann in jedes Blanko-Projekt einbinden und wird ebenfalls per Aufgabenplaner "bei Bildwechsel" ausgeführt...

Das habe ich mal beim ersten Experimentieren mit Flexible per Zufall entdeckt und es immer wieder verwendet. :s4:

EDIT: Ich muss gestehen nachdem ich mir die Aufgabe das zweite mal durchgelesen habe daß das nur mit dem Script vom Kai geht - weil das von mir genannte ja wirklich NUR den tatsächlichen Bildnamen übernimmt... Na ja, ist halt schon spät gewesen...


----------

