您可以为可视化配置用户输入,使引用的可视化以对话框的形式打开。例如,用户点击一个按钮,就会打开一个要求输入数值的对话框。对话框用于收集用户输入,如果是模式对话框,则可能导致对话框之外的输入被阻止。
只有可视化类型为“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
另见