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

news2024/11/24 14:32:42

文章目录

  • 前言
  • 一、步骤及解析
  • 二、运行画面演示
  • 三、总结


前言

在常见的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脚本,实现弹窗重复多次调用,比较方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1667159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis经典问题:数据不一致

大家好,我是小米,今天我想和大家聊一聊Redis的一个经典问题——数据不一致。在使用Redis的过程中,你是否曾遇到过这样的问题?缓存和数据库中的数据不一致,可能导致应用程序的功能异常。下面,我将详细介绍数据不一致的原因,以及一些有效的解决方案。 什么是数据不一致 …

【muzzik 分享】Cocos 物理帧同步

# 前言 之前没研究帧同步&#xff0c;这是我前端时间没上班时边玩边搞做的 Demo 研究成果&#xff0c;总共时间一周&#xff08;实际2-3天&#xff09;&#xff0c;发布的目的也很简单&#xff0c;打破技术垄断&#xff0c;才能诞生更高端的技术成果。而且就算我没发这篇帖子&…

The 2023 ICPC Asia Hefei Regional Contest

目录 B. Queue Sorting 应该还会再补几题 B. Queue Sorting 题解&#xff1a; Dilworth定理: 【偏序关系与偏序集、Hasse图、极大元、极小元、全序关系、最大元、良序集/三小时讲不完离散数学之集合论/考研复试/期末复习考前冲刺/近世代数/抽象代数】https://www.bilibili.c…

【ARM 嵌入式 C 入门及渐进 16.1 -- C 代码实现CRC32校验函数】

请阅读【嵌入式开发学习必备专栏】 文章目录 CRC32校验函数CRC32 表与函数CRC32 测试函数测试结果 对比测试结果 CRC32校验函数 在C语言中&#xff0c;实现CRC32计算的函数需要一个CRC算法的实现。以下是一个使用查表法实现CRC32的简单例子。这种方法通过预先计算好的CRC表来快…

推导 模型矩阵的逆转置矩阵求运动物体的法向量

一个物体表面的法向量如何随着物体的坐标变换而改变&#xff0c;取决于变换的类型。使用逆转置矩阵&#xff0c;可以安全地解决该问题&#xff0c;而无须陷入过度复杂的计算中。 法向量变化规律 平移变换不会改变法向量&#xff0c;因为平移不会改变物体的方向。 旋转变换会改…

Excel办公技巧之下拉菜单

在日常办工中&#xff0c;经常需在单元格中输入特定的值&#xff0c;此时我们可以使用下拉菜单解决&#xff0c;输入错误和错误值&#xff0c;可以一劳永逸的解决固定数据输入问题。 使用Excel下拉菜单时&#xff0c;它在数据输入和验证方面发挥着重要作用通过点击单元格的下拉…

Mp3tag for Mac:音乐标签,轻松管理

还在为杂乱无章的音乐文件而烦恼吗&#xff1f;Mp3tag for Mac&#xff0c;让您的音乐库焕然一新&#xff01;它支持多种音频格式&#xff0c;批量编辑标签&#xff0c;让音乐管理变得简单高效。同时&#xff0c;自动获取在线数据库的音乐元数据&#xff0c;确保您的音乐库始终…

8种区块链开发者必须知道的顶级编程语言!

我来问你一个问题&#xff1a;请说出一种技术&#xff0c;它以去中心化、不可篡改和透明性等核心特征席卷了全球。 这个问题的答案是&#xff0c;当然是区块链&#xff0c;它在近些年进入大家的视野并颠覆了工商业&#xff0c;没有任何其他技术能够做到这一点。 预计从2020年…

Linux-vi、vim

使用Xshell远程登录到Linux主机进行操作 命令行不用全部掌握&#xff0c; 一般编辑大文件&#xff0c;比较复杂的情况下&#xff0c; 我们还是使用Xftp工具&#xff0c; down下来再恢复回去。

1065: 无向图的连通分量计算

解法&#xff1a; dfs求连通性 1.设节点表vis[] 2.遍历节点表dfs标记&#xff0c;每次得到一个连通分量 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& vis, int v) {//不用终止条件&#x…

day10-Set集合

1.Set 那接下来我们来看Collection单列集合体系的第二部分 Set集合。 1.1 Set集合概述和特点 Set集合特点 1.可以去除重复 2.存取顺序不一致 3.没有带索引的方法&#xff0c;所以不能使用普通fori循环遍历&#xff0c;也不能通过索引来获取&#xff0c;删除Set集合里面的元…

WebSocket 详解加入门实操理解加深

WebSocket 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接…

基于SpringBoot的竹宣非遗宣传网站

摘要 随着互联网的普及和数字化时代的到来&#xff0c;竹编等非物质文化遗产的保护与传承面临新的机遇和挑战。该研究旨在使用SpringBoot后端框架与Vue前端框架&#xff0c;构建一个竹编非遗宣传网站&#xff0c;通过丰富的展示形式和交互体验&#xff0c;提升公众对竹编这一非…

怎么解决端口被占用

目录 一、引言 二、解决方法 一、引言 最近用vscode写网页&#xff0c;老是遇见端口被占用&#xff0c;报错如下&#xff1a; listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. 二、解决方法 1.换…

OpenHarmony 实战开发 - 如何在源码中编译复杂应用(4.0-Release)

文档环境 开发环境&#xff1a;Windows 11 编译环境&#xff1a;Ubuntu 22.04 开发板型号&#xff1a;DAYU 200&#xff08;RK3568&#xff09; 系统版本&#xff1a;OpenHarmony-4.0-Release 功能简介 在 OpenHarmony 系统中预安装应用的 hap 包会随系统编译打包到镜像中&a…

数字水印 | 基于小波变换的数字水印技术

&#x1f34d;原文&#xff1a; 基于小波变换的数字水印技术 &#x1f34d;写在前面&#xff1a; 本文属搬运博客&#xff0c;自己留存学习。 正文 小波变换 把一个信号分解成由基本小波经过移位和缩放后的一系列小波&#xff0c;它是一种 “时间——尺度” 信号的多分辨率分…

# 从浅入深 学习 SpringCloud 微服务架构(十七)--Spring Cloud config(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十七&#xff09;–Spring Cloud config&#xff08;1&#xff09; 一、配置中心的 概述 1、配置中心概述 对于传统的单体应用而言&#xff0c;常使用配置文件来管理所有配置&#xff0c;比如 SpringBoot 的 application.y…

面试中算法(金矿)

有一位国王拥有5座金矿&#xff0c;每座金矿的黄金储量不同&#xff0c;需要参与挖掘的工人人数也不同。 例如&#xff0c;有的金矿储量是5ookg黄金&#xff0c;需要5个工人来挖掘;有的金矿储量是2ookg黄金&#xff0c;需要3个工人来挖掘...... 如果参与挖矿的工人的总数是10。…

HTTP 连接详解

概述 世界上几乎所有的 HTTP 通信都是由 TCP/IP 承载的&#xff0c;客户端可以打开一条TCP/IP连接&#xff0c;连接到任何地方的服务器。一旦连接建立&#xff0c;客户端和服务器之间交换的报文就永远不会丢失、受损或失序 TCP&#xff08;Transmission Control Protocol&…

【大数据】HDFS、HBase操作教程(含指令和JAVA API)

目录 1.前言 2.HDFS 2.1.指令操作 2.2.JAVA API 3.HBase 3.1.指令操作 3.2.JAVA API 1.前言 本文是作者大数据专栏系列的其中一篇&#xff0c;前文中已经详细聊过分布式文件系统HDFS和分布式数据库HBase了&#xff0c;本文将会是它们的实操讲解。 HDFS相关前文&#x…