WinCC报表制作全攻略:从归档配置到Excel导出

WinCC报表制作全攻略:从归档配置到Excel导出 做了这么多年工控项目我最大的感受就是现场调试最磨人的往往不是PLC程序而是报表。甲方一句“我要能打印的日报表、班报表还要能导出Excel”能让不少工程师在项目收尾阶段反复改界面、调脚本、抓头发。WinCC作为西门子最常用的上位机组态软件报表功能其实很成熟但网上资料要么都是官方手册式的生涩说明要么就是只讲某一个孤立操作对新手特别不友好。这篇文章我把自己在WinCC里做报表的完整思路、常用方案和踩坑记录整理出来从需求分析讲到方案选型再到具体组态步骤和脚本实现最后附上常见问题的排查方法覆盖WinCC 7.x、博途WinCC Professional以及WinCC Unified的报表相关操作。只要你手里有一个能跑的WinCC项目跟着这篇文章走报表功能基本能拿下大半。提示文章以WinCC 7.5版本为主要演示环境但涉及的用户归档、变量归档、Excel导出、数据库交互这些底层逻辑在博途WinCC Professional和WinCC Unified里同样适用差异部分我会单独说明。1. WinCC报表到底能做什么——先搞清需求和方案选型很多人在接触WinCC报表功能时第一反应是找菜单里的“报表”按钮结果发现WinCC并没有一个像Word里“新建文档”那样直观的报表编辑器于是就开始怀疑是不是自己没装全组件。其实WinCC的报表能力是分散在几个功能模块里的你得先搞清楚自己想做的报表长什么样、数据从哪来才能选对实现路径。1.1 四种常见的报表需求场景我接触过的现场报表需求基本可以归成四类你先对号入座看看自己属于哪一种。实时数据快照型报表把当前几条关键变量的数值抓出来打印一张带有时间戳的表格比如交接班时记录当前温度、压力、流量、产量。这类报表不需要历史数据参与用WinCC自带的打印函数或者简单的画面打印就能实现。历史趋势型报表把过去某段时间内的变量归档数据提取出来按天、按班次、按时段生成日报、月报、趋势曲线比如某个罐体的温度曲线、电机电流变化曲线。这类报表需要用到变量归档Raw Data Archive或压缩归档。统计汇总型报表带有产量累计、运行时长、合格率、能耗统计等计算逻辑比如每班产量、设备运行时间、报警次数、停机时长。这类报表最接近生产管理需求通常要用到用户归档User Archive配合脚本计算或者直接把数据导到数据库/Excel里做二次处理。报警事件型报表把报警记录、操作记录、事件日志筛选出来打印比如某台设备一天内的所有报警明细或者某个操作员的操作记录。这些数据存放在报警归档里WinCC自带的报警控件本身就支持按时间筛选和打印。搞清楚这四类场景之后你要做的不是马上打开软件找功能而是先确认两件事数据源在哪报表格式是谁定。数据源决定你用归档还是用数据库报表格式决定你是用WinCC布局打印还是导出Excel后套模板。1.2 主流实现方案的优劣势对比根据现场需求的不同我一般会在三种方案里选这里直接给出横向对比方便你按项目实际情况去取舍。实现方案优点缺点适合场景WinCC自带打印布局Layout集成度高不需要额外软件WinCC运行时直接触发打印稳定可靠布局编辑不够灵活复杂表格样式做起来费劲数据量大的时候打印排版一般简单日报、交接班记录、报警摘要用户归档 Excel模板导出样式完全可控Excel里做公式、合并单元格、图表都很方便客户最认可需要写VBS脚本运行机器上要装Excel版本兼容性偶尔有坑班产统计、能耗报表、带图表的综合报表数据库直连 报表开发Access/MySQL/SQL Server数据容量大、查询灵活可以对接第三方报表工具如Report Viewer、帆软等开发工作量最大需要专门做数据表设计和查询界面月报、年报、大数据分析、跨系统汇总我自己的习惯是第一次做WinCC项目时先用方案一自带打印布局跑通流程后期客户要复杂格式时果断转到方案二Excel导出。因为在WinCC里布置一张像样的打印布局耗费的精力远比你想象中多而Excel模板几乎是所有工厂办公室都能接受的格式。另外补充一句很多人不知道WinCC自带的一个功能叫做“运行系统打印”也就是在Graphics Designer里设计一个打印专用的画面把它当作业绩报表的模板。你可以往上面放IO域、表格控件、文本再配合全局脚本触发打印这种玩法比传统的Layout打印要灵活得多也对应了不少人搜索的“WinCC怎么设置模版画面”这个问题。2. 数据从哪来——变量归档和用户归档的分工要说清楚了报表系统的核心永远不是“打印”而是“数据”。我在现场见过不少项目报表按钮点了没反应或者打印出来全是空值排查到最后发现不是脚本问题而是根本没组态归档变量数据压根没存下来。所以这一节把WinCC数据归档的两套体系讲透你后面做报表才会稳。2.1 变量归档给“趋势型报表”和“历史日报”喂数据变量归档Variable Archive在WinCC里负责的是周期性采集并存储过程变量。你在WinCC组态软件里打开“变量管理”右键点击“变量归档”就能新建归档和归档变量。这里有几个关键参数你一定要理解采集周期决定系统每隔多少毫秒从PLC读一次值。周期越短数据点越密但占用空间和系统负载也越大。现场常用的工艺量温度、压力建议1秒到5秒能源计量类流量累计建议1秒以内。存储周期决定原始数据保留多久。WinCC有“Raw Data”原始数据和“压缩数据”比如按小时平均值存储之分压缩数据可以长期保存但细节信息会丢失。所以做日报表时一般取原始数据来算平均或累计做月报表时才会用到压缩归档。采集类型是非周期还是周期。报警类的变量可以选“事件驱动”但不是所有变量都支持过程值一般都用周期采集。举个例子我在一个水处理项目里做“清水池液位日报表”要求打印每天0点到24点每小时的平均液位。我就在变量归档里建了一个“液位归档”采集周期设了2秒存储周期设为10年然后报表脚本按小时去查归档数据算平均。如果你只做了HMI画面上的实时显示而没建变量归档这个需求就完全没法实现。2.2 用户归档给“统计汇总型报表”搭数据表用户归档User Archive可以理解成WinCC内置的一个迷你数据库表格你可以自己定义字段比如班次、操作员、产品批次、产量、合格率、备注然后通过画面输入或者脚本写入数据再通过报表布局或Excel导出把数据读出来。这个功能在做“人工填报系统自动采集”混合型报表时特别有用。比如现场有一个“手动巡检记录表”操作员每两个小时填一次设备状态、异常描述同时产量是自动读取的这两部分数据要出现在同一张报表里。你可以在用户归档里建一张“巡检记录表”字段包括“时间、设备名、产量、状态、备注”然后画面上放五个IO域绑定到对应字段操作员填完点“写入”按钮脚本就执行用户归档的插入操作。用户归档的另一个好处是数据可以跟变量归档组合使用。你可以先用脚本从变量归档里把某段时间的平均值或累计值算出来再写入用户归档表格的一行最后统一从用户归档里读出来做报表。这样报表脚本只需要面向一个数据源逻辑会清晰很多。2.3 WinCC与Access/MySQL数据库交互的实现思路再进一步很多项目不满足于WinCC自带的归档需要把数据交给第三方数据库系统比如你们后台管理软件用的Access或MySQL。这个需求其实是同一个套路通过ODBC或ADO连接数据库然后执行SQL语句进行读写。在WinCC里连接数据库一般有两种方式方式一WinCC本身的“数据开放接口”比如WinCC OLEDB Provider可以直接用SQL查询变量归档和报警归档。这种方式适合第三方系统主动来“拉取”WinCC的数据对WinCC运行没有侵入。方式二通过VBS脚本里的ADO对象连接外部数据库。这种方式适合WinCC主动“推送”数据比如每班结束时自动把产量统计写入MySQL服务器。这里给一个用VBS连接MySQL的典型连接字符串例子Dim conn Set conn CreateObject(ADODB.Connection) conn.ConnectionString Driver{MySQL ODBC 8.0 Unicode Driver}; _ Server192.168.1.100;Databasereportdb;Uidroot;Pwd123456; conn.Open conn.Execute INSERT INTO shift_report(shift_date, shift_no, output_qty) VALUES(#2024-05-20#, A, 1520) conn.Close Set conn Nothing注意WinCC运行机器上必须提前安装对应数据库的ODBC驱动并且“ODBC数据源64位/32位”里要能连通目标库。这里有个很容易踩的坑WinCC 7.5默认是32位进程所以ODBC驱动也要用32位版本去配置数据源用64位版配好了WinCC里连不上。我在Access数据库项目上就栽过这个跟头换了32位驱动后一切正常。3. 核心实操从零组态一个可用的报表接下来进入正题我带你完完整整走一遍“WinCC自带布局打印”和“Excel导出”两种方式保证你按步骤操作就能跑出第一张报表。3.1 用WinCC打印布局快速做一张日报表WinCC的打印功能走的是“布局编辑器”路线任何画面都可以打印但我们单独建一个打印专用布局避免干扰操作画面。具体步骤如下。第一步创建打印布局在WinCC项目树的“图形编辑器”下新建一个画面命名为“Report_Daily”。推荐画面大小设置为A4纸横向其实不影响打印但排版更直观然后在画面属性里打开“对象属性” - “几何”将画面尺寸设置为297mm × 210mm的对应像素值按96dpi大约是1123×794像素。注意报表布局最好是独立画面不要在主操作画面上直接放打印内容否则操作员每次打开主画面都会看到一堆报表控件还影响运行性能。第二步放表格控件并绑定数据从工具栏里拖一个“WinCC TableControl”到画面上。这种控件可以从变量归档或用户归档中读取数据并显示。右键控件打开“属性” - “组态”在“数据源”里选择你要读取的归档然后配置显示列、排序规则和时间范围。这里要注意如果你希望在运行时动态切换日期就不能把时间写死而是要连接变量。我的做法是在画面上放两个IO域开始日期、结束日期分别连接到内部变量“ReportStart”和“ReportEnd”再放一个按钮“查询”按钮的VBS脚本里把日期字符串赋给TableControl的查询范围参数。这样操作员输入日期后点查询表格就刷新出对应时段的数据。第三步设置打印触发报表画面做好后在需要打印时比如点一个主画面上的“打印日报表”按钮用以下脚本打开报表画面并触发打印Dim objScr, objPrn Set objScr ScreenItems(Report_Daily) objScr.Show objScr.Print ScreenItems是当前画面的对象集合Print方法会按Windows默认打印机输出。如果画面还没被打开你可以先通过“OpenPicture”打开再打印。打印完成后再调用ClosePicture关闭避免报表画面长期驻留内存。这种方式的优点是逻辑简单、依赖少缺点是打印效果受打印机驱动和布局本身限制格式确实不够专业。所以现场要交付带Logo、带签名字段的正式报表时我通常建议走下一种方案。3.2 用Excel模板导出一份漂亮的生产班报如果你想让报表带公司的Logo、特定的表格线、合并单元格、图表那就要用“WinCC VBS脚本生成Excel报表”这个组合这也是我强烈推荐你掌握的一项技能。第一步准备Excel模板先手工在Excel里做一份空模板把Logo、标题、表头、打印区域、页眉页脚都设置好需要填入数据的单元格留空如图表位置同样预留好。保存时选择“.xlsx”格式放在项目路径下例如C:\MyProject\ReportTemplates\ShiftReport.xlsx第二步在WinCC里建立报表变量和按钮在WinCC变量管理里建几个内部变量班次文本型日期文本型班产量浮点型合格率浮点型用于让脚本知道要填充哪些内容。然后在操作画面上放一个按钮“生成班报表”或者更自动化一点在全局脚本里设定定时触发比如每个班次结束时自动执行。第三步写VBS脚本填充Excel按钮的VBS动作里主要执行以下几件事创建Excel对象、打开模板、写入数据、另存为带日期的报表文件、可选的打印和关闭。下面是一个典型的脚本框架Dim fso, excelApp, wb, ws Dim sReportPath, sTemplatePath, sDate sTemplatePath C:\MyProject\ReportTemplates\ShiftReport.xlsx sDate FormatDateTime(Date, 2) _ FormatDateTime(Time, 4) sReportPath C:\MyProject\Reports\ShiftReport_ sDate .xlsx Set excelApp CreateObject(Excel.Application) excelApp.Visible False excelApp.DisplayAlerts False Set wb excelApp.Workbooks.Open(sTemplatePath) Set ws wb.Worksheets(1) 往指定单元格写入动态数据 ws.Range(B2).Value 2024-05-20 ws.Range(B3).Value A班 ws.Range(B4).Value ScreenItems(ProdTotal).OutputValue ws.Range(B5).Value ScreenItems(QualRate).OutputValue 保存为独立报表文件 wb.SaveAs sReportPath, 51 51 对应 xlsx 格式 wb.Close False excelApp.Quit Set ws Nothing Set wb Nothing Set excelApp Nothing这段脚本里的“ScreenItems(ProdTotal).OutputValue”是从画面上其他IO域读取的数值你也可以改为直接读取WinCC变量HMIRuntime.Tags(ProdTotal).Read。两种方式各有优劣变量读取在后台自动执行时更可靠画面控件值在有人值守界面时更直观。第四步让报表自己按班次生成如果不想靠人工点按钮可以在WinCC的“全局脚本”-“计划任务”里添加一个触发器设定在每个班次结束的时间点执行上述脚本。比如白班是16点结束就设置每天16:00:00触发一次“CreateShiftReport”函数。提醒自动化执行Excel脚本时一定要保证运行WinCC的电脑上Excel没有弹出任何对话框比如“文件已存在是否覆盖”所以脚本里务必加excelApp.DisplayAlerts False否则Excel一旦弹个模态窗口脚本就挂在那了报表也生成不了。3.3 WinCC Unified和博途WinCC Professional的报表差异说明有些朋友用的不是经典的WinCC 7.x而是博途WinCC Professional或新一代的WinCC Unified它们做报表的入口和思路有变化。博途WinCC Professional V16及以上报表功能主要由“运行系统打印”和“计划任务”承担变量归档和用户归档的概念还在但组态界面换成了博途风格。不少人在博图里找“报表”找不到其实博途的报表更依赖WinCC Runtime Professional里的画面打印和归档表格显示。WinCC Unified这是西门子新一代的上位机平台Unity组态里对Excel导出和Web报表支持更好但它不再支持传统的VBS脚本而是改用JavaScript脚本。所以在Unified里做Excel报表要写成JavaScript版本的Excel操作思路仍然是“创建模板-打开对象-填充数据-保存”。举个例子在WinCC Unified里触发Excel导出的脚本风格是let excelApp new ActiveXObject(Excel.Application); excelApp.Visible false; let wb excelApp.Workbooks.Open(...\\template.xlsx); let ws wb.Worksheets.Item(1); ws.Range(B2).Value demo; wb.SaveAs(...\\output.xlsx, 51); wb.Close(false); excelApp.Quit();所以关键是掌握“操作Excel对象”这套思维具体编程语言跟随平台切换就行。WinCC 7.x用VBS、Unified用JavaScript原理相通。另外关于WinCC Unified建立工程时的用户名和密码、画面设计这些基础问题属于平台入门范畴跟报表直接相关的一点是Unified的报表文件路径是运行在服务器端还是客户端这会影响Excel文件生成的目录位置组态时要注意权限设置否则生成的报表文件可能被系统安全策略挡住。4. 报表做完跑不通——常见问题与排查技巧实录报表功能在WinCC里是个综合工程变量、脚本、Office、打印机、操作系统任何一个环节出问题报表都会“罢工”。这一节我从真实项目里挑了六个高频问题每个都给了排查路径你看完可以直接照着查。4.1 打印出来中文全是乱码或方块这个问题的本质是你Windows系统里没有对应的中文字体或者WinCC报表布局使用的字体不支持中文。WinCC运行系统默认字体可能是“Arial”或“Segoe UI”这些字体在中文环境里遇到汉字时经常显示为方块。解决办法在打印布局里把所有涉及中文的文本对象和表格控件字体手动改成“宋体”或“微软雅黑”。不要用默认字体。另外检查一下运行系统的区域语言设置确保非Unicode程序语言是“中文简体中国”否则模板里的中文经过程序间传递也可能出现编码错乱。我见过最奇葩的一次是报表在开发电脑上打印正常部署到现场电脑后中文变成方块。最后发现现场电脑是英文版Windows按照上述办法改成中文字体并调整区域语言后解决。4.2 WinCC 7.5里英文时间格式怎么改成中文格式这个热搜词对应的是WinCC运行时日期时间显示不跟随系统中文习惯的问题。WinCC 7.5默认可能显示“5/20/2024 4:30:00 PM”这种英文格式而国内项目通常要“2024-05-20 16:30:00”。排查方向有三个第一检查Windows系统区域和时间格式确保短日期格式为“yyyy-MM-dd”长日期格式包含中文星期。第二WinCC项目属性里的“时区”和“国际化”选项要把“区域设置”调整为“中文”。第三脚本里用FormatDateTime函数时指定格式比如Dim sNow sNow FormatDateTime(Now, 2) FormatDateTime(Now, 4)这会输出“2024/5/20 16:30:00”但如果你想要补零的“2024-05-20 16:30:00”就得用Year(Now) - Right(0 Month(Now), 2) - Right(0 Day(Now), 2)这种方式手工拼接。报表脚本里我通常建议手工拼保证格式绝对统一不依赖系统设置。WinCC Unified和博途Professional的时间格式改法类似主要也是靠系统区域设置和脚本格式化函数但Unified的HTML5 Runtime不会自动转换时间格式脚本里最好显式处理。4.3 报表只显示列名不显示数据如果你用的是TableControl或Excel导出后发现表格里没有数据先别急着怀疑脚本。打开“变量归档”的管理对话框检查几个地方变量归档是否启动很多项目里归档的“启动”开关没打开运行系统一直没采集数据。采集周期是否合理如果查询的时间范围和采集周期不匹配比如归档只存了两天数据你查一个月自然没数据。变量连接是否正常归档变量对应的PLC连接如果在运行时掉线归档值会一直为空或保持默认值。排查技巧在运行系统里打开“变量归档控件”选中对应的归档变量看看能不能显示历史曲线。如果曲线有数据但报表没有问题就在报表查询逻辑如果曲线都没数据那就是采集环节的问题回去查归档组态。4.4 Excel导出时报错或Excel进程卡死这是做WinCC报表的人遇到最多的故障。常见原因有三类第一Excel没有被正确安装或者许可证激活VBS里创建Excel.Application对象失败。测试方法是在WinCC运行机器上手动打开Excel看是否正常。第二上一次脚本异常退出后Excel进程还残留在后台导致下一次创建对象失败。这时打开任务管理器把所有“EXCEL.EXE”进程全部结束即可。避免方法是脚本开头加On Error Resume Next并尝试清理旧进程。第三代码里没有释放对象长期运行后内存耗尽。每次脚本结束前必须Set objExcel Nothing并调用excelApp.Quit。我习惯在脚本的On Error处理里做一个兜底如果创建Excel对象失败就把错误信息写进一个记事本日志文件这样即使现场操作员说不清报错内容你也能通过日志定位原因。4.5 想实现WinCC Professional开机自动运行报表这个需求常见于无人值守的现场工控机希望开机后WinCC运行系统自己启动并且按计划自动生成报表。这一步的关键是系统启动顺序和账号权限不是报表脚本本身。操作方法把WinCC运行系统的快捷方式存到Windows启动文件夹里或者用任务计划程序创建一个“计算机启动时运行”的计划任务触发命令指向C:\Program Files (x86)\Siemens\WinCC\bin\CCexe.exe具体路径随版本略有差异。如果项目还要自动登录需要提前把WinCC的“运行系统组态”里的“密码保护”选项设置好或者在启动脚本中模拟键盘输入。确保Windows自动登录已经配置好否则开机停在登录界面计划任务也不会执行。这一点和报表的关系在于很多客户要求“开机后就自动生成昨日报表并存到共享文件夹”你要保证WinCC运行系统已加载、变量归档已经启动、定时任务已经就绪这一切都需要开机自动化的完整链路靠谱。4.6 常见问题排查速查表为了方便现场快速定位我把上面这些问题整理成一张速查表你可以截图存手机里现象可能原因排查顺序打印报表乱码字体不支持中文改控件字体、检查系统区域语言日期显示英文格式系统区域设置不对改系统短日期格式、脚本手工格式化报表无数据变量归档未启动查归档启动开关、采集周期、曲线控件验证Excel脚本报错Excel未装/残留进程手动开Excel、任务管理器杀EXCEL.EXE报表生成慢数据量大/Excel屏幕刷新临时关闭excelApp.ScreenUpdating按钮点打印无效报表画面未打开先OpenPicture再Print导出到MySQL失败ODBC驱动位数不匹配检查32位/64位ODBC数据源配置5. 几个能提升报表交付效率的实战经验最后聊几个跟报表开发流程、交付质量相关的经验这些是我在项目里摸索出来的常规手册不会写得这么细。第一个经验做报表前先跟客户确认模板原型别急着写代码。我在很多项目里被折腾的原因不是功能实现不了而是客户需求一直在变今天要加一列明天要把合格率放在产量前面后天要改成横向打印。后来我学乖了第一次去现场就带着纸质版报表样例和客户逐格确认标题字号、表头内容、数据顺序、签字栏、打印方向、是否要Logo全部白纸黑字记录确认。确认后我再组态后续改动就有据可依。第二个经验归档存储周期不要随便省否则后面想补报表都没法补。变量归档的数据是报表的原材料存储周期设短了导致历史数据丢失那可不是重写脚本能救回来的。有个电机温度监测项目最初只设了7天存储客户第三个月突然要回顾第一周的数据结果早就被覆盖了。从那以后我对于生产关键参数一律建议至少3~6个月存储周期如果硬盘空间够直接设10年也不为过。第三个经验Excel报表生成目录尽量用相对路径或统一配置变量。现场工控机的盘符和开发电脑很可能不一样如果脚本里硬编码了“D:\Reports”而现场D盘不存在报表就会生成失败。我的做法是在WinCC的全局变量里设一个“ReportPath”字符串变量脚本启动时从变量读取路径如果目录不存在就用CreateObject(Scripting.FileSystemObject).CreateFolder自动创建这样部署到任何电脑都不用改脚本。第四个经验多个报表共用一份模板靠颜色或标签区分。大项目里日报、周报、月报、报警汇总往往有四五张报表如果每种报表都配一个Excel模板文件后期改一个公司名Logo就要改五个模板非常痛苦。可以在模板里用同一个基础样式在单元格里预留版次区域脚本根据报表类型填入不同标签这样Logo和字体的维护只需要改一个文件。总的来说WinCC报表功能的核心不是“知道按钮在哪”而是理解数据从哪里来、到哪里去、中间怎么处理。你把变量归档和用户归档吃透把Excel对象操作和数据库连接写熟再把常见故障的排查路径刻在脑子里任何品牌的组态软件碰到报表需求都能顺手拿下来。希望能给正在被报表折磨的你一点帮助。