Sie können Benutzereingabeereignisse in der Anwendung erfassen. Zu diesem Zweck können Sie einen Funktionsblock implementieren, der beim Auftreten von Benutzerereignissen ausgeführt wird.
Erfassen des Schreibens von Variablen
Wenn der Benutzer die Eingabe eines Wertes (in einem Eingabefeld) abschließt, wird ein Bearbeitungssteuerungsereignis geschlossen. Sie können dieses Ereignis in der Anwendung wie folgt erfassen.
-
Erstellen Sie einen Funktionsblock, der die Schnittstelle
VisuElems.IEditBoxInputHandleraus der BibliothekVisuElemBaseimplementiert. -
Übergeben Sie die Instanz an den globalen Ereignismanager
VisuElems.Visu_Globals.g_VisuEventManager, indem Sie die MethodeSetEditBoxEventHandleraufrufen.
Beispiel
Eine Visualisierung hat zwei Eingabefelder für iInput_A und rInput_B und ein Textausgabeelement.
Die Eingabefelder sind Rechtecke, auf die der Benutzer klicken muss, um Text einzugeben.
Das Textausgabeelement ist ein Rechteck, in dem der Inhalt der Textvariablen PLC_PRG.stInfo gedruckt wird. Die Textvariable enthält die letzte Eingabe eines Benutzers in eines
der Eingabefelder und die zusätzlichen Informationen, die hinzugefügt wurden.
|
Eigenschaften des Rechtecks |
|
|
„Texts Text“ |
|
|
„Textvariablen Textvariable“ |
PLC_PRG.iInput_A |
|
Eigenschaften des Rechtecks |
|
|
„Texts Text“ |
|
|
„Textvariablen Textvariable“ |
PLC_PRG.rInput_B |
|
Eigenschaften des Rechtecks für die Textausgabe |
|
|
„Texts Text“ |
|
|
„Textvariablen Textvariable“ |
PLC_PRG.stInfo |
PLC_PRG Umsetzung
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
POU Umsetzung
FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IEditBoxInputHandler (* no further declarations, no implementation code *)
Methode VariableWritten zugeordnet zu 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'));
Erfassen von Tastaturereignissen
Wenn der Benutzer die Taste drückt und wieder loslässt, wird ein Tastaturereignis in der Visualisierung ausgelöst. Sie können dieses Ereignis in der Anwendung wie folgt erfassen.
-
Erstellen Sie einen Funktionsblock, der
VisuElems.IVisuUserEventManageraus der BibliothekVisuElemBaseimplementiert. -
Übergeben Sie die Instanz an den globalen Ereignismanager
VisuElems.Visu_Globals.g_VisuEventManager, indem Sie die MethodeSetKeyEventHandleraufrufen.
Beispiel
Eine Visualisierung hat ein Textausgabeelement. Das Textausgabeelement ist ein Rechteck,
in dem der Inhalt der Textvariablen PLC_PRG.stInfo gedruckt wird. Die Textvariable enthält Informationen über die zuletzt vom Benutzer
gedrückte Taste.
|
Eigenschaften des Rechtecks für die Textausgabe |
|
|
„Texts Text“ |
|
|
„Textvariablen Textvariable“ |
PLC_PRG.stInfo |
Umsetzung 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 Funktionsblocks POU
FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IKeyEventHandler (* no further declarations, no implementation code *)
Implementierung der Methode VariableWritten des Funktionsblocks 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'));
Aufzeichnung von Variablenwertänderungen, die durch Eingangsereignisse ausgelöst werden
Alle Visualisierungselemente, die den Wert einer Variable durch Benutzereingabe verändern,
rufen die Schnittstelle IValueChangedListener auf. Mit dieser Schnittstelle können die Wertänderungen erfasst und dann programmatisch
verarbeitet werden.
-
Implementieren Sie einen Funktionsblock (Beispiel:
POU), der die SchnittstelleIValueChangedListenerimplementiert.FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IValueChangedListenerIm Gerätebaum wird die Methode „ValueChanged“ unterhalb des Funktionsblocks eingefügt.
-
In einem Programm (Beispiel: „PLC_PRG“), implementieren Sie den IEC-Code, der die Schnittstelle registriert.
VisuElems.g_itfValueChangedListenerManager.AddValueChangedListener(itfValueChangedListener)„PLC_PRG“ empfängt alle Wertänderungen mit Hilfe der Methode „ValueChanged“.
Nun können Sie die Wertänderungen erfassen und verarbeiten.
Capturing inputs on elements with input options
When a user clicks an element that reacts to input (for example, a rectangle with an input configuration), an event is triggered. Sie können dieses Ereignis in der Anwendung wie folgt erfassen.
1. Create a function block that implements the interface VisuElems.IInputOnElementEventHandler from the library VisuElemBase.
2. Pass the instance to the global event manager VisuElems.Visu_Globals.g_VisuEventManager by calling the method SetInputOnElementEventHandler.
Example 9. Example
A visualization has a rectangle that reacts to input. For example, the toggling of
a variable has been configured with OnMouseDown. When the element is clicked by a mouse or touch input, an event HandleInputOnElementEvent is triggered.
Implementation of the function VisuInit
FUNCTION VisuInit : BOOL
// Set the input on element event handler VisuElems.VisuElemBase.g_VisuEventManager.SetInputOnElementEventHandler(PLC_PRG.evInputOnElementEventHandler);
Implementation of the function block POU
FUNCTION_BLOCK POU IMPLEMENTS VisuElems.VisuElemBase.IInputOnElementEventHandler
(* no further declarations, no implementation code *)
Implementation of the method HandleInputOnElementEvent of the function block 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)
*)
