3. WinCC Online TableControl 控件:从入门到实战
各位工程师朋友,今天我们来聊聊 WinCC 里一个非常实用的控件——Online TableControl。说实话,这个控件在报表生成和打印功能中,扮演着「数据中转站」的角色。我个人习惯把它叫做「在线表格」,因为它能实时显示过程数据,而且刷新速度相当快。
3.1 控件属性:你得先认识它
第一次接触 Online TableControl 时,我差点被它的属性列表吓到。其实没那么复杂,核心属性就这几类:
| 属性类别 | 关键属性 | 说明 |
|---|---|---|
| 外观 | BackColor, Font, GridLines | 设置表格背景色、字体、网格线样式 |
| 数据源 | DataSource, DataMember | 绑定到变量或归档数据 |
| 列定义 | Columns.Count, Columns[].Header | 定义显示哪些列,以及列标题 |
| 刷新 | RefreshRate, AutoRefresh | 控制数据刷新频率 |
| 行为 | AllowSort, AllowEdit | 是否允许排序、编辑 |
嗯,这里要注意:RefreshRate 这个属性,我建议不要设得太快。曾经有个项目,我把刷新率设成了 100ms,结果 CPU 占用率直接飙到 80%。后来改成 500ms,效果完全够用,系统也稳定了。
核心要点:Online TableControl 的列定义是动态的。你可以在运行时添加或删除列,这为灵活报表提供了基础。
3.2 数据绑定:把变量「喂」给表格
数据绑定是 Online TableControl 的灵魂。说白了,就是告诉表格:「你要显示哪些数据,从哪里拿数据」。
我常用的绑定方式有两种:
- 直接绑定变量:适合显示单个变量的实时值
- 绑定到数据源:适合显示归档数据或查询结果
来看一个典型的绑定代码示例:
// 在全局脚本中初始化
void InitOnlineTable()
{
// 设置数据源为变量归档
OnlineTableControl1.DataSource = "TagLogging";
// 添加列
OnlineTableControl1.Columns.Add("Time", "时间");
OnlineTableControl1.Columns.Add("Value", "数值");
OnlineTableControl1.Columns.Add("Quality", "质量码");
// 设置列宽
OnlineTableControl1.Columns[0].Width = 120;
OnlineTableControl1.Columns[1].Width = 80;
OnlineTableControl1.Columns[2].Width = 60;
// 开启自动刷新
OnlineTableControl1.AutoRefresh = true;
OnlineTableControl1.RefreshRate = 1000; // 1秒刷新一次
}
我在项目中遇到过一个问题:绑定后表格显示空白。排查了半天,发现是数据源名称写错了。WinCC 对大小写敏感,TagLogging 和 taglogging 是两个东西。这个坑,大家一定要记住。
小技巧:绑定前先用 WinCC 的「变量选择」对话框测试一下数据源是否可用。这样可以避免运行时才发现问题。
3.3 动态显示:让表格「活」起来
静态表格谁都会做,但动态显示才是 Online TableControl 的真正价值。你想想看,生产数据是实时变化的,表格必须跟着动。
动态显示主要体现在三个方面:
- 数据动态刷新:新数据自动追加到表格末尾
- 行数动态调整:根据数据量自动显示或隐藏行
- 样式动态变化:根据数值大小改变单元格颜色
我曾经做过一个温度监控界面,要求超过 80°C 的单元格显示红色。实现方式是这样的:
// 在表格的 OnDataChange 事件中
void OnDataChange()
{
int rowCount = OnlineTableControl1.Rows.Count;
for(int i = 0; i < rowCount; i++)
{
// 获取数值列的值
float value = (float)OnlineTableControl1.Rows[i].Cells[1].Value;
// 根据数值设置背景色
if(value > 80.0)
{
OnlineTableControl1.Rows[i].Cells[1].BackColor = Color.Red;
OnlineTableControl1.Rows[i].Cells[1].ForeColor = Color.White;
}
else
{
OnlineTableControl1.Rows[i].Cells[1].BackColor = Color.White;
OnlineTableControl1.Rows[i].Cells[1].ForeColor = Color.Black;
}
}
}
为什么会这样写?因为 OnDataChange 事件每次数据更新时都会触发,正好用来做条件格式。嗯,这里要注意:如果数据量很大,循环里别做太复杂的操作,否则界面会卡顿。
3.4 刷新机制:别让数据「卡住」
刷新是 Online TableControl 最容易被忽视的地方。很多新手以为设了 AutoRefresh 就万事大吉,其实不然。
刷新机制的核心逻辑是这样的:
从流程图可以看出,刷新不是简单的「定时读取」,而是先检查数据源状态。如果数据源不可用(比如变量归档正在写入),表格会跳过本次刷新,等待下一次触发。这个设计很聪明,避免了数据冲突。
避坑指南:我曾经遇到过一个情况:刷新率设得太快,导致数据源频繁被访问,归档写入都变慢了。后来我把刷新率调到 2 秒,同时用 OnDataChange 事件做增量更新,问题就解决了。
3.5 实战经验:几个常见问题
最后分享几个我在项目中踩过的坑,希望能帮你少走弯路:
- 列标题不显示:检查是否设置了
Columns[i].Header,同时确认ShowHeaders属性为 True - 数据不更新:先检查
AutoRefresh是否为 True,再检查数据源连接是否正常 - 表格滚动卡顿:数据量过大时,建议启用虚拟模式(VirtualMode),只渲染可见行
- 打印时表格变形:打印前先调用
PrepareForPrint()方法,自动调整列宽
嗯,Online TableControl 其实是个很强大的控件。只要你掌握了属性配置、数据绑定和动态刷新这三个核心点,做报表生成和打印功能就会轻松很多。记住:先理解数据流,再动手写代码,这是我一直坚持的原则。
个人建议:刚开始用这个控件时,先在测试项目里把各种属性都试一遍。别怕出错,出错了反而记得更牢。我当年就是这么过来的。
公众号:蓝海资料掘金营,微信deep3321