文章目录
- 前言
- 一、步骤及解析
- 二、运行画面演示
- 三、总结
前言
在常见的Wincc上位机画面中,点击按钮或控件弹出弹窗,由于不同的弹窗内容不同,变量前缀不同,通常情况下一个弹窗就需要调用一个画面窗口,但画面窗口过多会导致画面卡顿,添加过程也过于繁琐,故本文给出一种多个控件重复调用一个弹窗的解决方案。
该方法适用于一个弹窗内部变量共用一个变量前缀的情况,但不适用于一个弹窗内部变量使用多个变量前缀的情况。
一、步骤及解析
-
新建一个主画面,在画面中添加一个画面窗口对象;
这里将新画面命名为“Start_New”。

-
更改该画面窗口对象的属性;
对象名称可以随意设置,这里设置为PIC_WINDOW1,同时根据下图设置其它属性。

-
新建一个子画面,并添加需要的按钮或其它对象;
这里将子画面命名为“@单输出电机” 。
注意:弹窗内部的对象只连接对应变量的后缀名。如下图所示:

-
在主画面中添加第一个按钮或控件;
在该控件的事件选项卡中,选择对象事件,单击,添加C动作。

编写如下脚本:
#include "apdefap.h"
void Click(char* lpszPictureName, char* lpszObjectName )
{
#define H 300
#define W 250
#define WH 920
#define WW 1920
#define TEXT "单输出电机1"
#define TAGPREFIX "M1"
#define PICTURENAME "@单输出电机.PDL"
#define WINDOW "PIC_WINDOW1"
SetPropBOOL(lpszPictureName,WINDOW,"Visible",0);
SetPropChar(lpszPictureName,WINDOW,"CaptionText",TEXT); //返回类型:BOOL
SetPropChar(lpszPictureName,WINDOW,"tagprefix",TAGPREFIX); //返回类型:BOOL
SetPropChar(lpszPictureName,WINDOW,"PictureName",PICTURENAME); //返回类型:BOOL
SetWidth(lpszPictureName,WINDOW,W);
SetHeight(lpszPictureName,WINDOW,H);
if ((WW-W)<GetLeft(lpszPictureName,lpszObjectName))
SetLeft(lpszPictureName,WINDOW,WW-W-50);
else
SetLeft(lpszPictureName,WINDOW,GetLeft(lpszPictureName,lpszObjectName)+50);
if ((WH-H)<GetTop(lpszPictureName,lpszObjectName))
SetTop( lpszPictureName,WINDOW,WH-H-70);
else
SetTop( lpszPictureName,WINDOW,GetTop(lpszPictureName,lpszObjectName)+70);
SetPropBOOL(lpszPictureName,WINDOW,"Visible",1);
代码注释如下:
#include "apdefap.h":包含一个名为apdefap.h的头文件,这个文件可能包含了某些宏定义、函数声明等,是这段代码运行所依赖的环境。void Click(char* lpszPictureName, char* lpszObjectName ):这是Click函数的声明,它不接受任何返回值。#define H 300等宏定义:为代码中的常量值定义了简短的标识符,分别代表子画面弹窗的高度(H)、宽度(W)、主画面的高度(WH)、宽度(WW)、弹窗标题文本(单输出电机1)、弹窗内的变量的前缀(M1)、要调用的弹窗名称(@单输出电机.PDL)和主画面名称(PIC_WINDOW1)。SetPropBOOL、SetPropChar、SetWidth、SetHeight、SetLeft、SetTop和GetLeft、GetTop:这些是函数调用,它们用来设置窗口的属性,如可见性、标题文本、位置和大小。SetPropBOOL和SetPropChar函数用来设置不同的属性值,SetWidth和SetHeight函数用来设置宽度和高度,SetLeft和SetTop函数用来设置水平和垂直位置,而GetLeft和GetTop函数用来获取当前对象的位置。if语句块:这些语句用来判断和设置窗口的位置。如果弹窗当前的左侧位置大于主画面的宽度减去弹窗的宽度((WW-W)<GetLeft(lpszPictureName,lpszObjectName)),则将弹窗的左侧位置设置为WW-W-50;否则,设置为当前弹窗左侧位置加上50。对于顶部位置也有类似的逻辑。
这里+50或+70是为了弹窗不会遮挡住按钮或控件,可根据实际需求进行调整。SetPropBOOL(lpszPictureName,WINDOW,"Visible",1);:这行代码将窗口的可见性属性设置为1,即显示窗口。
- 再次新建一个子画面,并添加需要的按钮或其它对象;
这里将子画面命名为“@单输出电磁阀” 。同样的,弹窗内部的对象只连接对应变量的后缀名。

- 在主画面中添加第二个按钮或控件;
在该控件的事件选项卡中,选择对象事件,单击,添加C动作。

编写如下脚本:
#include "apdefap.h"
void Click(char* lpszPictureName, char* lpszObjectName )
{
#define H 300
#define W 250
#define WH 920
#define WW 1920
#define TEXT "单输出电磁阀1"
#define TAGPREFIX "Valve1"
#define PICTURENAME "@单输出电磁阀.PDL"
#define WINDOW "PIC_WINDOW1"
SetPropBOOL(lpszPictureName,WINDOW,"Visible",0);
SetPropChar(lpszPictureName,WINDOW,"CaptionText",TEXT); //返回类型:BOOL
SetPropChar(lpszPictureName,WINDOW,"tagprefix",TAGPREFIX); //返回类型:BOOL
SetPropChar(lpszPictureName,WINDOW,"PictureName",PICTURENAME); //返回类型:BOOL
SetWidth(lpszPictureName,WINDOW,W);
SetHeight(lpszPictureName,WINDOW,H);
if ((WW-W)<GetLeft(lpszPictureName,lpszObjectName))
SetLeft(lpszPictureName,WINDOW,WW-W-50);
else
SetLeft(lpszPictureName,WINDOW,GetLeft(lpszPictureName,lpszObjectName)+50);
if ((WH-H)<GetTop(lpszPictureName,lpszObjectName))
SetTop( lpszPictureName,WINDOW,WH-H-70);
else
SetTop( lpszPictureName,WINDOW,GetTop(lpszPictureName,lpszObjectName)+70);
SetPropBOOL(lpszPictureName,WINDOW,"Visible",1);
}
这里的弹窗标题为”单输出电磁阀1“,变量前缀为"Valve1",调用的弹窗名称为"@单输出电磁阀.PDL",其它不变。
二、运行画面演示


三、总结
该方法的优势在于,只需要添加一个画面窗口对象,通过更改不同按钮或控件对象的C脚本,实现弹窗重复多次调用,比较方便。



















