CODESYS Visualization > 配置用户输入 > 捕获用户输入事件 |
当用户完成值的输入时(在输入字段中),编辑控件事件将关闭。你可以在应用程序中捕获此事件,如下所示。
1. | 在VisuElemBase库中的VisuElems.IEditBoxInputHandler界面创建一个功能块。 |
2. | 通过调用SetEditBoxEventHandler方法将实例传递给全局事件管理器VisuElems.Visu_Globals.g_VisuEventManager。 |
.示例
一个可视化有两个用于iInput_A 和 rInput_B的输入字段和一个文本输出元素。
输入字段是矩形,用户被提示单击以输入文本。
文本输出元素是一个矩形,其中打印了文本变量PLC_PRG.stInfo的内容。文本变量包含用户在一个输入字段中的最后一个输入,以及添加的附加信息。
矩形iInput_A的属性 | |
文本 ➔ 文本 | iInput_A: %i |
文本变量 ➔ 文本变量 | PLC_PRG.iInput_A |
矩形rInput_B的属性 | |
文本 ➔ 文本 | iInput_B: %i |
文本变量 ➔ 文本变量 | PLC_PRG.rInput_B |
文本输出的矩形的属性 | |
文本 ➔ 文本 | %s |
文本变量 ➔ 文本变量 | PLC_PRG.stInfo |
.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
.POU 实现
FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IEditBoxInputHandler
(* no further declarations, no implementation code *)
.VariableWritten 方法分配给 POU
METHOD VariableWritten:BOOL
(*总是提供一些信息,当编辑控制字段在可视化中关闭时,这是一个变量被用户输入到上面的一个矩形*)
VAR_INPUT
pVar : POINTER TO BYTE;
varType : VisuElems.Visu_Types;
iMaxSize : INT;
pClient : POINTER TO VisuElems.VisuStructClientData;
END_VAR
// 字符串 stInfo,将显示在下方的矩形中,在这里组成
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'));
当用户按下并释放该键时,将在可视化中触发键盘事件。你可以在应用程序中捕获此事件,如下所示。
1. | 创建一个从 VisuElemBase 库实现 VisuElems.IVisuUserEventManager 的功能块。 |
2. | 通过调用SetKeyEventHandler 方法将实例传递给全局事件管理器VisuElems.Visu_Globals.g_VisuEventManager。 |
.示例
一个可视化有一个文本输出元素。文本输出元素是一个矩形,其中打印了文本变量PLC_PRG.stInfo的内容。文本变量包含关于用户最后按下的键的信息。
文本输出的矩形的属性 | |
文本 ➔ 文本 | %s |
文本变量 ➔ 文本变量 | PLC_PRG.stInfo |
.实现 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
.实现POU功能块的VariableWritten方法
/// 这个方法将在释放键事件后被调用。
/// RETURN:
/// TRUE - 当处理程序已处理此事件,且不应由其他人处理时
/// FALSE - 当此处理程序不处理事件时
METHOD HandleKeyEvent : BOOL
VAR_INPUT
/// 事件类型.如果key-up事件被释放,该值为真。
bKeyUpEvent : BOOL;
/// Key code
dwKey : DWORD;
/// Modifier.可能值:
/// VISU_KEYMOD_SHIFT : DWORD := 1;
/// VISU_KEYMOD_ALT : DWORD := 2;
/// VISU_KEYMOD_CTRL : DWORD := 4;
dwModifiers : DWORD;
/// 指向客户端结构的指针事件被释放
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'));
所有通过用户输入更改变量值的可视化元素都调用 IValueChangedListener 接口。通过这个接口,可以记录值的变化,然后以编程的方式处理。
在CODESYS Store,你会找到一个示例工程"Visu Value Change Handler"。示例工程记录了可视化中由用户输入触发的变量值更改。在这个工程中。您还将找到ValueChanged 方法的实现。 |
1. | 实现一个功能块(示例:POU),此功能块实现IValueChangedListener界面。 FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IValueChangedListener
| ||||
2. | 在程序中(例如:PLC_PRG),实现注册接口的IEC代码。 VisuElems.g_itfValueChangedListenerManager.AddValueChangedListener(itfValueChangedListener)
|