Capturing User Input Events¶
You can capture user input events in the application. For this purpose, you can implement a function block that is executed when user events occur.
Capturing the writing of variables
When the user completes the input of a value (in an input field), an edit control event is closed. You can capture this event in the application as follows.
Create a function block that implements the
VisuElems.IEditBoxInputHandler
interface from theVisuElemBase
library.Pass the instance to the global event manager
VisuElems.Visu_Globals.g_VisuEventManager
by calling theSetEditBoxEventHandler
method.
Example
A visualization has two input fields for iInput_A
and rInput_B
and one text output element.
The input fields are rectangles that the user is prompted to click in order to input text.
The text output element is a rectangle where the contents of the text variable PLC_PRG.stInfo
are printed. The text variable contains the last input by a user in one of the input fields and the additional information that was added.
Properties of the rectangle iInput_A |
|
iInput_A: %i |
|
PLC_PRG.iInput_A | |
Properties of the rectangle rInput_B |
|
iInput_B: %i |
|
PLC_PRG.rInput_B | |
Properties of the rectangle for the text output | |
%s |
|
PLC_PRG.stInfo |
PLC_PRG
implementation
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
implementation
FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IEditBoxInputHandler
(* no further declarations, no implementation code *)
Method 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'));
Capturing keyboard events
When the user presses and releases the key, a keyboard event is triggered in the visualization. You can capture this event in the application as follows.
Create a function block that implements
VisuElems.IVisuUserEventManager
from theVisuElemBase
library.Pass the instance to the global event manager
VisuElems.Visu_Globals.g_VisuEventManager
by calling theSetKeyEventHandler
method.
Example
A visualization has one text output element. The text output element is a rectangle where the contents of the text variable PLC_PRG.stInfo
are printed. The text variable contains information about the last key pressed by the user.
Properties of the rectangle for the text output | |
%s |
|
PLC_PRG.stInfo |
Implementation of the PLC_PRG
program
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
Implementation of the POU
function block
FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IKeyEventHandler
(* no further declarations, no implementation code *)
Implementation of the VariableWritten
method of the POU
function block
/// 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'));
Recording variable value changes triggered by input events
All visualization elements that change the value of a variable by user input call the IValueChangedListener
interface. With this interface, the value changes can be recorded and then processed programmatically.
Implement a function block (example:
POU
) that implements theIValueChangedListener
interface.FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IValueChangedListener
- ⇒
In the device tree, the ValueChanged method is inserted below the function block.
In a program (example: PLC_PRG), implement the IEC code that registers the interface.
VisuElems.g_itfValueChangedListenerManager.AddValueChangedListener(itfValueChangedListener)
- ⇒
PLC_PRG receives all value changes by means of the ValueChanged method.
Now you can record and process the value changes.