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

    浏览量

    11317
  • BPLC
    +关注

    关注

    0

    文章

    4

    浏览量

    6471
  • plc编程语言
    +关注

    关注

    0

    文章

    7

    浏览量

    1169

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

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

收藏 人收藏

    评论

    相关推荐

    使用SNRBoost 3G技术的窗口

    电子发烧友网站提供《使用SNRBoost 3G技术的窗口.pdf》资料免费下载
    发表于 10-18 09:44 0次下载
    使用SNRBoost 3G技术的<b class='flag-5'>窗口</b>

    控制台窗口主机是什么

    主机是Windows操作系统的一个系统进程,它负责管理和控制控制台窗口的显示和行为。 功能 : 承载控制台窗口:conhost.exe进程是控制台窗口的宿主进程,它负责创建和显示控制
    的头像 发表于 10-08 18:12 2082次阅读

    中值滤波窗口大小对结果影响有哪些

    中值滤波是一种常用的数字滤波技术,它通过将信号的每个点用其邻域内的中值替换来实现信号的平滑和去噪。中值滤波窗口的大小对滤波结果有很大的影响,以下是对中值滤波窗口大小对结果影响的分析。 窗口
    的头像 发表于 07-29 09:10 1068次阅读

    鸿蒙开发接口图形图像:【@ohos.window (窗口)】

    窗口提供管理窗口的一些基础能力,包括对当前窗口的创建、销毁、各属性设置,以及对各窗口间的管理调度。
    的头像 发表于 05-30 10:07 1169次阅读
    鸿蒙开发接口图形图像:【@ohos.window (<b class='flag-5'>窗口</b>)】

    emWin删除子窗口后,焦点没有返回父窗口为什么?

    emWin删除子窗口后,焦点没有返回父窗口
    发表于 05-14 06:43

    OpenHarmony实战开发-管理系统窗口(仅Stage模型支持)

    过程,开发者可以自定义窗口的显示动画。在隐藏系统窗口过程,开发者可以自定义窗口的隐藏动画。本文以显示和隐藏动画为例介绍主要开发步骤。 开
    发表于 05-06 15:32

    OpenHarmony实战开发-如何实现窗口开发概述

    操作系统而言,窗口模块提供了不同应用界面的组织管理逻辑。 窗口模块的用途 在OpenHarmony窗口模块主要负责以下职责: 提供应用和系统界面的
    发表于 05-06 14:29

    IAR断点停止后,鼠标放在watch窗口中查看变量,IAR卡死退出怎么解决?

    IAR版本:8.32 操作过程如下: 1.在IAR设置相关端点; 2.在观察(watch)窗口中加入相关变量或数组,用于在程序断点停止后观测其数值变化; 3.运行程序至端点停止后,一定会发生以下2
    发表于 04-19 07:21

    如何使用RA MCUADC窗口比较功能

    如何使用RA MCUADC窗口比较功能
    的头像 发表于 04-12 08:06 387次阅读
    如何使用RA MCU<b class='flag-5'>中</b>ADC<b class='flag-5'>窗口</b>比较功能

    鸿蒙OS元服务开发:【(Stage模型)设置应用主窗口

    在Stage模型下,应用主窗口由UIAbility创建并维护生命周期。在UIAbility的onWindowStageCreate回调,通过WindowStage获取应用主窗口,即可
    的头像 发表于 04-03 18:28 1223次阅读
    鸿蒙OS元服务开发:【(Stage模型)设置应用主<b class='flag-5'>窗口</b>】

    MCGS嵌入版组态软件主控窗口的属性设置

    MCGS嵌入版组态软件的主控窗口是组态工程的主窗口,是所有设备窗口和用户窗口的父窗口,主控窗口
    发表于 03-28 11:34 1297次阅读
    MCGS嵌入版组态软件主控<b class='flag-5'>窗口</b>的属性设置

    窗口子系统基本概念与流程分析

    设置 ACE 的 UIContent 用于加载展示 UI 界面。基本上所有的 UI 视图都是在窗口中展示的,比如弹窗、toast、系统状态栏导航栏、应用等。因此窗口子系统是系统图形界面显示所需
    的头像 发表于 03-05 09:45 587次阅读
    <b class='flag-5'>窗口</b>子系统基本概念与流程分析

    鸿蒙应用/元服务开发-窗口(Stage模型)体验窗口沉浸式能力

    的),达到预期效果。 二、开发步骤 1.获取应用主窗口。 通过getMainWindow接口获取应用主窗口。 2.实现沉浸式效果。 调用setWindowSystemBarEnable
    发表于 02-06 15:08

    鸿蒙应用/元服务开发-窗口(Stage模型)设置应用主窗口

    获取应用主窗口,即可对其进行属性设置等操作。还可以在应用配置文件设置应用主窗口的属性,如最大窗口宽度maxWindowWidth等。 二、
    发表于 02-05 14:45

    鸿蒙实战基础(ArkTS)-窗口管理

    界面布局的编写,并实现沉浸式效果。步骤如下: 获取窗口window实例。 设置主窗口全屏显示。 设置状态栏与导航栏不显示,其中names参数决定状态栏、导航栏显示状态,如需全部显示,该参数设置为
    发表于 01-12 17:51