ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WinCC报表制作全指南:从控件到VBS脚本与数据库查询的选型与实现

WinCC报表制作全指南:从控件到VBS脚本与数据库查询的选型与实现 简介这份PPT学习教案系统讲解西门子WinCC报表制作方法面向工业自动化现场工程师、HMI组态初学者以及需要整理生产报表的技术人员。包内为1个pptx演示文稿体积仅651KB共15页内容虽精简但覆盖报表编辑器、打印任务配置、消息序列报表、消息归档报表、测量值趋势与表格报表、画面区域拷屏及打印预览等完整模块。目前已有106人学习。教案重点说明打印作业名称、打印布局名称以及FFile、PPrint、RPReport等参数含义区分页式布局与行式打印机布局并通过示例展示如何利用PrtScreenPart函数将画面中指定控件区域截取为图片同时给出消息归档报表中“100\”表示打印最后100条消息等实用细节可帮助读者在真实项目中快速实现历史数据归档、实时消息打印和运行趋势分析提升WinCC报表制作与工程调试效率。1. 先想清楚WinCC报表是在给谁看决定了你选哪条路很多工程的“报表需求”是从一句高情商描述开始的领导想看个统计。于是压力落到WinCC画面工程师身上打开WinCC就开始拖控件。这里最容易被带偏的一点是看趋势曲线和出报表是两回事。操作工在画面上看曲线关注的是实时变化领导或客户要的报表关注的是班次累计、均值、合格率和可打印交付的表格文件。那位“WinCC如何制作报表PPT学习教案”的整理者其实是想把这件事做成一次能照着做的讲授数据从哪来、用什么控件放画面上、怎么导出和打印、脚本怎么写、出问题时怎么查。这份学习路线的受众很明确——正在调试WinCC项目、被要求交一份像样报表的工程师也包括要从零学WinCC数据归档的初学者。现在多数人第一步就开干但正确顺序是先回答三个问题报表给谁看、多久出一份、要不要自动化。这三个答案决定你后面用的主板、脚本还是控件。2. 报表方案三条主线控件、Excel脚本、数据库查询怎么选2.1 WinCC报表三条路的长短对比我经手过不少WinCC上位机项目报表做法翻来覆去跳不出三条路。第一种是纯控件方案在画面里放WinCC Online Table Control在线表格控件和WinCC Online Trend Control在线趋势控件再配合控件自带的导出功能把数据落成CSV或Excel。这个做法最快组态半小时数据也能看但定制能力弱导出的文件基本是“所见即所得”没法按你的格式重排。第二种是VBS脚本加Excel在WinCC画面按钮或全局脚本里写VBS用CreateObject(Excel.Application)拉起Excel再把WinCC变量值或归档数据填进单元格。这个做法最通用报表格式完全受你控制能做出班报表、日报表、设备运行率统计这类真正的“报表”也是多数PPT学习教案花大篇幅讲的部分脚本模板能直接抄。第三种是直接查WinCC归档数据库用ADO或ODBC连到WinCC的运行时归档库用SQL查历史数据再交给Excel或其他报表工具做呈现。这个方案灵活度最高能跨项目抽取数据做统计分析但你需要懂一点WinCC的归档表结构和SQL语法而且开发调试周期最长。实现路线能做什么学习成本可定制性适合人群控件导出画面看趋势、看实时表格、手动导出数据低半天上手低随控件模板走新手、快速交付接数任务VBSExcel班报、日报、月报模板格式化输出中需要懂VBS基础高表格样式逻辑全可控需要交付自定义报表的工程师数据库查询跨时段统计分析、多项目合并较高需要SQL基础最高想怎么查就怎么查做数据接口或MES对接的工程师WinCC Flexible的老用户常把触摸屏上配方报表和用户报表的思路直接搬到WinCC里结果发现WinCC的报表能力和面板级HMI完全是两套体系。面板上的报表字段是组态好的WinCC里则是黑匣子得靠控件和脚本打开。2.2 选型看三件事读者、周期、格式我给客户做报表方案会先问三个问题。第一个是“谁看”。操作工看的报表和项目经理看的不一样操作工要的是交班时核对产量和设备状态表格里有一列“当前班次产量”就够了。项目经理看的是趋势对比需要图形化展现。真正给领导签字的报表反而要干净数据列不能太密时间范围要固定还要能打出来签字归档。面向打印的报表就优先走Excel模板路线因为控件导出的文件格式很难控制分页。第二个是“多久出一份”。交接班报表一天三次日报一天一次月报一个月一次。如果是每天定时生成就必须把脚本挂到全局脚本的定时触发器上而不是让操作员每天记着去点按钮。没有定时能力的控件方案在这里就不太够用了。第三个是“什么格式”。WinCC控件导出的CSV数据是纯数据没有表格线、没有标题行用来二次处理可以直接交人不行。现场如果要求Excel模板带公司Logo、带签名栏那就是VBS脚本的主场。如果客户要求的是网页上看的报表和帆软这类web报表系统类似的效果那WinCC自带方案就不擅长了常见做法是把数据推到独立的报表平台WinCC只管采集。我在选型时习惯先看一眼授权尤其是WinCC 8.1这类新版本确认授权包里包含了归档组件。见过不止一次项目装完之后运行库也启动了报警也有但历史曲线就是空的最后查下来是归档授权没有报表这条路从源头就断了。授权问题不是玄学但最容易被忽略。2.3 控件导出不等于做报表很多新手的误区是把控件导出的Excel文件当作交付物。我见过有人在WinCC里放了个在线表格控件导出CSV后用记事本打开一看全是分号隔开的字符当场不知道怎么办。实际情况是控件导出只是把画面控件里当前加载的数据倒腾成文件它不管排版、不管统计、不会自动筛选。你想算“这班次平均温度”控件导出的数据表里只有一行行原始记录平均值得自己在Excel里写公式。这不叫不会做报表是没搞清控件的边界——它是数据抓取工具不是报表生成器。反过来说如果每张报表都要不同的筛选逻辑和排列那用秒级的VBS脚本去操作Excel反而更可靠。脚本可以打开固定模板、往里填数、自动另存为带日期文件名的表格。这就是为什么我倾向于给学员的建议是控件方案当作过渡和验证工具真正的交付件走脚本做。还要注意一点WinCC Online Table Control这类控件在部分中文本地化版本里也被翻译成“组显示控件”或者“表格控件”网上搜“wincc组显示控件使用”搜出来的多半是它。你在画面编辑器里找对象时可能和我当年一样明明要放表格却在一堆控件名字里认不出它来。认准英文名Online Table Control就不会错。3. 用WinCC控件搭报表画面表格控件、趋势控件的组态步骤3.1 在线表格控件绑定归档变量画面上放控件这件事本身没难度但很多人在“绑定变量”这一步翻车。双击控件打开组态对话框在变量连接那一栏里需要把要显示的归档变量逐条加进去。这里最容易犯的错是变量是从变量管理里直接拖进来的而不是从“归档变量”列表里选的结果运行起来表格里永远是空行。注意WinCC在线表格控件显示的是已经归档的历史数据不是plc的实时值。所以添加变量时要确保目标变量的“记录”功能已启用也就是在变量管理里勾选了采集周期和归档选项。没有归档的变量就算连接上了运行画面里也查不到东西。这里给出一个常用的组态步骤打开画面编辑器从对象选项板中选择“WinCC Online Table Control”拖到画面上双击控件打开组态对话框在“列”页签中添加要显示的变量每列对应一个归档变量在“时间范围”页签设置起始时间和结束时间通常先选“相对时间”方便测试保存画面激活运行系统打开画面验证表格是否有数据。时间范围的设置直接决定报表内容。常见参数如下时间范围选项含义适用场景相对时间 / 过去1小时从当前时间往前推1小时查看近期趋势绝对时间 / 指定日期固定某天的0点到24点补打昨天的日报使用变量动态控制通过脚本修改时间范围班次报表切换不要直接在组态对话框里写死一个绝对时间当默认值。我见过有工程师组态时选了当天日期结果第二周打开画面表格停在调试那天。用相对时间做默认再配合按钮或脚本切换时间范围是稳定得多的习惯。3.2 趋势控件设置曲线样式和Y轴量程趋势控件WinCC Online Trend Control和表格控件是配套使用的。表格看数值趋势看走向。一个典型的报表画面左边放趋势控件右边放表格控件操作员能同时看到曲线和数据点。趋势控件的组态里真正要调的是曲线分配的变量和Y轴量程。变量没分配好画面上只有坐标轴没有线量程没设好曲线要么压扁成直线贴着0轴要么超出画面导致曲线看起来像飙到天花板上。建议在组态时把Y轴量程根据实际工况手动固定下来。比如测的是0到10兆帕的压力就把Y轴最小值设0、最大值设10。用自动量程有时候看起来很“智能”但两条不同量程的曲线放在同一张图里那条数值小的会变成一条直线误导现场判断。量程的调整在曲线分配对话框的“Y轴”页签里每个趋势窗口可以独立设置。曲线颜色也尽量固定同一变量在不同画面里用同一颜色现场操作员才认得。颜色设置这块WinCC的C脚本里调用RGB(255,0,0)返回的是一个OLE长整数直接用在控件属性上没问题但如果你把C脚本里的RGB返回值通过接口传给VBS脚本VBS拿到的是一串数字很多新手当字符串去处理然后报“类型不匹配”。这种混用脚本语言的情况后面排查章还会细说。3.3 把控件里的数据导出成文件在线表格控件运行起来后在控件上点右键菜单里会有一项“导出”或“Export”可以导成CSV或Excel格式。这个功能适合做临时数据拉取不适合做正式报表。导出时要注意一个坑控件导出的数据范围是“当前控件里加载的数据范围”而不是“运行库里的全部数据”。例如控件显示的是早上8点到10点的数据导出文件里就只有这个时间段。你想导昨天的数据必须先把控件的时间范围改到昨天再导出。用脚本改时间范围的做法也比较成熟。给画面加一个按钮按钮事件里写VBS脚本用Button.Click调用控件接口设置时间范围再把控件数据保存到文件。但接口参数在不同WinCC版本里略有差异抄网上代码时先确认版本WinCC 7.0和8.x的属性名不完全一样。我现在教你调试思路脚本写完不要直接上运行库先在控件组态窗口里把对象拖出来单独测试接口返回。3.4 画面与控件位置缩放和偏移的坑画面做大了以后运行时的显示偏移问题会冒出来。这里要提醒一句WinCC画面里的坐标在“运行系统”里会被缩放策略影响。如果设计时用1280乘1024做的画面现场显示器是1920乘1080画面不是等比例缩放所有控件会整体往右下偏移这就是大家常搜的“wincc画面整体往右偏移怎么调整”。解决办法是统一画面设计分辨率并在运行参数里设置好缩放模式或者干脆按现场显示器分辨率重新布局。另一个隐蔽的坑是画面里静态文本的“几何属性”里“位置X”如果被组态成了动态对象比如关联了一个变量或一个脚本返回值那么运行时文本会自己跑位看起来就像画面坏了。我就见过有人把标题文本的位置X动态连到一个看都不看的内部变量上画面一刷新标题跳到屏幕外边去。排查这种问题时逐个选中文案框在属性对话框里检查“位置X”是不是被动态化。还有尽量少用WinCC里的“组显示控件”来包一堆表格和趋势对象。这种控件确实能减少画面数量但它的句柄管理和层叠逻辑在跨画面切换时经常掉链子运行一段时间后子画面刷不出来得重新打开画面窗口才能恢复。对报表页面这种需要稳定输出的场景老老实实把控件铺在普通画面上不要为了画面缩略图好看去追求花样。4. 用VBS脚本Excel做自定义报表可以直接抄的模板4.1 为什么选VBS而不选C脚本WinCC支持C脚本和VBS脚本两种方式写逻辑。做报表我一律推荐VBS。原因很实在报表的核心动作是操作Excel文件创建对象、填充单元格、设置样式、另存文件这些在VBS里是原生支持的。C脚本虽然也能操作COM对象但语法原生不支持字符串日期格式化年、月、日要自己拼进位还得自己算。写复杂一点的日期计算时C脚本的代码量是VBS的三倍以上调试时间成倍增加。有人争论C脚本性能好但报表应用本身不是毫秒级的控制任务慢一两秒无人在意。在WinCC里做数据搬运和文件生成VBS是技术选型上更省力的选择。4.2 交接班快照报表读当前值写Excel交接班报表的需求很典型早班结束时统计当前产量、设备状态、温度压力均值生成一张表交给下个班。这段脚本可以直接抄保存为一个.bac文件不对WinCC里VBS直接写在按钮事件或全局脚本编辑器里。 交接班快照报表读取WinCC变量当前值写入Excel文件 Dim objExcel, objSheet, objTag(2), strFilePath 创建Excel对象不显示窗口以提高运行速度 Set objExcel CreateObject(Excel.Application) objExcel.Visible False 新建工作簿并取第一个工作表 Set objSheet objExcel.Workbooks.Add().Sheets(1) 从WinCC变量管理读取标签变量名按实际项目修改 Set objTag(0) HMIRuntime.Tags(produce_total) Set objTag(1) HMIRuntime.Tags(line1_speed) objTag(0).Read objTag(1).Read 填写报表内容 objSheet.Cells(1, 1) 交接班生产记录 objSheet.Cells(3, 1) 总产量 objSheet.Cells(3, 2) objTag(0).Value objSheet.Cells(4, 1) 一线速度 objSheet.Cells(4, 2) objTag(1).Value objSheet.Cells(6, 1) 制表时间 objSheet.Cells(6, 2) Now() 另存到固定路径文件名带日期方便追溯 strFilePath D:\reports\shift_report_ Year(Now) _ Month(Now) _ Day(Now) .xlsx objSheet.Parent.SaveAs strFilePath, 51 退出Excel释放资源 objExcel.Quit Set objSheet Nothing Set objExcel Nothing这段脚本的逻辑是先创建Excel对象用HMIRuntime.Tags(变量名)拿到WinCC运行库里的标签调用Read方法读取最新值再通过Cells(行, 列)写入Excel单元格。最后用带日期的文件名保存51表示xlsx格式。参数修改时注意几点。HMIRuntime.Tags里的名称必须是WinCC变量管理中的原始名称路径结构用点号或斜杠具体格式看项目里变量管理前缀写错会直接报“找不到标签”的错误。保存路径如果不存在程序不会自动创建文件夹会弹对话框挂在那里这个在批处理运行时要提前用文件系统对象创建目录。SaveAs的第二个参数51是Excel文件的枚举值如果需要兼容旧版Excel改成56就是xls格式。4.3 查历史归档用ADO连接WinCC数据库交接班报表只有当前快照不够很多时候需要查过去8小时的平均值或累计量。WinCC的历史数据存在归档数据库里报表脚本可以直连查询。下面这段是按时间范围查询归档值的模板 查询WinCC归档变量在指定时间段的历史数据写入Excel Dim objExcel, objSheet, objRS, objConn Dim strConn, strSQL, strStart, strEnd Dim i 设定查询时间范围过去8小时 strEnd Now() strStart DateAdd(h, -8, Now()) WinCC归档数据库连接串Catalog名按项目实际修改 strConn ProviderWinCCOLEDBProvider.1;CatalogCC_MyProject;Data Source.\WinCC SQL查询归档值表取时间大于起始值、小于结束值的数据 strSQL SELECT Value, DateTime FROM A2A_AI_R _ WHERE ValueName boiler_temp _ AND DateTime strStart _ AND DateTime strEnd ORDER BY DateTime 建立记录集并执行查询 Set objConn CreateObject(ADODB.Connection) objConn.Open strConn Set objRS objConn.Execute(strSQL) 数据写入Excel从第1行开始 Set objExcel CreateObject(Excel.Application) objExcel.Visible False Set objSheet objExcel.Workbooks.Add().Sheets(1) objSheet.Cells(1, 1) 时间 objSheet.Cells(1, 2) 锅炉温度 i 2 Do While Not objRS.EOF objSheet.Cells(i, 1) objRS.Fields(DateTime).Value objSheet.Cells(i, 2) objRS.Fields(Value).Value objRS.MoveNext i i 1 Loop objSheet.Parent.SaveAs D:\reports\history.xlsx, 51 objExcel.Quit Set objRS Nothing Set objConn Nothing这段脚本的核心是连接串和SQL语句。ProviderWinCCOLEDBProvider.1是WinCC历史数据库的标准OLE DB提供程序Catalog是项目运行时数据库名称一般以CC_开头后接项目名。Data Source是SQL Server实例名WinCC常见的是本机默认实例。A2A_AI_R是WinCC里模拟量归档值的常见表名前面加A2A_前缀的是归档系统表AI表示模拟量输入R表示原始值。查询时ValueName字段对应变量名DateTime字段存时间戳。各个WinCC版本的归档表结构有细微差异我用这个写法在7.x上用得很熟但如果你用的版本比较新先用数据库管理工具确认一下表名再跑不要盲抄。需要说明一点连接串里的Catalog名在不同项目中不一样这个不是玄学是每个项目创建时由WinCC分配的。不知道具体库名时在SQL Server管理工具里看WinCC运行实例下的数据库列表找到CC_项目名那个。查询时报“列出表名时出错”或“未找到表”多半就是Catalog名或表名写错。4.4 脚本挂在哪按钮、触发器和全局脚本写好的VBS脚本存放位置决定它什么时候跑。最基础的做法是放在画面按钮的“鼠标点击”事件里操作员点一下出一张表。这种方式适合交接班报表这种有明确操作节点的场景。但日报、月报不能靠人点按钮。这时候要用全局脚本GlobalScript把报表逻辑写进“全局脚本”编辑器里的一个函数模块然后创建触发器让它每天固定时间执行。触发器设置里选“定时器”周期填一天时间填生产要求的时刻比如每天23:55自动出日报。全局脚本里直接用Excel对象时要注意如果objExcel.Visible False但代码里某处写了objExcel.Visible True报表会在服务器桌面上突然弹出一个Excel窗口用远程桌面的工程师能看见。所以自动运行脚本里不要加任何显示Excel的操作。还有一个细节很多人忽略objExcel.Quit之前一定要objSheet.Parent.SaveAs保存否则数据全丢。WinCC全局脚本的异常不会弹出明显提示只在诊断窗口记录所以脚本里建议用On Error Resume Next配合错误标志变量把失败信息写到一个日志文件里方便第二天排查。报表脚本没人盯着跑日志是这个黑匣子里唯一的后悔药。5. WinCC报表高频问题排查五条脚踩过的坑5.1 VBS脚本报“语句未结束”现象脚本复制到WinCC脚本编辑器后点编译直接报错提示“语句未结束”错误行指向某条中间不相关的语句。原因绝大多数情况是字符串拼接处出了问题。WinCC的VBS编辑器对换行符很敏感一个字符串在代码里被硬折成两行中间没有续行符编译器就会认为语句提前结束了。另外还有一种常见情况从网页或Word里复制代码时引号被自动转成了中文引号编辑器完全不认直接判定语句断裂。解决先按CtrlJ检查当前脚本的缩进和格式。然后逐个检查字符串常量把中文引号替换成英文引号。涉及跨行拼接的字符串行尾加_续行符下一行继续写。代码写完后先保存到本地txt文件再用WinCC编辑器打开不要直接粘贴能避掉大部分格式问题。5.2 查不到历史数据归档根本没开启现象表格控件和SQL查询都试了返回结果为空连个报错都不给。原因八成是变量没有启用记录功能。WinCC不是所有变量都会自动存历史必须在变量管理的变量属性里勾选“记录”并设置采集周期。新项目最容易漏掉这个配置画面能显示实时值但报表查什么都没有。解决打开变量管理找到报表里要用的变量右键属性确认“记录”选项已激活采集周期按实际需要设置比如1秒、5秒或1分钟。改完配置后重新激活项目注意归档是在运行库启动后才写入的改完归档设置后查不到重启前数据这是正常的。校验的方法也简单运行系统后等待几分钟打开在线表格控件看有没有数值刷进来。5.3 报表Excel里中文乱码现象VBS写进Excel的单元格内容全部是乱码数字正常中文崩溃。原因HMI运行时读取的字符串编码和Excel默认编码不一致特别是通过ADO查询SQL Server数据库时从objRS.Fields(DateTime).Value这类字段读出来的中文在写入前没有做编码转换。解决在读取字段后、写入Excel前加一行强制转换用CStr()包裹字段值。对通过COM对象写入Excel的字符串还要在创建Excel对象后设置objExcel.DisplayAlerts False某些版本连对话框弹出都会影响编码。如果乱码出现在已经保存的文件里检查保存的格式参数和系统区域设置是否一致。WinCC工程服务器的区域语言和操作员站不一致也容易出这类问题统一系统区域设置能从根本上避免。5.4 连接归档数据库报“握手错误”现象用ADO连接WinCC数据库时报错信息里带“握手错误”或“无法建立连接”也有的是“提供程序无法初始化”。原因WinCC的归档数据库由WinCC运行时服务控制服务没起来、运行库没激活、或者数据库被占用外部连接都会失败。尤其常见的情形是调试时在WinCC项目编辑器里编辑运行库没有启动然后脚本里直接执行ADO连接字符串数据库根本没有服务在监听握手自然失败。解决先确认“运行系统”已激活再跑报表脚本。如果是自动报表务必在全局脚本里加一个前置判断先检查WinCC运行系统是否处于运行状态再执行数据库连接。还有一种情况是WinCC运行库未正常退出导致数据库连接没有释放重启WinCC项目或者重启工程站即可恢复。用SQL Server管理工具手动连接同一个库能测出来到底是服务问题还是访问权限问题。5.5 画面整体偏移控件运行后自己跑位现象报表画面运行后整体往右下偏移或者某个标题文本在运行过程中突然跳到画面外。原因画面设计分辨率和运行客户端分辨率不一致缩放策略选错。关于WinCC画面偏移问题的搜索热度一直不低说明这属于现场高频翻车。另外文本位置X/Y被组态成了动态属性运行中由脚本或变量驱动导致它自己跑路。解决打开画面属性检查缩放模式建议按主流显示器分辨率定设计基线1280乘1024相对保险。勾选“保持纵横比”或“全屏拉伸”前先在测试机上用目标分辨率验证。静态文本的“位置X”属性在属性窗口右侧检查是否被动态化如果是删除动态链接。报表页面这种固定布局页面所有坐标都用静态值不要做动态位置这是最稳的做法。6. 报表进阶定时自动生成、导出PDF与Web查看做到定时自动生成这一步报表方案才算成熟。前面交接班的报表是操作员点按钮触发的日报月报要能在固定时刻自己跑完并把文件存到服务器共享目录。这个自动化要分两步第一步把报表脚本整理成一个独立的全局脚本子例程第二步挂一个定时触发器。定时触发器的写法比较直接在全局脚本里新建项目函数把第4章的VBS代码放进去然后在“触发器”页添加一个时间驱动的触发器周期选“每天”时间写23:55。脚本末尾建议把Excel另存为PDF方便流转和签字 报表生成后自动另存为PDF文件名带日期 strPdfPath D:\reports\daily_report_ Year(Now) _ Month(Now) _ Day(Now) .pdf objSheet.Parent.ExportAsFixedFormat 0, strPdfPathExportAsFixedFormat的0表示导出类型为PDF第二个参数是输出路径。注意导出PDF前Excel对象必须完成所有数据的写入而且不关闭工作簿所以这段要放在objExcel.Quit之前。PDF文件比xlsx更容易在移动端看现场发到群里也不怕被改错。Web查看的需求也在变多。WinCC自带Web Publishing工具可以把画面发布到网页报表画面只要包含在线表格控件和趋势控件发布后同样可以从浏览器访问。这种方案胜在免安装客户端适合给不常驻中控室的管理层远程看数据缺点是画面交互不如本地流畅不能操作脚本按钮。需要真正开放报表数据接口的现场常见做法是再用OPC UA把WinCC作为数据服务器接出来给独立报表平台消费WinCC侧只负责数据源排版交给专门的报表系统。验证这一步不要省。脚本上线前先在运行库里手动跑一次核对三件事时间范围正确不跨天错位、变量和现场值对得上、文件落盘路径没有覆盖前一天的文件。养成这个习惯后我给客户交报表脚本基本不会翻车。自动跑定时表最怕的就是第一周没人发现文件满了把磁盘撑爆所以脚本开头记一行日志到txt文件里时间、文件大小都记上隔天看一眼日志比什么都强。希望帮到你。本文还有配套的精品资源点击获取
返回列表