Skip to main content

捕获用户输入事件

您可以在应用程序中捕获用户输入事件。为此,您可以实现一个在用户事件发生时执行的功能块。

注意

Kann auch veraltet sein通过用户输入捕获变量变化的示例项目

示例项目记录了可视化中用户输入触发的变量值变化。在此项目中,您还可以找到该方法的实现ValueChanged

捕获变量的写入

当用户完成输入值(在输入字段中)时,编辑控件事件将关闭。您可以在应用程序中按如下方式捕获此事件。

  1. 创建实现接口的功能块VisuElems.IEditBoxInputHandler从图书馆VisuElemBase

  2. 将实例传递给全局事件管理器VisuElems.Visu_Globals.g_VisuEventManager通过调用方法SetEditBoxEventHandler

7. 例子

可视化有两个输入字段,用于iInput_ArInput_B和一个文本输出元素。

输入字段是矩形,提示用户单击以输入文本。

文本输出元素是一个矩形,其中文本变量的内容PLC_PRG.stInfo被打印出来。文本变量包含用户在某个输入字段中最后输入的内容以及添加的附加信息。

_visu_img_hook_control_event.png

矩形的属性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
(* 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'));                        


捕获键盘事件

当用户按下并释放按键时,可视化中会触发键盘事件。您可以按如下方式在应用程序中捕获此事件。

  1. 创建实现接口的功能块VisuElems.IKeyEventHandler从图书馆VisuElemBase

  2. 将实例传递给全局事件管理器VisuElems.Visu_Globals.g_VisuEventManager通过调用方法SetKeyEventHandler

8. 例子

可视化包含一个文本输出元素。文本输出元素是一个矩形,其中显示文本变量的内容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

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

方法的实现VariableWritten功能块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'));
                        


记录输入事件触发的变量值变化

所有通过用户输入改变变量值的可视化元素都会调用该接口IValueChangedListener通过此接口,可以记录值的变化,然后通过编程进行处理。

注意

Kann auch veraltet sein通过用户输入捕获变量变化的示例项目

示例项目记录了可视化中用户输入触发的变量值变化。在此项目中,您还可以找到该方法的实现ValueChanged

  1. 实现功能块(例如:POU ) 实现接口IValueChangedListener

    FUNCTION_BLOCK POU IMPLEMENTS VisuElems.IValueChangedListener

    在设备树中,值改变方法插入功能块下方。

  2. 在一个程序中(例如: PLC程序 ),实现注册接口的IEC代码。

    VisuElems.g_itfValueChangedListenerManager.AddValueChangedListener(itfValueChangedListener)

    PLC程序通过获取所有值的变化值改变方法。

    现在您可以记录和处理值的变化。

使用输入选项捕获元素上的输入

当用户点击一个对输入做出反应的元素(例如,具有输入配置的矩形)时,会引发一个事件。您可以按如下方式在应用程序中捕获此事件。

  1. 创建实现接口的功能块VisuElems.IInputOnElementEventHandler从图书馆VisuElemBase

  2. 将实例传递给全局事件管理器VisuElems.Visu_Globals.g_VisuEventManager通过调用方法SetInputOnElementEventHandler

9. 例子

可视化效果中有一个矩形框,用于响应输入。例如,变量的切换已配置为OnMouseDown。当元素被鼠标或触摸输入点击时,事件HandleInputOnElementEvent被提出。

函数的实现VisuInit

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

功能块的实现POU

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

方法的实现HandleInputOnElementEvent功能块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)
*)