0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

WINCC中获取窗口变量前缀以及跨窗口操控的方法

opkgjew 来源:PLC标准化编程 2023-01-09 11:15 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

近段时间,不约而同的,网站论坛和烟台方法学员中都有提出这样的问题。

比如:

l用C脚本如何获得窗口中对象的变量前缀?

l用VBS如何获得?

l用C脚本如何实现在一个窗口中操控父窗口下的另一个窗口内的控件?

l用VBS如何实现?

这些问题,都有个特点, 提问的时候先把编程语言给限定了。

而咱就不太有办法拒绝。毕竟,人家有可能是在完成一个更复杂的工作,已经在选定的语言下实现了大部分的功能,现在就在这一点点功能搞不定被卡主了,过不去了,才来求助的。

而如果不指定语言的话,其实我都早就有答案,特别是VBS的解决方案,都写在《西门子WINCC入门到精通》的书里了,所以只需要从书柜里把我自己的书拿出来, 找到页码,把页码号告诉对方就可以了。

而且会发现,大部分提问者其实是有我的那本书的,只是通读不够细致,没发现,或者没记住有这方面的介绍。验证了一个道理,对一本书,最了解的还是作者自己。

当然,我也发现了我写书时候遗漏的该写而未写的技巧知识点。可能潜意识里面,我自己觉得反正另一条路上有解决方案了,这边这一条就没必要去重复啰嗦实现了。特别是C脚本,对西门子来说自从20年前的WINCC版本支持VBS之后,官方逐渐在弱化C脚本的地位, 我自己也逐渐淡化对其的研究和使用。想一碗水端平是永远不可能的。

在此先提醒大家, 提问问题的时候,尽可能不要限定编程语言。那样的答案多的是,可以唾手可得。而非要限定语言了,寻找起来就会有一些难度。

所以,我这里做了个例子,进行了测试,可以把这些坑填上了。 也算是对我自己著作中遗漏部分的补充。

d0611658-8441-11ed-bfe3-dac502259ad0.png

主画面中是2个按钮,分别演示了VBS脚本和C脚本弹出窗口的方法。

而弹出的窗口外观相同,然而内部的程序语言不同, 分别有按钮按下后可以弹出对话框提示读取得到了前缀。

而后, 将上述2个按钮分别放到另一个叫做“窗口中操控”的窗口(PDL文件),脚本经过稍微修改,实现了上述同样的功能。

l按钮11的单击鼠标中的VBS程序为:

Sub OnClick(ByVal Item)

ScreenItems("画面窗口1").TagPrefix="M001_"

ScreenItems("画面窗口1").PictureName=Item.Text

ScreenItems("画面窗口1").Visible=True

End Sub

而窗口中有2个获取前缀的按钮,同样可以得到结果,脚本分别为:

Sub OnClick(Byval Item)

'MsgBOX(ITEM.Parent.Parent.TagPrefix)

MsgBOX(Parent.TagPrefix)

End Sub

注释掉的脚本也同样可以执行。

Sub OnClick(Byval Item)

Dim name

name=HMIRuntime.Tags("aa").Name

Dim TagPrefix

TagPrefix=Split(name,"_")(0)

MsgBOX(TagPrefix)

End Sub

这里取了一个不存在的aa后缀的变量,然而也丝毫不影响功能。 因为语法本身获取的是变量名字,对变量是否有值是否合法根本不在意。

也注意两种方式得到的前缀分别有分隔符和无分隔符的区别。

标准的用法当然不能每次都通过脚本来获取,而是会在子窗口打开时即执行脚本,获取到前缀后,赋值到一个静态文本中,窗口中任何需要的地方,可以通过读取文本内容得到。

Sub OnOpen()

'MsgBOX(Parent.TagPrefix)

ScreenItems("窗口前缀").Text=Parent.TagPrefix

End Sub

而如果画面窗口中不需要显示这个前缀,可以设置静态文本为隐藏。这是官方例程中惯用的手法。

l按钮12的单击鼠标中的C程序为:

#include "apdefap.h"

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

{

SetPropChar(lpszPictureName, "画面窗口1", "PictureName","窗口12-C获取前缀.Pdl");

SetPropChar(lpszPictureName, "画面窗口1", "TagPrefix", "M002_");

SetPropBOOL(lpszPictureName, "画面窗口1", "Visible", TRUE);

}

窗口内获取按钮的脚本:

#include "apdefap.h"

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

{

char Name[20];

HWND hwnd=NULL;

hwnd=FindWindow(NULL,"WinCC-运行系统 - "); //获得句柄

strcpy(Name,GetPropChar(GetParentPicture(lpszPictureName),GetParentPictureWindow(lpszPictureName),"TagPrefix")); //Return-Type: char*

MessageBox(hwnd,Name,"OK",MB_OK);

}

画面打开事件中文本内容得到的方法:

#include "apdefap.h"

void OnOpenPicture(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

{

char Name[20];

strcpy(Name,GetPropChar(GetParentPicture(lpszPictureName),GetParentPictureWindow(lpszPictureName),"TagPrefix")); //Return-Type: char*

SetPropChar(lpszPictureName,"窗口前缀","Text",Name); //Return-Type: BOOL

}

这里C脚本实现的核心是一个GetParentPicture的函数,可以得到窗口的父窗口的文件名字。而这个函数是个神仙函数,各种帮助资料中都没有见过介绍。所以只有从已有的使用演示程序中获取。

l窗口中按钮11的单击鼠标中的VBS程序为:

Sub OnClick(ByVal Item)

Parent.Parent.ScreenItems("画面窗口1").TagPrefix="M001_"

Parent.Parent.ScreenItems("画面窗口1").PictureName=Item.Text

Parent.Parent.ScreenItems("画面窗口1").Visible=True

End Sub

l窗口中按钮12的单击鼠标中的C程序为:

#include "apdefap.h"

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

{

char szParentPicture[512];

strncpy (szParentPicture, GetParentPicture(lpszPictureName), sizeof(szParentPicture));

SetPropChar(szParentPicture, "画面窗口1", "PictureName","窗口12-C获取前缀.Pdl");

SetPropChar(szParentPicture, "画面窗口1", "TagPrefix", "M002_");

SetPropBOOL(szParentPicture, "画面窗口1", "Visible", TRUE);

}

分别实现了上述同样的功能。

当然,我们也可以随意的组合搭配按钮和窗口内的程序,都可以实现同样的功能。 比如即便你程序的主体语言是C的或者VBS,然而窗口中的文本获得前缀部分可以用VBS简单得到。

最后,这些具体产品知识点的技巧内容我近几年确实很少触及了。 因为在我看来那都是基本功。我甚至也不去记忆具体的函数名字,比如上面的name还是tagname, TagPrefix还是Prefix, 都记不住的。我即便要使用,也都直接找现成的程序模块看一眼,抄来用下即可。

而事实上,随着标准化模块化的推进,这些技能已经很少用到了,因为早就封装完善在模块中了。

有一些年轻人看到我近年来写各种科普文章,很少提及这些具体的技术技能技巧,怀疑我从来没掌握这些技能,DISS我,甚至来跟我PK,只能是他们眼光太短浅了,你要从事技术工作,不是要把一项项的技能从年轻到年老记忆地牢牢的,以随时使用。相反的是,大部分技能是需要封装的,封装以后直接使用,甚至自己要主动把这些具体技能都遗忘掉,才可以有更多的精力去掌握更高层的知识。

最后,给大家的建议是,要尽量少自己从头造轮子。

虽然我自己在成长过程中,是摸着石头过河每个轮子逐个造过来的,遇到任何问题,也都抑制不住要自己亲自造轮子的冲动。 轮子的每一个细节,如果不亲自掌握,就会抓耳挠腮睡觉都不安心。

然而仍然要提醒同行后来者,这是一种非常低效率的行为。 你可以有好奇心,精力充沛的情况下可以对别人造好的轮子仔细研读原理,自己可以从中掌握些基本功,然而自己从头造轮子这件事,就要尽量避免了。

上述例程的实现方法,西门子官方的例子中其实原本就有,而且功能比我这里介绍的要全面而细致得多得多。

西门子官方例程中, BST例程较多的是使用了C脚本,而LBP例程(或者叫做BPL)相同的功能则更多是用VBS实现的。

这些例程我都已经写文章推荐过多次了。这回就不再提供链接以及亲自提供文件了,而只提供名字,需要者自己辛苦一点去找到并学习了解。 看来太容易得到的资料通常都不珍惜,只有自己辛苦一点,千辛万苦得到的才会更加倍的去学习。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • vbs
    vbs
    +关注

    关注

    1

    文章

    5

    浏览量

    11462
  • BPLC
    +关注

    关注

    0

    文章

    4

    浏览量

    6615
  • plc编程语言
    +关注

    关注

    0

    文章

    7

    浏览量

    1331

原文标题:1225 【万泉河】WINCC中获取窗口变量前缀以及跨窗口操控的方法

文章出处:【微信号:PLC标准化编程,微信公众号:PLC标准化编程】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    福禄克CV系列红外窗口的核心作用

    电气设备内部测温的三大焦虑,您是否正在经历?真正的状态检修,始于一次安全、精准、高效的内部温度评估。今天,我们为您揭秘专业之选——福禄克CV系列红外窗口
    的头像 发表于 12-10 10:46 301次阅读
    福禄克CV系列红外<b class='flag-5'>窗口</b>的核心作用

    如何在Keil设置窗口标题颜色和背景颜色呢?

    如何在Keil设置窗口标题颜色和背景颜色呢
    发表于 12-10 07:56

    广州易显串口屏多个画面和子窗口切换实验

    目录一、实验目的二、实验设备三、实验步骤3.1新建工程3.2新建画面3.3新建子窗口3.4添加控件3.5模拟工程3.6硬件验证一、实验目的51、AVR、PIC、STM等8位或者32位单片机的串口
    的头像 发表于 12-04 11:40 57次阅读
    广州易显串口屏多个画面和子<b class='flag-5'>窗口</b>切换实验

    大语言模型如何处理上下文窗口中的输入

    本博客介绍了五个基本概念,阐述了大语言模型如何处理上下文窗口中的输入。通过明确的例子和实践获得的见解,本文介绍了多个与上下文窗口有关的基本概念,如词元化、序列长度和注意力等。
    的头像 发表于 12-03 13:48 223次阅读
    大语言模型如何处理上下文<b class='flag-5'>窗口</b>中的输入

    CANape标定窗口被锁无法标定

    问题现象:解决方案:标定窗口被锁定无法标定除了ECU功能权限限制外可能存在的情况是CANape的工程配置影响的,主要有以下三个方面:1、CalibrateonlineDevice没有激活,需要将工程
    的头像 发表于 11-17 15:26 1612次阅读
    CANape标定<b class='flag-5'>窗口</b>被锁无法标定

    AMC22C12快速响应隔离窗口比较器技术解析

    exas Instruments AMC22C12/AMC22C12-Q1隔离式窗口比较器是隔离式窗口比较器,响应时间短。开漏输出通过一个具有高抗磁干扰能力的隔离栅与输入电路分离。该隔离栅经过认证
    的头像 发表于 09-09 15:19 571次阅读
    AMC22C12快速响应隔离<b class='flag-5'>窗口</b>比较器技术解析

    AMC21C12隔离式窗口比较器技术解析

    Texas Instruments AMC21C12隔离式窗口比较器是一款隔离式窗口比较器,具有开漏输出和可选的锁存功能。开漏输出通过抗磁干扰能力强的隔离栅与输入电路进行电隔离。隔离栅支持高达
    的头像 发表于 09-04 15:19 560次阅读
    AMC21C12隔离式<b class='flag-5'>窗口</b>比较器技术解析

    AMC23C15双通道快速响应隔离窗口比较器技术解析

    Texas Instruments AMC23C15/AMC23C15-Q1隔离式窗口比较器是一款响应时间较短的双路隔离式窗口比较器。开漏输出与输入电路由高度抗电磁干扰性的隔离栅隔开。该隔离栅经认证
    的头像 发表于 08-22 16:07 687次阅读
    AMC23C15双通道快速响应隔离<b class='flag-5'>窗口</b>比较器技术解析

    德州仪器TPS3436-Q1汽车级窗口看门狗定时器技术解析

    Texas Instruments TPS3436-Q1精密窗口看门狗定时器是一款超低功耗(250nA典型值)器件,提供可编程窗口看门狗定时器。TPS3436-Q1可提供具有多种功能的高精度超时
    的头像 发表于 08-18 14:54 684次阅读
    德州仪器TPS3436-Q1汽车级<b class='flag-5'>窗口</b>看门狗定时器技术解析

    光纤传输窗口详解:波长如何影响光通信网络

    “光纤传输窗口”是指在光纤传输时,信号能量损耗最小、色散效应最弱的一段波长区间。在这些“窗口”内,光信号可以传播得更远、衰减更慢、失真更少,因此成为光通信系统设计的关键技术基础。
    的头像 发表于 07-30 10:27 647次阅读
    光纤传输<b class='flag-5'>窗口</b>详解:波长如何影响光通信网络

    调试工具:Eclipse调试工具栏与窗口的深入分析

    科技有限公司自研AS32 系列 MCU 芯片的调试应用为研究背景,通过详细阐述 Eclipse 调试环境的搭建、工具栏各功能模块的原理与应用,以及各类调试窗口的深度剖析,揭示 Eclipse 调试工具在嵌入式系统调试的优势与潜
    的头像 发表于 07-07 11:32 639次阅读
    调试工具:Eclipse调试工具栏与<b class='flag-5'>窗口</b>的深入分析

    技术干货 | AD/DA动态分析的信号窗口处理技术

    前一章详解了TX7006上的线性计算,AD/DA动态分析的傅里叶变换和动态参数计算。本期文章将为大家继续介绍AD/DA动态分析的信号窗口
    的头像 发表于 07-03 13:39 934次阅读
    技术干货 | AD/DA动态分析<b class='flag-5'>中</b>的信号<b class='flag-5'>窗口</b>处理技术

    HarmonyOS实战:实现任意拖动的应用悬浮窗口

    为了增加应用程序功能的丰富性和便利性,很多应用都会提供一个悬浮窗口实现多页面显示。特别是一些性能检测工具,比如 dokit 。在鸿蒙上怎么实现类似的全局悬浮窗口呢?阅读完本篇文章你将学会在鸿蒙上如何实现这一功能。
    的头像 发表于 06-24 17:04 1151次阅读

    第二十四章 WWDG——窗口看门狗

    W55MH32的窗口看门狗是7位递减计数器,有上下窗口值,时钟来自PCLK1用于监测软件故障,代码演示了其配置、中断测试与复位测试。
    的头像 发表于 06-20 14:00 1037次阅读
    第二十四章 WWDG——<b class='flag-5'>窗口</b>看门狗

    调试时Memory窗口中Flash内容不更新的原因和解决办法

    调试时在代码对Flash进行写操作时(比如Bootloader对Code Flash进行升级操作,Application对Data Flash进行写操作),Memory窗口中Flash内容不更新。
    的头像 发表于 04-01 09:18 991次阅读
    调试时Memory<b class='flag-5'>窗口</b>中Flash内容不更新的原因和解决办法