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 的灵魂。说白了,就是告诉表格:「你要显示哪些数据,从哪里拿数据」。

我常用的绑定方式有两种:

  1. 直接绑定变量:适合显示单个变量的实时值
  2. 绑定到数据源:适合显示归档数据或查询结果

来看一个典型的绑定代码示例:

// 在全局脚本中初始化
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 对大小写敏感,TagLoggingtaglogging 是两个东西。这个坑,大家一定要记住。

小技巧:绑定前先用 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 就万事大吉,其实不然。

刷新机制的核心逻辑是这样的:

Online TableControl 刷新机制流程图 启动刷新定时器 数据源可用? 读取最新数据 更新表格显示 等待下次触发 循环

从流程图可以看出,刷新不是简单的「定时读取」,而是先检查数据源状态。如果数据源不可用(比如变量归档正在写入),表格会跳过本次刷新,等待下一次触发。这个设计很聪明,避免了数据冲突。

避坑指南:我曾经遇到过一个情况:刷新率设得太快,导致数据源频繁被访问,归档写入都变慢了。后来我把刷新率调到 2 秒,同时用 OnDataChange 事件做增量更新,问题就解决了。

3.5 实战经验:几个常见问题

最后分享几个我在项目中踩过的坑,希望能帮你少走弯路:

  • 列标题不显示:检查是否设置了 Columns[i].Header,同时确认 ShowHeaders 属性为 True
  • 数据不更新:先检查 AutoRefresh 是否为 True,再检查数据源连接是否正常
  • 表格滚动卡顿:数据量过大时,建议启用虚拟模式(VirtualMode),只渲染可见行
  • 打印时表格变形:打印前先调用 PrepareForPrint() 方法,自动调整列宽

嗯,Online TableControl 其实是个很强大的控件。只要你掌握了属性配置、数据绑定和动态刷新这三个核心点,做报表生成和打印功能就会轻松很多。记住:先理解数据流,再动手写代码,这是我一直坚持的原则。

个人建议:刚开始用这个控件时,先在测试项目里把各种属性都试一遍。别怕出错,出错了反而记得更牢。我当年就是这么过来的。


公众号:蓝海资料掘金营,微信deep3321