3、WinCC画面对象基础:基本对象、智能对象与窗口对象

大家好,我是老张。做WinCC项目这么多年,我见过太多人一上来就堆画面,结果后期维护时叫苦连天。其实,画面对象就像乐高积木——你得先搞清楚每块积木的脾气,才能搭出漂亮的城堡。

这一章,咱们就聊聊WinCC里最常用的三类对象:基本对象、智能对象和窗口对象。别小看它们,我敢说,90%的复杂画面都是这些基础元素的组合。

3.1 基本对象:线、圆、矩形

基本对象,说白了就是画布上的“颜料”。它们本身不绑定变量,但能帮你把画面结构搭出来。

3.1.1 线(Line)

线对象最容易被忽略。但我个人习惯,用它来做管道流向指示、设备边界划分。举个例子,在泵站画面里,我用不同颜色的线代表不同介质——蓝色是水,红色是蒸汽,绿色是压缩空气。这样操作工一眼就能看懂。

属性要点:

  • LineColor:颜色,建议用系统颜色表,别自己调RGB,否则换主题时你会哭的。
  • LineWidth:线宽,管道用2-3像素,边界线用1像素就够了。
  • LineStyle:实线、虚线、点划线。虚线我常用在“未来规划”的设备上。
我的小技巧: 用线对象做“动态流动”效果时,可以配合C脚本改变线的颜色或宽度。我曾经在一条输油管线上,用线宽变化表示流量大小,效果比棒图直观多了。

3.1.2 圆(Circle/Ellipse)

圆对象,我主要用来做电机、泵、阀门这些旋转设备的符号。你想想看,一个圆配上颜色变化,就是最好的状态指示器。

实际项目经验: 有一次做水处理项目,客户要求显示每个搅拌器的运行状态。我用圆对象,绿色表示运行,红色表示停止,黄色表示故障。配合闪烁动画,操作工在50米外都能看清。

关键属性:

  • FillColor:填充色,动态化后就是状态指示。
  • RadiusX/RadiusY:椭圆的长短轴,做3D效果时很有用。
  • BorderWidth:边框宽度,我习惯设1像素,太粗了显得笨重。

3.1.3 矩形(Rectangle)

矩形是画面里的“万能砖”。设备边框、操作区域划分、报警条,哪哪都有它。

避坑指南: 我曾经犯过一个错——用矩形做按钮背景,结果忘了设置“透明”属性,导致点击事件被矩形挡住了。嗯,这里要注意:矩形默认是透明的,但如果你设置了填充色,它就会挡住下层对象的事件。

常用场景:

  • 设备外框:用圆角矩形,视觉上更柔和
  • 分组框:配合GroupBox对象,但矩形更灵活
  • 进度条背景:白色矩形+动态填充的彩色矩形

3.2 智能对象:I/O域、按钮、棒图

智能对象,才是真正和PLC打交道的“活”对象。它们能读写变量,是HMI的核心。

3.2.1 I/O域(I/O Field)

I/O域,说白了就是操作工输入数值、查看数值的地方。我见过太多人把它当普通文本框用,其实它的门道多着呢。

三种模式:

模式 用途 我常用的场景
输入 操作工写入数值 设定温度、压力目标值
输出 只显示,不可修改 显示实际测量值
输入/输出 既可看又可改 PID参数整定画面

关键属性:

  • Format:格式字符串,比如“999.9”表示三位整数一位小数。我建议统一用“999.9”,别用“###.#”,否则数值小时显示会左对齐,很难看。
  • Limit:上下限。我曾经没设上限,操作工误输入了9999,结果PLC直接报警停机。从那以后,我每个I/O域都设限。
  • OutputValue:绑定的变量。注意,变量类型要匹配——整数变量别绑到浮点格式上。
重要提醒: I/O域的“输入”模式,默认是回车确认。如果你希望操作工点击其他区域时自动确认,记得勾选“Accept on focus loss”。这个坑我踩过,操作工输入完直接点按钮,数值没写进去,排查了半天。

3.2.2 按钮(Button)

按钮,是操作工和系统交互的“触发器”。WinCC的按钮功能很强大,不只是点一下那么简单。

按钮类型:

  • 文本按钮:显示文字,最常用
  • 图形按钮:显示图片,适合做图标
  • 状态按钮:可以显示两种状态(按下/弹起),我常用它做“启动/停止”切换

事件编程: 按钮最核心的是事件。我个人习惯用“鼠标点击”事件,而不是“按下”或“释放”。为什么?因为点击事件更符合操作工的习惯——点下去,松开,才触发。

代码示例(C脚本):

// 按钮点击事件:启动电机
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
    // 设置启动位为1
    SetTagBit("Motor_Start", 1);
    // 延时100ms后复位
    Sleep(100);
    SetTagBit("Motor_Start", 0);
    // 记录操作日志
    printf("电机启动按钮被点击,时间:%s\n", GetTagChar("@SystemTime"));
}
我的经验: 按钮的“确认对话框”功能一定要用。在关键操作(如急停复位、设备启动)前,弹个确认框,能避免90%的误操作。我曾经在一个化工项目里,就因为没加确认框,操作工误点了“排放阀门”,差点出事故。

3.2.3 棒图(Bar Graph)

棒图,就是进度条。它能把数值直观地显示成柱状,比数字更直观。

两种类型:

  • 水平棒图:从左到右,适合显示液位、流量
  • 垂直棒图:从下到上,适合显示压力、温度

关键属性:

  • ProcessValue:绑定的变量
  • Min/Max:量程范围。注意,这个范围要和PLC里的量程一致,否则显示会不对。
  • BarColor:棒图颜色。我习惯用绿色表示正常,黄色表示警告,红色表示报警。可以通过C脚本动态改变颜色。

动态颜色示例:

// 根据数值改变棒图颜色
#include "apdefap.h"
void OnPropertyChanged(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
    float value = GetTagFloat("Tank_Level");
    if (value < 50.0)
        SetPropDouble(lpszPictureName, "Bar1", "BarColor", 0x00FF00); // 绿色
    else if (value < 80.0)
        SetPropDouble(lpszPictureName, "Bar1", "BarColor", 0xFFFF00); // 黄色
    else
        SetPropDouble(lpszPictureName, "Bar1", "BarColor", 0xFF0000); // 红色
}

3.3 窗口对象:画面窗口、子画面

窗口对象,是画面复用的“核武器”。用好它们,你的项目能减少50%的重复工作。

3.3.1 画面窗口(Picture Window)

画面窗口,说白了就是一个“画中画”。你可以在主画面里嵌入另一个画面,而且这个嵌入的画面可以动态切换。

我为什么爱用画面窗口?

  • 复用性:一个电机控制面板,可以在10个电机画面上复用
  • 模块化:每个设备独立开发,互不干扰
  • 性能优化:画面窗口只在显示时才加载,不显示时不占内存

关键属性:

  • PictureName:要显示的画面文件名。可以用变量动态改变,实现“多画面切换”。
  • AdaptPosition:自适应位置。我建议勾上,否则画面窗口里的对象位置会乱跑。
  • BorderStyle:边框样式。我习惯用“无边框”,看起来更融合。

动态切换示例:

// 根据设备编号切换画面窗口内容
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
    int deviceID = GetTagWord("Selected_Device");
    char picName[100];
    sprintf(picName, "Device_%d.PDL", deviceID);
    SetPropChar(lpszPictureName, "PicWin1", "PictureName", picName);
}
注意: 画面窗口里的变量引用要小心。如果你在子画面里用了“@CurrentUser”这种全局变量,没问题。但如果你用了画面级变量,记得用“..\”来引用父画面的变量。这个语法坑,我当年调试了整整一天。

3.3.2 子画面(Subpicture)

子画面和画面窗口很像,但有个关键区别:子画面是“静态嵌入”的,编译时就确定了。而画面窗口是“动态加载”的,运行时才决定显示哪个画面。

什么时候用子画面?

  • 固定的设备符号,比如每个电机都有的“运行/停止”指示灯
  • 不需要动态切换的公共元素,比如公司Logo、标题栏
  • 性能要求极高的场景,子画面加载更快

子画面的优势:

  • 编译时检查,错误早发现
  • 运行时加载快,不卡顿
  • 适合做模板库的基础单元

我的建议: 对于“设备模板”这种需要复用的核心组件,我推荐用子画面。而对于“弹出式操作面板”这种需要动态切换的,用画面窗口。两者搭配,干活不累。

3.4 本章知识体系图

下面这张图,是我自己总结的画面对象分类体系。你看完应该能明白,这些对象是怎么组织起来的。

WinCC画面对象分类体系 基本对象 智能对象 窗口对象 线(Line) 圆(Circle/Ellipse) 矩形(Rectangle) I/O域(I/O Field) 按钮(Button) 棒图(Bar Graph) 画面窗口(Picture Window) 子画面(Subpicture) 核心要点 基本对象:搭骨架,不绑定变量 智能对象:绑变量,实现人机交互 窗口对象:做复用,减少重复工作 三者结合,才能做出专业、高效、易维护的WinCC画面

总结一下: 基本对象是“骨架”,智能对象是“血肉”,窗口对象是“器官”。你想想看,一个活生生的人,这三样缺一不可。做WinCC画面也是这个道理——别只盯着智能对象,基本对象和窗口对象用好了,你的项目质量能上一个台阶。

专注资料整理