C脚本实现Wincc弹窗重复调用


前言

在常见的Wincc上位机画面中,点击按钮或控件弹出弹窗,由于不同的弹窗内容不同,变量前缀不同,通常情况下一个弹窗就需要调用一个画面窗口,但画面窗口过多会导致画面卡顿,添加过程也过于繁琐,故本文给出一种多个控件重复调用一个弹窗的解决方案。

该方法适用于一个弹窗内部变量共用一个变量前缀的情况,但不适用于一个弹窗内部变量使用多个变量前缀的情况。


一、步骤及解析

  1. 新建一个主画面,在画面中添加一个画面窗口对象;
    这里将新画面命名为“Start_New”。
    在这里插入图片描述

  2. 更改该画面窗口对象的属性;
    对象名称可以随意设置,这里设置为PIC_WINDOW1,同时根据下图设置其它属性。在这里插入图片描述
    在这里插入图片描述

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

  4. 在主画面中添加第一个按钮或控件;
    在该控件的事件选项卡中,选择对象事件,单击,添加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)。
  • SetPropBOOLSetPropCharSetWidthSetHeightSetLeftSetTopGetLeftGetTop:这些是函数调用,它们用来设置窗口的属性,如可见性、标题文本、位置和大小。SetPropBOOLSetPropChar 函数用来设置不同的属性值,SetWidthSetHeight 函数用来设置宽度和高度,SetLeftSetTop 函数用来设置水平和垂直位置,而 GetLeftGetTop 函数用来获取当前对象的位置。
  • if 语句块:这些语句用来判断和设置窗口的位置。如果弹窗当前的左侧位置大于主画面的宽度减去弹窗的宽度((WW-W)<GetLeft(lpszPictureName,lpszObjectName)),则将弹窗的左侧位置设置为 WW-W-50;否则,设置为当前弹窗左侧位置加上50。对于顶部位置也有类似的逻辑。
    这里+50或+70是为了弹窗不会遮挡住按钮或控件,可根据实际需求进行调整。
  • SetPropBOOL(lpszPictureName,WINDOW,"Visible",1);:这行代码将窗口的可见性属性设置为 1,即显示窗口。
  1. 再次新建一个子画面,并添加需要的按钮或其它对象;
    这里将子画面命名为“@单输出电磁阀” 。同样的,弹窗内部的对象只连接对应变量的后缀名。
    在这里插入图片描述
  2. 在主画面中添加第二个按钮或控件;
    在该控件的事件选项卡中,选择对象事件,单击,添加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脚本,实现弹窗重复多次调用,比较方便。

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值