恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
WinCC报表开发全指南:从在线表格控件到SQL脚本导出
首页
资讯中心
/
WinCC报表开发全指南:从在线表格控件到SQL脚本导出
WinCC报表开发全指南:从在线表格控件到SQL脚本导出
发布时间:2026/10/8 3:06:08
1. 别急着拖控件WinCC报表的几条路线你得先选明白1.1 一个夜班报表引发的“血案”做WinCC项目的工程师基本都经历过这个场景设备调试完了、联机也正常了甲方突然提需求——“我们要个夜班报表晚上12点到早上8点的温度、压力、流量平均值还要能自动打印”。很多人的第一反应是WinCC不是自带报表控件吗拖个控件上去不就行了真这么干的人十有八九会在调试末期被报表磨掉一层皮。原因很简单WinCC的“报表控件”从来不是一个万能组件它是由在线表格控件、在线趋势控件、归档数据库查询、脚本导出等多条技术路线组成的组合拳不同需求得走不同路。我做了十几个WinCC项目从化工到水处理都碰过现在总结下来就一句话选型比配置重要。选对了路线报表功能半天搞定选错了后面全是补丁。1.2 三条路线分别解决什么问题先说结论WinCC项目里的报表需求基本可以分成三大类对应三种不同做法需求类型典型场景推荐方案复杂程度现场快速查看历史数据设备运行状态回看、单个变量查值WinCC在线表格控件低趋势分析、曲线对比工艺参数波动分析、多变量对比WinCC在线趋势控件 脚本中正式生产报表、交接班报表需要按班次统计、导出Excel、定时打印SQL查询 VBS脚本导出高这里面的逻辑很直白表格控件和趋势控件是用来“看”的真正的报表是用来“交”的。如果只是操作员在画面上翻一翻历史数据用在线表格控件就够了但如果要给车间主任、生产调度发一份格式固定的Excel报表你就必须走数据库查询加脚本导出的路线。1.3 为什么很多人一上来就卡在“控件用不了”我在现场被问得最多的问题是为什么表格控件拖上去里面什么都没有十有八九是因为变量没有归档。WinCC报表控件不读实时值它读的是历史归档数据。你必须在WinCC变量管理里面把需要做报表的变量勾选上“记录”属性给这些变量分配归档周期数据才会进入历史数据库。控件本身只负责把历史库里的数据捞出来显示你不存数据它当然什么都显示不出来。所以做报表的第一步其实是做归档规划哪些变量需要记录、记录频率是多少、保留多久、是否需要压缩。这一步不做后面所有报表都是空中楼阁。2. 在线表格控件从拖控件到真正出数据中间差了这几步2.1 一个能查出历史值的表格控件是怎么配出来的以WinCC V7.x为例TIA Portal里的WinCC Professional逻辑类似操作路径大概是这样的在图形设计器里打开目标画面从对象选项板的“控件”分类里找到“WinCC Online Table Control”拖到画面上。右键控件在组态对话框里的“列”属性中添加需要的字段比如时间列和过程值列。把变量管理里面已经开启归档的变量分配到对应列上。设置查询的时间范围。可以设为相对时间比如最近1小时也可以绑定画面上的日期时间输入框做成可选的。运行画面表格里就能看到历史数据了。这里有个容易被忽略的细节在线表格控件的“列”不一定都显示变量值。你完全可以配一列“注释”一列“质量代码”这样操作员就能通过表格快速判断这个数据点当时的采集状态是不是正常。2.2 时间范围、刷新周期和行数上限三个和性能强相关的坑这个控件是能查出数据但能不能“好用”取决于另外三个参数。第一个是时间范围。在线表格控件默认的查询窗口是相对时间但新手很容易把整个归档时间都查出来结果控件直接卡死。道理很简单如果归档变量每秒记录一次查一个月的时间范围就是260万条数据控件要全部加载。所以建议做两件事一是把时间范围做成画面上的输入框让操作员自选二是在控件属性里设置查询行数上限默认值一般不建议超过几千行超了就提示先缩小时间范围。第二个是刷新周期。在线表格和在线趋势控件每隔一段时间会从归档库里取一次新数据这个刷新周期要和你变量的归档周期匹配。变量归档周期是1秒刷新周期也基本可以做到1秒但如果归档周期是10秒刷新周期设1秒意义不大白白消耗性能。第三个是缓存机制。WinCC的归档系统不是实时写库的数据先进内存缓冲区到一定条件才批量写入SQL Server。这意味着你打开表格控件查询“刚才那一刻”的数据大概率会查不到最新的一条要等归档段切换。这不是控件坏了是WinCC内部机制决定的——查询窗口尽量选在当前时间几分钟之前的数据。2.3 在线表格控件的“在线”到底是指什么很多刚接触WinCC的工程师会误解“在线表格控件”里的“在线”以为它显示的是实时数据。实际上WinCC把数据分成两种模式在线模式Online和归档模式Archive。在线模式读取的是当前运行变量缓冲区里的值适合看“现在的情况”归档模式读取的是历史数据库里的值适合回看“过去的情况”。报表需求百分之九十九都是归档模式。你在控件组态里看到类似“连接的数据源”再“归档”这样的选项选归档模式就对了。3. 历史趋势曲线控件的价值一半在配置一半在脚本3.1 趋势控件不是拿来“看”的是拿来“分析”的在线趋势控件WinCC Online Trend Control和在线表格控件是一对搭档。表格给人具体的数值趋势曲线给人直观的走势。项目里要做温度异常分析、压力波动判断的时候靠表格一行行看会疯掉趋势曲线一眼就能看出问题点。配置方面和表格控件类似拖控件、添加曲线、关联归档变量、设置时间轴。但趋势控件有几个专属属性需要仔细调曲线颜色和线宽多变量同屏显示时颜色一定要区分清楚。推荐的做法是压力用暖色系、温度用冷色系、流量用中性色别图好看乱配。时间轴格栅横轴刻度间隔要按时间范围自适应查1小时的数据刻度到分钟级查24小时的数据刻度到小时级。控件有自动刻度选项建议开上。数值轴范围同一个控件里如果放压力和温度数值差异可能很大曲线会被压扁。这时候要么分开控件显示要么在控件的数值轴里启用多轴模式让不同变量用不同的纵轴。3.2 历史趋势曲线脚本怎么用代码控制曲线切换和导出这是“wincc历史趋势曲线脚本”这个热词背后真正的需求。很多场景下操作员不能每次都进组态去改曲线必须做按钮点一下切换时间范围点一下显示某一组变量。这就得写脚本了。下面这段VBS脚本的逻辑是从画面上拿到趋势控件实例、清空旧曲线、添加两条新的归档变量曲线、设置最近4小时的时间窗口、刷新显示。Dim objTrend Dim dStart, dEnd 获取画面上的趋势控件对象名称要和画面里控件的实际名称一致 Set objTrend ScreenItems(TrendControl1) 清空当前所有曲线 objTrend.ClearAll 添加两条归档变量曲线变量名必须是开启了归档的变量 objTrend.AddCurve Pressure_Tang, P_Tang objTrend.AddCurve Temp_Tang, T_Tang 设置时间范围为最近4小时 dEnd Now dStart DateAdd(h, -4, dEnd) objTrend.SetTimeRange dStart, dEnd 刷新显示 objTrend.Refresh注意WinCC不同版本的控件API名称会有差异上面这个代码是逻辑框架实际项目里要对照你那个版本的控件对象浏览器确认方法名。核心思路是通用的取得控件对象、清空、添加曲线、设定时间窗口、刷新。如果你连脚本都懒得写也可以在控件属性里直接用“时间范围”的组态设置绑定画面的按钮配个“显示最近1小时”“显示最近1天”之类的固定值。灵活性和脚本比差一些但胜在稳定适合运维期不爱改代码的现场。3.3 趋势曲线出“阶梯状”不是坏了是采样周期和压缩策略的事我碰到过不少业主拿着趋势图过来问“为什么这个压力曲线像楼梯一样一格一格的”原因通常有两个一是变量归档周期设得太长比如本来1秒记录一次被改成了60秒两次记录之间的变化自然显示不出来曲线就成台阶了。二是在WinCC归档配置里启用了数据压缩系统按死区/时间窗口做抽样只保存特征点画出来自然不是平滑的。处理办法趋势分析类的变量建议归档周期设到5秒以内并且关闭压缩策略或者把压缩死区设大一些保证波动小的时候不记录、波动大的时候尽量记全。报表数据和趋势展示对数据密度的要求是不一样的归档规划阶段要把两个场景一起想清楚。4. 真正的“生产报表”是怎么做出来的SQL取数加VBS导出4.1 把WinCC当数据库查而不是当控件用当需求变成“我要一份交接班Excel报表里面有全班次每个变量的平均值、最大值、最小值”的时候在线表格控件和趋势控件就不够用了——它们能看、能打印但做不了复杂的统计计算也管不了Excel格式。这时候的正确做法是绕过报表控件直接查WinCC的历史数据库。WinCC运行时的历史数据存在本机或服务器的SQL Server里连接方式就是标准的ODBC或ADO。你完全可以把它当成一张普通的业务表来查询。一个很容易踩的误区是去找“固定的表名”。WinCC的项目名不同、归档连接名不同实际生成的表名也会不同不同版本还有差异。所以别死记硬背表名打开SQL Server Management Studio连上WinCC的运行时数据库在sys.tables里翻一下实际表名比什么教程都准。下面是通用的查询思路示例-- 表名请以实际数据库为准先用下面这条语句看看有哪些表 -- SELECT name FROM sys.tables WHERE name LIKE %Archive% -- 查询某变量某时间段的归档数据 SELECT TagName, Value, Quality, Timestamp FROM dbo.Archive_Table -- 替换为实际表名 WHERE TagName P_Tang AND Timestamp 2025-01-01 00:00:00 AND Timestamp 2025-01-01 08:00:00 ORDER BY Timestamp;4.2 VBS脚本把查询结果写进Excel交接班报表自动化数据查出来了还差最后一步生成Excel。这一步要么用WinCC全局脚本里的VBS要么用外部程序做。我推荐VBS因为直接在WinCC运行环境里就能跑不用额外部署配合画面按钮或者定时触发器就能自动执行。来看一个精简后的脚本框架Dim objExcel, objWorkbook, objSheet Dim objConn, objRS, strConn, strSQL, iRow 创建Excel对象 Set objExcel CreateObject(Excel.Application) Set objWorkbook objExcel.Workbooks.Add Set objSheet objWorkbook.Worksheets(1) 写表头 objSheet.Cells(1, 1) 时间 objSheet.Cells(1, 2) 压力 objSheet.Cells(1, 3) 温度 数据库连接和查询连接串里的服务器名、库名按实际项目填 strConn ProviderSQLOLEDB;Data Sourcelocalhost;Initial CatalogYourWinCCDB;Integrated SecuritySSPI; strSQL SELECT Timestamp, Value FROM Archive_Table WHERE TagNameP_Tang AND Timestamp GETDATE()-1 ORDER BY Timestamp Set objConn CreateObject(ADODB.Connection) Set objRS CreateObject(ADODB.Recordset) objConn.Open strConn objRS.Open strSQL, objConn 从第2行开始填数据 iRow 2 Do While Not objRS.EOF objSheet.Cells(iRow, 1) objRS.Fields(Timestamp).Value objSheet.Cells(iRow, 2) objRS.Fields(Value).Value iRow iRow 1 objRS.MoveNext Loop 关闭连接 objRS.Close objConn.Close 导出格式 objSheet.Range(B:C).NumberFormat 0.00 objWorkbook.SaveAs D:\Report\RoutineReport.xlsx, 51 51表示xlsx格式 objWorkbook.Close objExcel.Quit Set objRS Nothing Set objConn Nothing这段脚本有几个细节值得注意第一Excel的单元格格式问题。很多从数据库直接写Excel的报表会出现“时间变成一堆数字”的情况那是Excel把时间当成序列号了需要在写完数据之后统一设置列格式比如objSheet.Columns(A).NumberFormat yyyy-mm-dd hh:mm:ss。第二别忘了清理Excel进程。脚本结尾如果没有Quit和对象置空运行几次之后任务管理器里会堆一堆Excel后台进程轻则内存暴涨重则影响WinCC运行稳定。我见过一个项目报表跑了一个月服务器上几十个Excel进程挂着不退出最后把服务器拖到报警。第三定时触发放哪。交接班报表一般是每8小时跑一次可以直接在WinCC全局脚本里用“定时触发器”来跑也可以做成画面按钮让值班长手动点。我一般两种都做手动按钮负责“补单”定时触发负责“正常出表”。4.3 平均值、最大最小值怎么算报表最常要的不只是原始数据而是统计值。SQL写起来不复杂但有个坑SQL Server的AVG如果列里有NULL值或者质量码异常Quality不是192统计结果会让你怀疑人生。建议在查询条件里加上质量码过滤只统计质量正常的记录SELECT TagName, COUNT(*) AS Cnt, AVG(Value) AS AvgValue, MAX(Value) AS MaxValue, MIN(Value) AS MinValue FROM Archive_Table WHERE Timestamp 2025-01-01 00:00:00 AND Timestamp 2025-01-01 08:00:00 AND Quality 192 -- 192表示质量好丢站或者满量程的数据别统计进去 GROUP BY TagName;质量码这个字段新手很少看老手天天看。WinCC归档数据里每条都有质量码192是采样正常128开头的一堆是异常。报表统计一定要把异常值过滤掉否则一个传感器短时断线能把平均值拉出天际。5. 现场最常见的两个“鬼问题”数据刷不出来和V15.1许可证找不到5.1 报表数据刷不出来先按这个顺序排查只要报表有问题我都按固定顺序查基本能覆盖八成情况第一步查变量是否启用归档。变量管理里选中变量看“记录”选项卡有没有勾选。没勾报表肯定没数据。这一步占问题总量的四成以上而且往往是最先要排除的。第二步查时间范围是否匹配。报表控件查询的时间段如果在归档开始之前、归档保留期之后或者跨了归档段的切换窗口都会出现查不到数据的情况。建议先把时间范围拉到最近半小时一条条缩小范围试。第三步查归档服务和数据库连接。WinCC运行界面右下角的状态图标、Windows服务里的SQL Server服务、WinCC归档运行服务这三个地方都得看一眼。只要有一个没起来报表控件就是一摊死水。第四步查是不是权限问题。如果运行WinCC的用户账号没权限访问SQL Server的归档库控件打开没报错但也查不出任何数据。特别是域环境下这种问题隐蔽得很。5.2 V15.1找不到许可证别急着重装先按这个顺序查“v15.1 找不到许可证 wincc comfort”这个搜索词眼熟吧我在WinCC V15.1的Comfort版本项目里也翻过车最后发现根本不是授权丢了而是授权类型不对。排查顺序是这样的第一打开Automation License Manager看授权是否存在。如果授权列表里根本没有WinCC Comfort V15这一项那问题就回到了“这台机器压根没装对应的授权”。第二看授权是不是被隐藏了。授权盘插在服务器上但授权服务没启动或者当前登录用户不是授权专用用户ALM里就会找不到授权。把西门子相关的授权服务手动启动再在ALM里点“重新读取”多半能恢复。第三查系统时间。授权文件和系统时间绑定如果现场有人把系统时间改回过去了授权会暂时失效因为防回溯机制会认为授权过期。改回正确时间后重新读取一次授权就行。第四查授权版本匹配。这是最容易被冤枉的一点。原来装的是WinCC V14的授权项目用V15.1打开Comfort组件找不到V15对应授权。西门子的授权规则不是“高版本授权全覆盖”而是需要对应版本的License Key老项目跨版本时经常出这个问题。解决方法是做授权升级License Upgrading而不是重装软件。第五检查WinCC Comfort和WinCC Professional的区别。这两个是完全不同的授权产品线。用Comfort版授权打开Professional版项目或者反过来都会报“找不到许可证”。买授权之前一定先确认项目的实际编译目标版本是哪个。5.3 团队协作时报表模板打不开的坑也在这里多工程师协作的项目里如果一个人用WinCC V15.1另一个人用V15.1 Update 4报表控件版本不一致画面模板很容易打不开或者控件属性丢失。这个问题看着像“报表模板坏了”其实是控件版本被自动替换导致的。项目组最好统一下发组态包版本并且把报表画面所在的库文件Pdl和组件清单一起放进版本管理。我们在现场吃过亏之后定了条规矩凡是含有报表控件的画面改完之后必须在同版本环境里打开验证一次再发版别在个人电脑上改完直接丢服务器。最后再分享一个我的习惯做了这么多WinCC项目我的切身体会是报表控件这套东西单看某一个环节都不难难的是把“变量归档、控件显示、数据库查询、脚本导出”这条链路的上下游全部打通。所以我每到一个新项目第一周一定会做一件事把所有需要出报表的变量整理成一张表字段包括变量名、工艺位号、归档周期、压缩策略、报表用到的统计方式。这张表既是归档配置的依据也是后面写SQL脚本的字典更是和甲方确认报表口径的凭据。甲方说“我要平均值”你问他“质量码异常的值算不算进去”这一句话就能挡住以后无数扯皮。这个习惯推荐你也试试。