您可以为可视化配置用户输入,使引用的可视化以对话框的形式打开。例如,用户点击一个按钮,就会打开一个要求输入数值的对话框。对话框用于收集用户输入,如果是模式对话框,则可能导致对话框之外的输入被阻止。
只有可视化类型为“Dialog” 的可视化才能以对话框形式打开。可视化类型在可视化对象的对话框“Properties” 中配置。
基本程序:
要求:该项目包含一个主可视化和一个对话框。
-
使用“OpenDialog” 为对话框配置主可视化的用户输入。
对话框的打开方式已配置。
-
使用“CloseDialog” 为对话框元素配置用户输入操作。
提示:对于非模式对话框,也可以配置用户输入,以便在对话框外关闭。
对话框的关闭方式已配置。
您还可以使用对话框库中的对话框来代替自制对话框。例如,如果项目中集成了库VisuDialogs
,则可以使用其中包含的对话框VisuDialogs.Login
或VisuDialogs.FileOpenSave
。
将可视化对象配置为对话框
-
在视图“设备” 中选择对象,打开右键菜单并选择“属性” 命令。
-
选择“Visualization” 选项卡。
-
激活“对话框” 选项,并用“OK” 关闭对话框。
可视化类型为“Dialog” ,可按此类型调用。
配置对话呼叫
在调用对话框时,用户通常会点击一个按钮,然后打开一个对话框,要求输入信息。
在下面的示例中,通过日历对话框可以输入日期。
要求:该项目包含可视化visMain
和dlgCalender
。
-
将
dlgCalender
的可视化类型设为对话框。 -
将矩形拖入可视化
visMain
。 -
使用文本
Due Date: %t[yyyy-MM-dd]
配置“文本 文本” 的属性。配置属性“文本变量 文本变量” 与
PLC_PRG.dateDue
。 -
将按钮拖入可视化界面
-
使用文本
Open dialog
配置“文本 文本” 的属性。配置属性“输入配置 OnMouseClick” 为操作“打开对话框” ,
dlgCalender
。用于打开对话框的用户输入已配置。
-
双击对话框
dlgCalender
。 -
将“Date picker” 元素拖入可视化编辑器。
-
配置属性“文本 文本” 与
Due Date: %t[yyyy-MM-dd]
。用
PLC_PRG.dateCalender
配置属性“变量”。属性已配置。
-
将按钮拖入可视化编辑器。
-
配置属性“文本 文本” 与
OK
: -
配置属性“输入配置 OnMouseClick”用于操作“Close Dialog”与
dlgCalender, Result: OK
。 -
配置其他属性“输入配置 OnMouseClick” 为操作“执行 ST 代码” 与
PLC_PRG.dateDue := PLC_PRG.dateCalendar;
。用于关闭对话框的用户输入已配置。
-
将另一个按钮拖入可视化编辑器。
-
配置属性“文本 文本” 与
Cancel
: -
配置属性“输入配置 OnMouseClick” 用于操作“Close Dialog”与
dlgCalender, Result: Cancel
。 -
用于取消对话框的用户输入已配置。
-
编译、加载并启动应用程序。
变量声明:
PROGRAM PLC_PRG VAR dateDue : DATE := DATE#2000-01-01; dateCalendar : DATE; END_VAR
在全球范围内打开对话框
通常,对话框只出现在用户执行了触发事件的显示变量上。
不过,您可以对对话框的打开方式进行配置,使对话框同时出现在可视化管理器中配置的所有活动显示变量上。例如,虽然用户只在CODESYS TargetVisu 上输入了内容,但输入请求可以同时出现在所有显示类型上。
如果用户在CODESYS TargetVisu 显示类型上关闭对话框,则会在所有显示类型上关闭对话框。
您可以使用库VisuElems
中的函数OpenDialog3
和 CloseDialog2
打开和关闭全局对话框。
实现应用程序访问对话框
在程序代码中,您可以访问对话框管理器中管理的对话框。对话框管理器会自动实例化和管理“Dialog” 类型的所有可视化内容。访问通过内部可视化管理器进行。
首先,通过调用内部可视化管理器的GetDialogManager()
方法实现对对话管理器的访问。然后,您可以使用对话框管理器的方法对对话框的程序序列进行编程。
在下面的示例中,对按钮进行了配置,使其在点击时打开预先配置的对话框Login
。用户可以在对话框中输入名称和密码。对话框Login
包含在库VisuDialogs
中。您也可以用同样的方法调用自制的对话框。
从库VisuDialogs
实现应用程序访问对话框Login
:
要求:库VisuDialogs
已集成到项目中。
-
在应用程序下插入一个新的可视化
visMain
。可视化编辑器打开。
-
将按钮拖入可视化编辑器。
-
在其属性中输入“文本”
Login
。按钮上贴有标签。
-
点击“配置”在属性“输入配置 OnMouseDown” 。
-
选择输入操作“执行 ST 代码” ,然后点击
。
-
在 ST 编辑器中输入以下函数调用:
OpenLoginDialog(pClientData);
主可视化包含一个按钮。如果用户点击按钮,就会打开对话框
Login
并调用函数OpenLoginDialog()
。 -
点击“配置”在属性“输入配置 OnDialogClosed” 。
-
选择输入操作“执行 ST 代码” ,然后点击
。
-
在 ST 编辑器中输入以下函数调用:
OnLoginDialogClosed(pClientData);
如果用户关闭对话框,则调用函数
OnLoginDialogClosed()
。
函数 OpenLoginDialog() 的实现:
FUNCTION OpenLoginDialog : BOOL VAR_INPUT pClientData : POINTER TO VisuStructClientData; END_VAR VAR dialogMan : IDialogManager; loginDialog : IVisualisationDialog; pLoginInfo : POINTER TO Login_VISU_STRUCT; // Login_VISU_STRUCT contains the parameters defined in the interface of visualization "Login". result : Visu_DialogResult; stTitle : STRING := 'Login ...'; stPasswordLabelText: STRING; stUserLabelText: STRING; stUsername: STRING; END_VAR dialogMan := g_VisuManager.GetDialogManager(); // The DialogManager is provided via the implicitly available VisuManager IF dialogMan <> 0 AND pClientData <> 0 THEN loginDialog := dialogMan.GetDialog('VisuDialogs.Login'); // Dialog to be opened is specified IF loginDialog <> 0 THEN pLoginInfo := dialogMan.GetClientInterface(loginDialog, pClientData); IF pLoginInfo <> 0 THEN // In the following the parameters of the login dialog in the Login_VISU_STRUCT will be read pLoginInfo^.stTitle := stTitle; pLoginInfo^.stPasswordLabelTxt := stPasswordLabelText; pLoginInfo^.stUserLabelTxt := stUserLabelText; dialogMan.OpenDialog(loginDialog, pClientData, TRUE, 0); END_IF END_IF END_IF
OnLoginDialogClosed()
定义对关闭对话框的反应。
函数OnLoginDialogClosed()
的实现:
FUNCTION OnLoginDialogClosed : BOOL VAR_INPUT pClientData : POINTER TO VisuStructClientData; END_VAR VAR dialogMan : IDialogManager; loginDialog : IVisualisationDialog; pLoginInfo : POINTER TO Login_VISU_STRUCT; result : Visu_DialogResult; stPassword: STRING; stUsername: STRING; END_VAR dialogMan := g_VisuManager.GetDialogManager(); // The DialogManager is provided via the implicitly available VisuManager IF dialogMan <> 0 AND pVisuClient <> 0 THEN loginDialog := dialogMan.GetDialog('VisuDialogs.Login'); // Gets the login dialog IF loginDialog <> 0 THEN result := loginDialog.GetResult(); // Gets the result (OK, Cancel) of the dialog IF result = Visu_DialogResult.OK THEN loginDialog.SetResult(Visu_DialogResult.None); // Reset to default (none) pLoginInfo := dialogMan.GetClientInterface(loginDialog, pVisuClient); // Structure Login_VISU_STRUCT gets read; // In the following the structure parameters can be set IF pLoginInfo <> 0 THEN stPassword := pLoginInfo^.stPasswordpLoginInfo^.stPassword := ''; // Reset the passwword stUsername := pLoginInfo^.stUsername; END_IF ELSIF result = Visu_DialogResult.Cancel THEN loginDialog.SetResult(Visu_DialogResult.None); // React on 'Cancel' ELSE // nothing to do END_IF END_IF END_IF
另见