HMI - Verwendung Datagrid - Problem Ellipse bei Statuswechsel einfärben

STEP7_NEWBEE

Level-2
Beiträge
164
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich verwende in TwinCAT HMI gerade ein Datagrid mit dem ich auf ein Array of Struct zugreife.

1754992624165.png1754993466747.png
- Der Zugriff funktioniert auch soweit und die Daten werden eingetragen.

Ziel: Ich wollte abhängig von der "Auswahl" - Den Proben die der Benutzer konfiguriert hat, LED-Anzeigen einfärben.

Das einfärben funktioniert jedoch nicht so, wie ich das gerne hätte:

Ein Teil der Anzeigen aktualisiert erst seinen Wert (ändert seine Farbe), wenn ich im Datagrid bei Auswahl "1" einen Zustandswechsel habe. - Wie wenn dieser Button die restlichen Anzeigen aktualisieren würde.
1754994068735.png1754994153467.png

Konfiguration: (Probe 1: ausgeschaltet, Probe 2 bis 5 sollten grün leuchten) - Tun sie aber leider nicht.
1754993019505.png1754993074497.png
Das geschieht erst, sobald ich den ersten Eintrag im Datagrid verändere.

1754993160544.png1754993178121.png

Ich möchte jedoch erreichen, dass sich die Farbe des Buttons sofort ändert, sobald dieser über die Auswahl vom Benutzer konfiguriert wird.

Kann mir jemand helfen / erklären, welche Einstellung ich hier vl falsch verwende? / Wo mein Problem liegen kann?

Komisch finde ich nämlich vor allem, das die "Anzeige 3" auch den Wert sofort übernimmt, die anderen Anzeigen benötigen wie oben beschrieben den Zustandswechsel.

Vielen Dank im Voraus!

LG
 

Anhänge

  • 1754992744140.png
    1754992744140.png
    14,6 KB · Aufrufe: 4
Zuletzt bearbeitet:
Prüfe mal ob bei deinem Custom-Event die Variable richtig drin steht bzw. das richtige Array-Element.

Das ist auf dem Bild nicht richtig ersichtlich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo mgl! Vielen Dank für deine Rückmeldung!

Also die Variable und das Array - Element sollten vom Zugriff her passen. Es scheint ja so, wie wenn die Farbänderung nur durch einen Zustandswechsel des 1. Eintrags aktiviert wird. Oder hab ich hier vl. etwas falsch konfiguriert?
1755016731288.png
1755016782405.png


Vielen Dank!

LG
 
Wenn ich das richtig sehe, dann hast du hier ein event erstellt, das getriggert wird, sobald sich die "FillColor" der "LED_Probe_2" ändert.
1755062153673.png
Dass das ganze überhaupt funktioniert ist daher recht erstaunlich.

Was du ja aber eigentlich machen wolltest, ist ein Event, das getriggert wird, wenn sich "bAuswahl" des entsprechenden Arrayindexes ändert, oder?

Zum grundsätzlichen Verständnis zu diesen Custom Events:
Man trägt hier im Reiter mit dem Blitz-Icon immer den Trigger ein. So wird es ja auch bei den anderen Events (z.B. "onAttached") gemacht.
Das was dann passieren soll, und welche Werte gelesen oder geschrieben werden, das wird dann im Event selbst konfiguriert.

in deinem Fall müsstest du also das event mit "bAuswahl" verknüpfen.

Alternativ kann man solche sachen auch mit if-else-Abfragen direkt in dem Menü mit den normalen Einstellungen machen. Finde ich deutlich übersichtlicher, weil man auf den ersten Blick sieht, dass die Farbe sich ändern kann.

Bei meinen Menübuttons mache ich es z.B. so:
1755062558526.png

Wenn also die beiden Parameter des Usercontrols übereinstimmen, dann ist der Button aktiv, dann wird er Dunkelblau, sonst ist er Dunkelgrau.
Achtung mit Groß- und Kleinschreibung.

So als allgemeinen Tipp würde ich dir empfehlen, bei allem was mit Farben zu tun hat dir zuerst mal Variablen anzulegen, die den Farbwert bestimmen. Alleine schon bei deinen 10 LEDs wird das sonst ein Wahnsinnsaufwand, wenn jemand später doch lieber ein etwas dunkleres Grün haben möchte.
Hier gibts natürlich noch die Möglichkeit das ganze über die verschiedenen Themes zu machen, ob der Aufwand notwendig ist kann ich nicht sagen.
 
Hallo,

Danke für die Erläuterung, da lag mein Fehler! - das Umschalten der Farben funktioniert nun so wie es soll :)

Ich hab meine Schnittstelle zwischen Visualisierung & PLC so aufgebaut, dass es eine Struktur gibt über die ich alle Informationen austausche, welche dann für die Interaktion mit dem Bediener benötigt werden.

Hab ich deine Herangehensweise mit der Variable so richtig verstanden:

Du legst dir auf der PLC z.B. in einer Struktur eine Variable an ("ButtonGedrückt") , in der dann die Farbe des Buttons abgespeichert wird?
und verknüpfst diese dann mit den Farbeigenschaften deiner Button? - also wenn du die Farbzusammensetzung in der PLC änderst, ändern sich alle verknüpften Button automatisch mit?

Bzw wäre die Alternative das ganze über Themens zu machen, wo eine Typdefinition hinterlegt ist - wenn du dein Theme "Button" änderst, ändern sich eben alle Button in der Visualisierung gleich mit (Farbe, Größe usw.) ?

LG
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, nicht ganz. Die Codes für die Farbwerte, die stehen in den Variablen "ColorDarkBlue" und "ColorDarkGrey". Das sind aber keine SPS-Variablen, sondern interne Variablen der HMI:
1755073975697.png

Daher sind die Variablen auch rot (siehe screenshot von meinem vorherigen Beitrag) und mit einem "I" gekennzeichnet.

Wenn ich jetzt das Grün grüner oder das Blau blauer haben will, dann kann ich das an einer zentralen Stelle tun.

Die Verknüpfung zur SPS geht über die ToggleIndex-Variablen. Die sind hier gelb, da ich mich in einem Usercontrol bewege und Parameter an das Usercontrol übergebe (daher das "P"). Aber genausogut kannst du hier eine Boolsche Variable nehmen (Ich vergleiche ja zwei Integer mit "==", das Ergebnis ist auch ein Bool.
Bei mir sind es halt Menübuttons, da darf nur exakt einer aktiv sein, daher ist es besser, wenn man das über einen Integer als zig Bools macht.
 
ok vielen Dank für die Erklärung! du hast mir schon weiter geholfen.

Hab nun das Custom "Trigger Event" auf den Struktur Eintrag "bAuswahl" in der PLC verknüpft und die Farben der Button über HMI interne Variablen angesteuert.

1755079052152.png

Themes für die LED Anzeigen verwende ich hier noch nicht, weil es nur 18 Leds sind - aber ich verstehe soweit deinen Ansatz, das bei größeren HMI Mutter-Kind Beziehungen notwendig sind, da ansonsten der manuelle Aufwand zu groß wird um alle Eigenschaften händisch zu ändern.

1755078666291.png1755078698924.png
Aber die Farben gleich direkt als Funktion im Reiter "FillColor" zu hintelegen, wäre whs ein wenig übersichtlicher.

Vielen Dank für deinen Input!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau das hab ich gemeint, finde deine Version soweit auch übersichtlicher! wenn man das Einfärben direkt unter "FillColor" hinterlegt und nicht wie ich in einer Aktion... vl ändere ich das auch noch um. :´-)
 
Hallo PatrickSt,

Ich hätte noch eine Frage zu deiner Antwort von oben:
Wenn ich das richtig sehe, dann hast du hier ein event erstellt, das getriggert wird, sobald sich die "FillColor" der "LED_Probe_2" ändert.
Anhang anzeigen 89972
Dass das ganze überhaupt funktioniert ist daher recht erstaunlich.

Was du ja aber eigentlich machen wolltest, ist ein Event, das getriggert wird, wenn sich "bAuswahl" des entsprechenden Arrayindexes ändert, oder?

Zum grundsätzlichen Verständnis zu diesen Custom Events:
Man trägt hier im Reiter mit dem Blitz-Icon immer den Trigger ein. So wird es ja auch bei den anderen Events (z.B. "onAttached") gemacht.
Das was dann passieren soll, und welche Werte gelesen oder geschrieben werden, das wird dann im Event selbst konfiguriert.

in deinem Fall müsstest du also das event mit "bAuswahl" verknüpfen.

Alternativ kann man solche sachen auch mit if-else-Abfragen direkt in dem Menü mit den normalen Einstellungen machen. Finde ich deutlich übersichtlicher, weil man auf den ersten Blick sieht, dass die Farbe sich ändern kann.

Bei meinen Menübuttons mache ich es z.B. so:
Anhang anzeigen 89973

Wenn also die beiden Parameter des Usercontrols übereinstimmen, dann ist der Button aktiv, dann wird er Dunkelblau, sonst ist er Dunkelgrau.
Achtung mit Groß- und Kleinschreibung.

So als allgemeinen Tipp würde ich dir empfehlen, bei allem was mit Farben zu tun hat dir zuerst mal Variablen anzulegen, die den Farbwert bestimmen. Alleine schon bei deinen 10 LEDs wird das sonst ein Wahnsinnsaufwand, wenn jemand später doch lieber ein etwas dunkleres Grün haben möchte.
Hier gibts natürlich noch die Möglichkeit das ganze über die verschiedenen Themes zu machen, ob der Aufwand notwendig ist kann ich nicht sagen.
Ich wollte die Farbe einer Ellipse nun abhängig vom Zustand einer PLC-Variable verändern, und hierfür das "Function-binding" der Ellipse benutzen.

Nur ändert sich die Farbe meiner Ellipse jedoch nicht wenn ich "TEST_konfiguriert" auf True setze, und ich weiß aktuell noch nicht, wo das Problem genau liegt? kannst du mir hier vl. kurz helfen?
Ich möchte eben auf kein Event warten, das die Farbumschaltung triggert- sondern direkt abhängig von einer PLC Variable die Farbe entsprechend umschalten.

1757344645365.png

Also ich hätte mir erwartet, dass die Farbe der Ellipse auf "Probe_Detektiert" umschaltet, wenn TEST_konfiguriert auf TRUE ist und sobald ich TEST_konfiguriert = FALSE auf der PLC auf FALSE schaltet, schaltet die Füllfarbe auf "Probe_Fehler".

Siehst du hier einen Fehler?


LG
 

Anhänge

  • 1757344573401.png
    1757344573401.png
    11,9 KB · Aufrufe: 5
  • 1757344437439.png
    1757344437439.png
    17,5 KB · Aufrufe: 5
  • 1757344369333.png
    1757344369333.png
    37,4 KB · Aufrufe: 5
Hallo PatrickSt,

Ich hätte noch eine Frage zu deiner Antwort von oben:

Ich wollte die Farbe einer Ellipse nun abhängig vom Zustand einer PLC-Variable verändern, und hierfür das "Function-binding" der Ellipse benutzen.

Nur ändert sich die Farbe meiner Ellipse jedoch nicht wenn ich "TEST_konfiguriert" auf True setze, und ich weiß aktuell noch nicht, wo das Problem genau liegt? kannst du mir hier vl. kurz helfen?
Ich möchte eben auf kein Event warten, das die Farbumschaltung triggert- sondern direkt abhängig von einer PLC Variable die Farbe entsprechend umschalten.

Anhang anzeigen 90535

Also ich hätte mir erwartet, dass die Farbe der Ellipse auf "Probe_Detektiert" umschaltet, wenn TEST_konfiguriert auf TRUE ist und sobald ich TEST_konfiguriert = FALSE auf der PLC auf FALSE schaltet, schaltet die Füllfarbe auf "Probe_Fehler".

Siehst du hier einen Fehler?


LG

Schreib einfach so was:

xDeinSymbol ? '#008000' : '#FF0000';

Eine Zeile, fertig

Die Farbkonstanten können natürlich auch deine internen Variablen sein.

JS ist schon eine feine Sache 😀
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, da musst du mir bitte ein wenig auf die Sprünge helfen .. - ist mir leider gar nicht geläufig...

'#008000' ist die Hintergrundfarbe? - Wie kommst du auf diesen Befehl?
'#FF0000' - wäre die Farbe
und xDeinSymbol?

wo schreibst du diesen Befehl genau hin?

würde gerne wissen, wie ich eine verschachtelte IF-Bedingung hier verwenden kann...

Vielen Dank für deine Hife!
LG
 
Siehst du hier einen Fehler?
Das dürfte an dem großen "I" liegen. JS ist leider CaseSensitive.

Und zu deinen Internen Variablen:
Ich gehe mal davon aus, dass die vom Typ "Color" sind. Aber kein Mensch kann das anhand des Namens erraten. Ich gebe dir den Tipp sie in "Farbe_Probe_Fehler" oder ähnliches umzubenennen.

Die Schreibweise, wie sie APT vorgeschlagen hat kannte ich auch nicht, wird aber bestimmt mal hilfreich sein. Hier die erklärung:
 
Hallo Patrick, danke noch einmal fürs drüberschauen.. ja du hattest recht.. es lag nur am If und am True, müssen beide kleingeschrieben werden.. dann funktionierts:
1757410728031.png

Danke auch für deinen Hinweis mit den Farben und der Nomeklatur, ja stimmt - werd versuchen mich daran zu halten :cool:

Auch danke für den Hinweis mit JavaScript - die Baustelle wollte ich mir aber jetzt nicht noch zusätzlich aufmachen ... vl bei einem meiner nächsten Projekte mit Beckhoff :-)

Andere Frage hab ich noch kurz: die zu verwendenden Befehle - if, true usw, bzw Beispiele .. findet man die im InfoSys? , habt ihr zufällig einen Link bei der Hand?

LG
 
Ok, da musst du mir bitte ein wenig auf die Sprünge helfen .. - ist mir leider gar nicht geläufig...

'#008000' ist die Hintergrundfarbe? - Wie kommst du auf diesen Befehl?
'#FF0000' - wäre die Farbe
und xDeinSymbol?

wo schreibst du diesen Befehl genau hin?

würde gerne wissen, wie ich eine verschachtelte IF-Bedingung hier verwenden kann...

Vielen Dank für deine Hife!
LG

Die Javascript-Baustelle möchtest du nicht aufmachen? Deine 8 Zeilen if... else... sind auch Javascript ;)

xDeinSymbol ? '#008000' : '#FF0000';

Obige Zeile die ich als Alternative vorschlug, vereinfacht es einfach.

Screenshot wie es mit deinen Variablen aussehen würde:
1757414077071.png

Das ? und : funktioniert vergleichbar zum SEL das du aus der SPS-Programmierung kennst, dort würde man für eine einfache Wertumschaltung ja auch nicht mehrere if else Zeilen programmieren, sondern einfach:
FillColor := SEL(TEST_Konfiguriert, Probe_Fehler, Probe_Detektiert);
(...die Variablenbezeichner habe ich jetzt mal von dir übernommen)

Zu deiner Frage bzgl. der Farben:
Das # steht auch in JS dafür, dass das was folgt als Hex-Wert interpretiert wird.
Die Hex-Zeichen sind einfach die 0..255 Anteile von RGB sowie Transparenz.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ok, ja super - danke für den Input! DANKE! für die Vorführung - kannte ich so noch nicht...:cool:

Zu der Zeile aber noch eine Frage - wie oft wird hier der Wert aktualisiert? ich hab bei mir Polling auf 500ms gestellt, wie sieht das bei dieser Schreibweise aus? oder hast dus zur Demonstration bewusst noch weggelassen?

PS: Hab mich vl in meiner Ausdrucksweise (JS) vertan.... (war mir aber bis jz aber auch nicht bewusst :-), dass ich JS bereits verwende ) ..

lG
 
In deinem HMI-Projekt hast du ja irgend eine Default-Pollzeit eingestellt. Was auch immer die ist, diese wird genutzt. Hab mir zum Aufzeigen der einfacheren Lösung jetzt nicht die Mühe gemacht deine Symbolkonfiguration exakt nachzubilden. Du kannst selbstverständlich ggf. eine dedizierte kleinere Pollzeit als deine Default-Pollzeit angeben, mit Doppelklick auf dein Symbol.

Vielleicht noch zur Ergänzung:
Falls dein Umschaltsymbol numerisch wäre, dann einfach direkt hinter dem Symbol, vor dem Fragezeichen bspw. !=0 tippen (-> Farbwechsel wenn Wert deines Symbols ungleich 0)
 
Zurück
Oben