Skip to main content

Benutzereingabeereignisse abfangen

Sie können Benutzereingabeereignisse in der Applikation abfangen. Sie können dafür einen Funktionsbaustein implementieren, der bei Eingabeereignissen aufgerufen wird.

Hinweis

Kann auch veraltet seinBeispielprojekt für die Erfassung von Variablanänderungen per Benutzereingabe

Das Beispielprojekt zeichnet Variablenwertänderungen auf, die durch Benutzereingaben innerhalb der Visualisierung ausgelöst wurden. In diesem Projekt finden Sie auch die Implementierung der Methode ValueChanged

Das Schreiben einer Variablen abfangen

Wenn ein Benutzer die Eingabe eines Werts (in einem Eingabefeld) abschließt, wird ein Edit-Control-Ereignis geschlossen. Sie können diese Ereignis in der Applikation folgendermaßen abfangen.

  1. Erstellen Sie einen Funktionsbaustein, der die Schnittstelle VisuElems.IEditBoxInputHandler aus der Bibliothek VisuElemBase implementiert.

  2. Übergeben Sie die Instanz an den globalen Eventmanager VisuElems.Visu_Globals.g_VisuEventManager durch Aufruf der Methode SetEditBoxEventHandler.

Beispiel 7. Beispiel

Eine Visualisierung hat 2 Eingabefeldern für iInput_A und rInput_B und ein Textausgabeelement.

Die Eingabefeldern sind Rechtecke, bei denen ein Benutzer auf einen Mausklick hin zu einer Eingabe aufgefordert wird.

Das Textausgabeelement ist ein Rechteck, in dem der Inhalt der Textvariable PLC_PRG.stInfo ausgegeben wird. Die Textvariable enthält die zuletzt von einem Benutzer getätigte Eingabe auf einem der Eingabefelder und die hinzugefügte zusätzliche Information.

_visu_img_hook_control_event.png

Eigenschaften des Rechtecks iInput_A

Texte → Text

iInput_A: %i

Textvariablen → Textvariable

PLC_PRG.iInput_A

Eigenschaften des Rechtecks rInput_B

Texte → Text

iInput_B: %i

Textvariablen → Textvariable

PLC_PRG.rInput_B

Eigenschaften des Rechtecks für die Textausgabe

Texte → Text

%s

Textvariablen → Textvariable

PLC_PRG.stInfo

Implementierung PLC_PRG

PROGRAM PLC_PRG
VAR_INPUT
    iInput_A:INT;  (* Used in the visualization as user input variable*)
    rInput_B:REAL; (* Used in the visualization as user input variable*)
    stInfo : STRING;  (* Informs about the user input via the edit control field;
                        String gets composed by method 'VariableWritten;
                        Result is displayed in the lower rectangle of the visualization *)
END_VAR
VAR
    inst : POU;
    bFirst : BOOL := TRUE;
END_VAR

IF bFirst THEN
    bFirst := FALSE;
    VisuElems.Visu_Globals.g_VisuEventManager.SetEditBoxEventHandler(inst);
    (* Call of method VariableWritten *)
END_IF                      

Implementierung POU

FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IEditBoxInputHandler
(* no further declarations, no implementation code *)                        

Methode VariableWritten assigned to POU

METHOD VariableWritten : BOOL
(* provides some information always when an edit control field is closed in the visualization, that is a variable gets written by user input in one of the upper rectangles *)
VAR_INPUT
    pVar : POINTER TO BYTE;
    varType : VisuElems.Visu_Types;
    iMaxSize : INT;
    pClient : POINTER TO VisuElems.VisuStructClientData;
END_VAR

// String stInfo, which will be displayed in the lower rectangle, is composed here
PLC_PRG.stInfo := 'Variable written; type: ';
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, INT_TO_STRING(varType));
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, ', adr: ');
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, DWORD_TO_STRING(pVar));
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, ', by: ');
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, SEL(pClient^.globaldata.clienttype = VisuElems.Visu_ClientType.Targetvisualization,'other visu', 'targetvisu'));                        


Tastaturereignis abfangen

Wenn ein Benutzer eine Taste drückt und loslässt, wird in der Visualisierung ein Tastaturereignis ausgelöst. Sie können dieses Ereignis in der Applikation folgendermaßen abfangen.

  1. Erstellen Sie einen Funktionsbaustein, der das Interface VisuElems.IKeyEventHandler aus der Bibliothek VisuElemBase implementiert.

  2. Übergeben Sie die Instanz an den globalen Eventmanager VisuElems.Visu_Globals.g_VisuEventManager durch Aufruf der Methode SetKeyEventHandler.

Beispiel 8. Beispiel

Eine Visualisierung hat ein Textausgabeelement. Das Textausgabeelement ist ein Rechteck, in dem der Inhalt der Textvariable PLC_PRG.stInfo ausgegeben wird. Die Textvariable enthält Information zur zuletzt vom Benutzer getätigten Taste.

Eigenschaften des Rechtecks für die Textausgabe

Texte → Text

%s

Textvariablen → Textvariable

PLC_PRG.stInfo

Implementierung des Programms PLC_PRG

PROGRAM PLC_PRG
VAR_INPUT
    stInfo : STRING;
END_VAR
VAR
    inst : POU;
    bFirst : BOOL := TRUE;
END_VAR

IF bFirst THEN
    bFirst := FALSE;
    VisuElems.Visu_Globals.g_VisuEventManager.SetKeyEventHandler(inst);
END_IF                        

Implementierung des Funktionsbausteins POU

FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IKeyEventHandler
(* no further declarations, no implementation code *)
                        

Implementierung der Methode VariableWritten des FBs POU

/// This method will be called after a key event is released.
/// RETURN:
/// TRUE - When the handler has handled this event and it should not be handled by someone else
/// FALSE - When the event is not handled by this handler
METHOD HandleKeyEvent : BOOL
VAR_INPUT
    /// Event type. The value is true if a key-up event was released.
bKeyUpEvent : BOOL;
    /// Key code
dwKey : DWORD;
    /// Modifier. Possible values:
    /// VISU_KEYMOD_SHIFT : DWORD := 1;
    /// VISU_KEYMOD_ALT : DWORD := 2;
    /// VISU_KEYMOD_CTRL : DWORD := 4;
dwModifiers : DWORD;
    /// Pointer to the client structure were the event was released
    pClient : POINTER TO VisuStructClientData;
END_VAR
VAR
END_VAR

PLC_PRG.stInfo := 'KeyEvent up: ';
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, BOOL_TO_STRING(bKeyUpEvent));
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, ', key: ');
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, DWORD_TO_STRING(dwKey));
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, ', modifier: ');
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, DWORD_TO_STRING(dwModifiers));
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, ', by: ');
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, SEL(pClient^.globaldata.clienttype =
    VisuElems.Visu_ClientType.Targetvisualization,'other visu', 'targetvisu'));
                        


Durch Eingabeereignisse ausgelöste Variablenwertänderungen aufzeichnen

Alle Visulisierungselemente, die durch eine Benutzereingabe den Wert einer Variablen ändern, rufen die Schnittstelle IValueChangedListener auf. Mit dieser Schnittstelle können die Wertänderungen aufgezeichnet und anschließend programmatisch verarbeitet werden.

Hinweis

Kann auch veraltet seinBeispielprojekt für die Erfassung von Variablanänderungen per Benutzereingabe

Das Beispielprojekt zeichnet Variablenwertänderungen auf, die durch Benutzereingaben innerhalb der Visualisierung ausgelöst wurden. In diesem Projekt finden Sie auch die Implementierung der Methode ValueChanged

  1. Implementieren Sie einen Funktionsbaustein, zum Beispiel POU, der die Schnittstelle IValueChangedListener implementiert.

    FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IValueChangedListener

    Im Gerätebaum wird unter dem Funktionsbaustein die Methode ValueChanged eingefügt.

  2. Implementieren Sie in einem Programm, zum Beispiel PLC_PRG, den IEC-Code der die Schnittstelle anmeldet.

    VisuElems.g_itfValueChangedListenerManager.AddValueChangedListener(itfValueChangedListener)

    Über die Methode ValueChanged erhält PLC_PRG alle Wertänderungen.

    Nun Können Sie die Wertänderungen aufzeichnen und weiterverarbeiten.

Eingaben auf Elemente mit Eingabemöglichkeit abfangen

Wenn ein Benutzer ein Element betätigt, das auf Eingaben reagiert (beispielsweise Rechteck mit Eingabekonfiguration), wird ein Ereignis ausgelöst. Sie können dieses Ereignis in der Applikation folgendermaßen abfangen.

  1. Erstellen Sie einen Funktionsbaustein, der das Interface VisuElems.IInputOnElementEventHandler aus der Bibliothek VisuElemBase implementiert.

  2. Übergeben Sie die Instanz an den globalen Eventmanager VisuElems.Visu_Globals.g_VisuEventManager durch Aufruf der Methode SetInputOnElementEventHandler.

Beispiel 9. Beispiel

Eine Visualisierung hat ein Rechteck, das auf Eingaben reagiert. Es wurde beispielsweise mit OnMouseDown das Toggeln einer Variablen konfiguriert. Wenn nun das Element durch eine Maus - oder Touch-Eingabe betätigt wird, wird ein Event HandleInputOnElementEvent ausgelöst.

Implementierung der Funktion VisuInit

FUNCTION VisuInit : BOOL
// Set the input on element event handler
VisuElems.VisuElemBase.g_VisuEventManager.SetInputOnElementEventHandler(PLC_PRG.evInputOnElementEventHandler);                        

Implementierung des Funktionsbausteins POU

FUNCTION_BLOCK POU IMPLEMENTS VisuElems.VisuElemBase.IInputOnElementEventHandler
(* no further declarations, no implementation code *)                      

Implementiertung der Methode HandleInputOnElementEvent des FBs POU

(* This method will be called when an input on a visualization element was executed.
RETURN:
TRUE - When the handler has handled this event and it should not be handled by someone else
FALSE - When the event is not handled by this handler*)

METHOD HandleInputOnElementEvent : BOOL
    VAR_INPUT
    event    : VisuElems.VisuStructInputOnElementEvent;
END_VAR
IF event.eType = VisuElems.VisuEnumInputOnElementType.MouseDown THEN
    SysProcessExecuteCommand('python D:\Beep.py', 0);
END_IF                      
(*
Content Beep.py:

import winsound
freq=500
duration=200
winsound.Beep(freq,duration)
*)