博途WinCC PRO V16中用画面窗口与C脚本实现弹出画面

博途WinCC PRO V16中用画面窗口与C脚本实现弹出画面 简介针对博途WinCC PRO V16项目类型不直接提供弹出画面设置的问题这份docx文档整理了基于C脚本与画面窗口的完整替代方案。内容从创建主画面pic1与子画面pic2入手依次讲解添加画面窗口、调整对象名称与可见性属性、在按钮点击事件中编写C脚本等关键步骤并给出SetPicture与SetVisibility等具体调用代码。文档还说明了运行测试中画面弹出与关闭的效果以及扩展多个画面、动画过渡等高级用法的思路适合WinCC组态工程师、HMI调试人员及需要实现动态弹窗、设备操作面板等交互场景的自动化项目使用。资源为单个docx文件体积约548KB结构按操作流程逐步展开便于边读边练或直接作为工程笔记保存。目前已有1189人学习浏览可帮助读者快速掌握WinCC Professional脚本组态技巧减少自行摸索时间。1. WinCC PRO V16里没有“弹出画面”用画面窗口可见性来补第一次在博途WinCC Professional里找“弹出画面”功能的人基本都会扑空。V16的WinCC Professional项目类型没有像WinCC Flexible那样直接提供“弹出画面”的组态项面板属性里翻遍了也只有“显示的画面”和“可见性”。实际上这正是Professional和Comfort在架构上的差异Comfort把弹出画面做成了内建机制而Professional把画面窗口当作一个普通控件暴露给你能不能弹、怎么弹完全由脚本和属性决定。这个差异不是缺陷反而是更灵活的地方。本文要解决的就是在博途WinCC PRO V16中用画面窗口PictureWindow控件配合C脚本实现点击按钮弹出子画面的完整方案。涉及画面窗口的初始可见性设置、按钮事件脚本写法、画面对象名与画面名的解析规则以及运行调试中经常出现的脚本无效、画面不刷新、窗口位置偏移等问题。适合正在用TIA Portal V16做上位机画面、需要在工艺流程页面上叠加操作面板或报警详情的工程师阅读。2. 画面窗口组态命名规范与可见性初始状态缺一不可2.1 为什么选画面窗口而不是直接切换画面WinCC PRO V16提供两种画面切换思路一是通过按钮的“切换画面”系统函数直接跳转到目标画面整个画面区域被替换二是用画面窗口控件在父画面里嵌入一个子画面区域通过控制该区域的可见性和内容来实现弹出效果。前者适合主流程页面之间的跳转后者适合需要叠加显示的场景比如参数设置面板、报警确认窗口、设备详情页。这两种方式的本质区别在于画面窗口方式下父画面仍然保持运行状态脚本可以同时操作父画面和子画面的对象而直接切换画面是整体替换父画面的临时数据如果没做保持会丢失。在博途WinCC Professional V16中画面窗口还可以设置边框、背景色、透明度弹出来之后视觉上更像一个独立对话框。这也是为什么弹出效果优先选画面窗口而不是画面切换。2.2 创建两个画面并完成基础组态先在项目树中新建两个画面命名为“pic1”和“pic2”。pic1作为主画面pic2作为要弹出的子画面。注意画面名称里不要带空格、不要以数字开头否则后面脚本里GetPicture(pic2)这种调用虽然能过编译运行时却可能解析不到对象。在pic1中完成以下组态操作从右侧工具箱的“控件”分组中找到“画面窗口”拖入pic1。选中该画面窗口在属性页点击“其它”分类将“名称”修改为“pw1”。在“属性”-“常规”中确认“显示的画面”为空即不预设任何子画面。“可见性”属性保持取消勾选状态这样项目运行时画面窗口默认隐藏。在pic1中再添加一个按钮文本改名为“显示pic2”用于后续绑定事件脚本。这个过程中最容易出问题的就是第4步。如果忘了取消“可见性”运行后画面上直接出现一片空白区域因为画面窗口虽然没加载画面但背景可能显示为灰色或白色块。很多人在这一步误以为自己组态错了其实就是可见性没关。2.3 画面窗口属性页的参数含义画面窗口的属性在博途WinCC PRO V16中分布在“属性”和“动画”两个页签下。“属性”页签的“常规”里“显示的画面”决定画面窗口内加载哪个画面“其它”分类下的“名称”是脚本访问该控件时使用的对象名“可见性”控制运行时是否显示该控件。另一个值得注意的属性是“适配画面”在画面窗口的“几何”分组中。当子画面尺寸和画面窗口尺寸不一致时勾选“适配画面”会把子画面拉伸到窗口大小但会改变内部布局的比例。对于弹出式操作面板这类场景建议让pic2的画面尺寸和pw1的尺寸保持一致组态时先量好尺寸再画子画面。脚本的作用只是把两者关联起来不负责缩放。3. C脚本控制弹出与隐藏GetObject、GetPicture、SetVisibility三件套3.1 按钮事件的C脚本完整示例在pic1中选中按钮进入“事件”页签双击“单击”事件在下拉框中选择“C脚本”输入以下代码#include ap_defs.h // 获取画面窗口对象pw1的引用 PictureWindow pw1 GetObject(pw1); // 获取画面pic2的引用 Picture pic2 GetPicture(pic2); // 将画面窗口pw1的显示内容设置为pic2 pw1.SetPicture(pic2); // 设置画面窗口pw1可见实现弹出效果 pw1.SetVisibility(1); // 可选把画面窗口置于最前避免被其他控件遮挡 pw1.BringToFront();这段脚本是整个弹出方案的核心每一行都有明确的工程意义。第一行包含TIA Portal V16项目脚本编译时必需的API头文件缺少这行include时部分对象方法可能没有智能提示或编译报找不到符号。GetObject(pw1)返回的是画面窗口对象括号里的字符串必须和组态时设置的“名称”完全一致区分大小写。GetPicture(pic2)不是从磁盘加载画面文件而是从项目运行库中查找名为“pic2”的画面对象所以pic2必须已经加入项目并编译通过。SetPicture方法把画面对象绑定到画面窗口上这一步只是设置内容不会改变画面窗口的可见性状态。最后SetVisibility(1)才真正让画面窗口显示出来。带有kein注释BringToFront方法把画面窗口的Z序提到最前防止画面窗口被后来添加的其他控件盖住。3.2 隐藏画面的反向脚本弹出画面后通常还需要在pic2上放置一个“关闭”按钮点击后隐藏画面窗口。在pic2中添加一个按钮在其“单击”事件中添加以下C脚本#include ap_defs.h // 获取画面窗口对象pw1的引用 PictureWindow pw1 GetObject(pw1); // 设置画面窗口不可见实现隐藏效果 pw1.SetVisibility(0);这段脚本不需要再调用SetPicture因为画面窗口虽然不可见但画面内容已经绑定下次再点击按钮弹出时直接SetVisibility(1)即可不需要重复设置画面内容。这样做的另外一个好处是如果用户正在pic2中填写参数隐藏再弹出后数据还在不会因为重新加载画面而被清空。注意如果从工控行业的安全角度出发关闭按钮还可以加一个确认逻辑比如先判断某个关键输入是否合法再隐藏画面。这个逻辑可以直接写在同一段C脚本中在SetVisibility(0)之前加if判断。3.3 脚本中常见的参数写法和误用很多刚从WinCC Flexible转过来的工程师习惯在按钮事件里选“画面切换”系统函数然后填入“pic2”这种做法在Professional V16中根本找不到对应配置项。Professional的事件列表里没有“弹出画面”这个函数所以才会需要C脚本。也有人在脚本里写pw1.Visible 1;这在C脚本环境里是不成立的。TIA Portal脚本API中控件属性设置统一使用方法调用而不是赋值语句。正确写法是pw1.SetVisibility(1)。同样设置画面内容对应的方法是SetPicture而不是直接给Picture属性赋值。这两个误用是脚本编译报错和运行无效最常见的两个原因。另外GetObject和GetPicture的字符串参数一定要用英文双引号且变量名不要和画面名重名。例如画面窗口命名为“pw1”脚本里又声明了一个叫pw1的整数变量编译阶段可能不报错但运行时GetObject(pw1)的调用结果就是不生效排查起来非常隐蔽。建议组态层命名和脚本层变量名保持明显区分比如画面窗口叫“pw_popup”脚本里的临时变量叫pw_popup_obj。4. 运行调试与常见坑脚本不生效先检查这两处4.1 编译通过但点击没反应的排查顺序确认脚本语法无误并下载到模拟器或真实PLC后点击按钮没有弹出画面。这种情况下不要急着改代码按以下优先级排查排查项检查方式最常见的坑变量名一致对照属性页“其它”分类里的准确拼写pw1写成了PW1或Pw1画面名一致项目树中画面名与脚本GetPicture参数一致画面名带了下划线或后缀可见性初始状态属性页中“可见性”未勾选勾选了但运行后又被动画覆盖脚本是否真正挂载按钮事件里到底选的是C脚本还是别的函数保留了两个事件动作编译之后是否下载V16环境修改脚本后未重新生成运行系统下载的是旧版本画面其中“可见性”被动画覆盖是最容易忽略的。在博途WinCC PRO V16中“动画”页签下可以给可见性添加表达式和动画效果。如果之前有人给pw1的可见性配置过变量表达式且该变量在运行时值为0那么即使脚本调用SetVisibility(1)动画机制也会把画面窗口压回去。检查方法很简单右键画面窗口查看“动画”页签把可见性相关的动画条目全部删除。4.2 画面窗口出现但位置不对的处理画面窗口弹出后出现在画布边缘或者被工具栏遮挡是另一个高频问题。画面窗口的位置属性在组态时设定脚本运行时不会自动移动到屏幕中央除非你在脚本中显式指定坐标。常见的做法是在弹出脚本中加上几行位置计算代码#include ap_defs.h // 获取画面窗口对象 PictureWindow pw1 GetObject(pw1); // 获取画面窗口当前区域 IntRect rect pw1.GetRect(); // 获取父画面可用显示区域 IntRect screenRect ScreenRect(); // 计算窗口位置使其水平居中垂直偏移到屏幕三分之一处 pw1.SetPosition( (screenRect.Width - rect.Width)/2, (screenRect.Height - rect.Height)/3 ); // 设置画面内容并显示 pw1.SetPicture(GetPicture(pic2)); pw1.SetVisibility(1);ScreenRect()返回的是当前画面区域的尺寸IntRect结构体包含Width和Height字段。如果子画面尺寸没有和画面窗口大小做适配这里计算出的位置可能不准。建议组态阶段先在pic1上把pw1拉到需要的位置运行无问题后再用脚本微调坐标。实际项目中弹出窗口位置大多要求固定在某处而不是每次弹到中央所以位置脚本要根据工艺页面的按钮分布来调整。4.3 “画面窗口显示空白”的原因定位SetPicture调用后画面窗口可见但里面什么都没有通常有三个原因。第一pic2的内容本身就是空的或者你往pic2里放的对象在编译时被排除在运行系统外。打开生成设置确认pic2在“画面”列表中是选中状态。第二画面窗口尺寸和pic2画面的实际尺寸差距过大如果“适配画面”没有勾选画面不会等比缩放看起来就像一块空白或者只显示了局部。第三Table驱动的可见性设置在WinCC PRO中Name名称和Visible可见性属性是在“其他”分组里如果你在“属性”页签中找不到这两个属性就切到“其他”或“基本信息”页签下找。排查空白问题时最实用的临时手段是先把画面窗口的“可见性”在组态中勾选上然后运行项目。这时如果窗口内仍然空白说明问题出在SetPicture或画面编译环节与脚本无关。如果窗口内显示了pic2的内容说明脚本调用有效可以再把可见性取消勾选继续排查脚本层的问题。5. 多画面切换与关闭按钮把弹出逻辑改造成可复用函数在单画面弹出方案跑通之后工程中更常见的需求是多个工艺画面共享同一个弹出窗口。比如一个操作主画面里有三个设备点击每个设备的“参数设置”按钮都在同一个画面窗口pw1中弹出不同的子画面。如果每加一个按钮就复制一段完整脚本项目维护成本会迅速膨胀。这一步给出一个简单的可复用思路。在pic1的“项目函数”或者“脚本”区域中新建一个C函数例如命名为ShowPopup#include ap_defs.h // 通用弹出画面函数 // 参数说明 // szPictureName: 要弹出的画面名称如 pic2 void ShowPopup(char* szPictureName) { // 获取画面窗口对象 PictureWindow pw1 GetObject(pw1); // 根据传入的画面名称设置画面窗口内容 pw1.SetPicture(GetPicture(szPictureName)); // 显示画面窗口 pw1.SetVisibility(1); }在按钮事件中调用这个函数时只需一行脚本ShowPopup(pic2);调用时传入的画面名可以在每个按钮里分别指定这样新增一个按钮时只需要复制一行调用即可不必再写完整的GetObject、SetPicture逻辑。注意项目函数的地址需要确保在按钮事件中能访问到V16中建议将这类通用函数放在全局脚本区域避免不同画面内的按钮找不到引用。关闭逻辑同样可以封装成函数#include ap_defs.h // 关闭弹出画面 void ClosePopup() { PictureWindow pw1 GetObject(pw1); pw1.SetVisibility(0); }改编成函数后还有一个额外的好处可以在一个集中的位置修改画面窗口的弹出坐标和动画效果。比如把弹出动画从无动画改成淡入淡出只需要在ShowPopup函数中增加对透明度属性的设置即可不用逐个按钮修改。实际项目做上位机时画面弹出都会附加一点过渡效果提升操作反馈但WinCC Professional V16里动画配置本身就写在控件属性中与脚本无关所以脚本层只需要保证SetPicture和SetVisibility调用的时序稳定即可。从代码的可读性角度看直接在按钮事件中写完整脚本的优点是不需要跳转查看函数实现而封装成函数的优点是便于统一调整。工程上更推荐封装方式因为弹出画面的逻辑通常不会只在测试阶段改一次而是会在现场调试阶段反复调整位置、可见性和画面切换顺序。集中管理这些代码在现场用一个在线监视窗口查看变量状态时可以少翻几个区域效率上更划算。还需要提示一点在画面窗口弹出后如果主画面上还有其他操作按钮建议在弹出期间禁用主画面的操作区域否则用户点击主画面上的按钮时画面窗口可能被主画面刷新机制重置为隐藏状态。这个在V16中属于典型的焦点管理问题处理方法是额外维护一个“弹出状态”变量或者使用内部Tag控制主画面按钮的Enable属性。本文还有配套的精品资源点击获取