3、WinCC画面对象基础:基本对象、智能对象与窗口对象
大家好,我是老张。做WinCC项目这么多年,我见过太多人一上来就堆画面,结果后期维护时叫苦连天。其实,画面对象就像乐高积木——你得先搞清楚每块积木的脾气,才能搭出漂亮的城堡。
这一章,咱们就聊聊WinCC里最常用的三类对象:基本对象、智能对象和窗口对象。别小看它们,我敢说,90%的复杂画面都是这些基础元素的组合。
3.1 基本对象:线、圆、矩形
基本对象,说白了就是画布上的“颜料”。它们本身不绑定变量,但能帮你把画面结构搭出来。
3.1.1 线(Line)
线对象最容易被忽略。但我个人习惯,用它来做管道流向指示、设备边界划分。举个例子,在泵站画面里,我用不同颜色的线代表不同介质——蓝色是水,红色是蒸汽,绿色是压缩空气。这样操作工一眼就能看懂。
属性要点:
- LineColor:颜色,建议用系统颜色表,别自己调RGB,否则换主题时你会哭的。
- LineWidth:线宽,管道用2-3像素,边界线用1像素就够了。
- LineStyle:实线、虚线、点划线。虚线我常用在“未来规划”的设备上。
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:绑定的变量。注意,变量类型要匹配——整数变量别绑到浮点格式上。
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"));
}
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);
}
3.3.2 子画面(Subpicture)
子画面和画面窗口很像,但有个关键区别:子画面是“静态嵌入”的,编译时就确定了。而画面窗口是“动态加载”的,运行时才决定显示哪个画面。
什么时候用子画面?
- 固定的设备符号,比如每个电机都有的“运行/停止”指示灯
- 不需要动态切换的公共元素,比如公司Logo、标题栏
- 性能要求极高的场景,子画面加载更快
子画面的优势:
- 编译时检查,错误早发现
- 运行时加载快,不卡顿
- 适合做模板库的基础单元
我的建议: 对于“设备模板”这种需要复用的核心组件,我推荐用子画面。而对于“弹出式操作面板”这种需要动态切换的,用画面窗口。两者搭配,干活不累。
3.4 本章知识体系图
下面这张图,是我自己总结的画面对象分类体系。你看完应该能明白,这些对象是怎么组织起来的。
总结一下: 基本对象是“骨架”,智能对象是“血肉”,窗口对象是“器官”。你想想看,一个活生生的人,这三样缺一不可。做WinCC画面也是这个道理——别只盯着智能对象,基本对象和窗口对象用好了,你的项目质量能上一个台阶。