资讯动态

WINCC SQL报表查询方案:VBScript实现日报表数据采集与展示

发布时间:2026/10/30 5:15:16 来源:尧图企业网站定制
简介这份文档面向已具备WinCC组态基础、希望打通SQL报表查询链路的工控技术人员围绕VBScript脚本与ActiveX控件在SIMATIC WinCC中的应用展开重点解决生产数据写入数据库、按日期查询并在画面中展示与打印的问题。压缩包仅含1个doc文件大小约1.11MB内容以操作说明、画面组态要点和脚本示例为主便于集中查阅与对照实践。文档覆盖SQL Server 2005建库建表、WinCC全局脚本写入记录、MSFlexGrid与MS DTPicker控件配置以及“查询”“打印”按钮的VBS实现并附写入和查询SQL数据的代码附录可帮助读者理解从数据采集到报表输出的完整流程。目前已有1682人学习适合需要参考WinCC SQL报表搭建思路与脚本写法的读者。1. 从手抄日报到一键查询这套 WINCC SQL 报表方案解决什么问题某条产线的操作工每班结束要手抄三个数——CPU 负载、内存占用、硬盘余量——抄在纸质日报上班组长再录进表格。画面上的数在实时跳动但没人能按天把它拉出来。这套基于 VBScript 和控件实现的 WINCC SQL 报表查询方案解决的就是“画面有数、报表没数”这件事WINCC 全局脚本周期把变量写进 SQL 表日报表画面上的 MSFlexGrid 和 MS DTPicker 负责选日期、显示结果查询和打印都由 VBS 脚本驱动。它适合正在做上位机报表课设、毕设或者现场需要补一套轻量日报表的人。下面按数据链路、画面组态、脚本实现、排查、验收的顺序拆开讲每一段都落到能直接改的参数和代码上。2. 数据链路设计从 WINCC 变量到 SQL 表的三段式结构2.1 报表表结构四个字段先定死先说表。原文写入脚本里表叫 VBSReport字段是 time、cpu、ram、hd查询脚本里表叫 report字段是 shijian、cpu、ram、harddisk。同一个项目里两套命名是后面“查不到数据”的第一大来源。我一般会在动手写脚本之前先把库名、表名、字段名写成一张对照表贴在项目边上后面所有脚本只认这一份。建表语句通常这样写-- 报表主表一条记录对应一次采样 CREATE TABLE Report ( shijian DATETIME NOT NULL, -- 采样时刻写入时取 Now cpu FLOAT NULL, -- CPU 占用率单位 % ram FLOAT NULL, -- 内存占用率单位 % harddisk FLOAT NULL -- 硬盘占用率单位 % );字段类型的选择有讲究。时间用 DATETIME 而不是 VARCHARBETWEEN 比较才能走索引也免得字符串排序把“10 点”排到“9 点”前面三个指标用 FLOAT现场变量可能是整型也可能是浮点FLOAT 兜得住。按一天 1440 条、一年五十多万条估算给 shijian 建一个非聚集索引按天查询的响应基本在毫秒级CREATE INDEX IX_Report_shijian ON Report(shijian);提示库名建议统一叫 SQL-Report别在写入脚本里写一个、查询脚本里写另一个。原文示例里出现的 Example-report 就是典型的手滑查半天查不出数据最后发现连的是另一个库。建库操作本身不复杂打开 SQL Server Management Studio 连上实例Databases 右键 New Database名字填 SQL-Report展开库Tables 右键 New Table按上面的字段填 Column Name 和 Data Type保存时给表名 Report。库和表建完再回 WINCC 写全局脚本。2.2 全局脚本写入ADO 连接与 INSERTWINCC 的全局脚本挂在项目树下的 Global Script 里新建一个 VBS 动作函数名保持 action。下面这段是写入链路的核心 WINCC 全局脚本周期把三个变量写入 SQL 报表表 Option Explicit Function action Dim a, b, c, d Dim strcn, cn, is_SQL a Now 采样时间 b HMIRuntime.Tags(cpu).Read CPU 占用率 c HMIRuntime.Tags(ram).Read 内存占用率 d HMIRuntime.Tags(hd).Read 硬盘占用率 strcn ProviderSQLOLEDB.1;Integrated SecuritySSPI; _ Persist Security InfoFalse; _ Initial CatalogSQL-Report;Data Source.\wincc Set cn CreateObject(ADODB.Connection) cn.ConnectionString strcn cn.Open is_SQL INSERT INTO Report(shijian, cpu, ram, harddisk) VALUES( _ a , b , c , d ) cn.Execute is_SQL cn.Close Set cn Nothing End Function连接字符串四段各管一件事Provider 指定 SQLOLEDBIntegrated SecuritySSPI 表示用 Windows 账户验证不写用户名密码Initial Catalog 是库名Data Source 里的.\wincc是实例名默认实例可以直接写机器名或一个点。HMIRuntime.Tags(cpu).Read 读的是 WINCC 变量管理器里建好的内部变量名字必须和变量表里一字不差多一个空格都读不到。日期拼接这里有个细节值得单独说。Now 转成字符串会跟着操作系统区域设置走如果现场是中文日期格式拼进 SQL 可能变成“2024/5/6 10:00:00”SQL Server 一般能认但不保险。稳妥的做法是显式格式化后再拼Dim ts ts Year(a) - Right(0 Month(a), 2) - Right(0 Day(a), 2) _ Right(0 Hour(a), 2) : Right(0 Minute(a), 2) : Right(0 Second(a), 2)多写三行省掉后面排查日期格式的时间。写入失败的处理也别省cn.Execute抛错会直接中断脚本可以在外面包一层On Error Resume Next把错误码写进一个 WINCC 内部变量画面上做个报警灯比事后翻日志快得多。2.3 触发周期写多密才算合适全局脚本建好后要挂触发器。WINCC 的全局脚本触发器可以按周期、按变量变化、按事件报表场景一般用周期触发。周期怎么定看两个约束一是报表要什么粒度日报表只关心小时级趋势5 分钟足够二是数据库增长1 分钟一次一天 1440 条5 分钟一次一天 288 条一年差五倍。触发方式适用场景注意点周期触发1 分钟需要分钟级趋势数据量大索引要跟上周期触发5 分钟日报表、班报表推荐量级可控变量变化触发只在异常时记录容易漏采不适合连续报表事件触发按钮手动补录依赖操作不能作为主链路触发时间建议错开整点比如每 5 分钟的 30 秒触发避免多个脚本同时打数据库。写完脚本先别急着组态画面打开 SSMS 看一眼表里有没有新记录有记录说明写入链路通了没记录先查全局脚本的运行状态和触发器是否启用别去画面里找原因。3. 画面组态与控件落位MSFlexGrid 和 DTPicker 怎么装进画面3.1 控件注册regsvr32 两条命令先跑通原文提到直接在 ActiveX Controls 里选 Microsoft FlexGrid Control, Version 6.0 时如果机器上没装过 VB6控件可能不在列表里需要手工注册 MSFLXGRD.OCX。步骤是把 OCX 拷到系统目录然后在“开始→运行”里执行注册命令。32 位系统拷到 C:\WINDOWS\system3264 位系统要放到 SysWOW64否则注册了 WINCC 也认不到。regsvr32 MSFLXGRD.OCX regsvr32 /u MSFLXGRD.OCX第一条是注册弹“DllRegisterServer in MSFLXGRD.OCX succeeded”才算成功第二条带 /u 是反注册换版本或者卸载时用。注册报“模块加载失败”先确认文件位数和系统位数是否匹配再用管理员权限开命令窗口重试。DTPicker 对应的是 MSCOMCT2.OCX添加控件时选 Microsoft Date and Time Picker Control 6.0 (SP4)。两个控件都注册好之后在 WINCC 画面编辑器里右键 ActiveX Controls → Add/Remove把它们勾进列表再拖到画面上。控件列表里找不到的情况多半是注册表里没有这个 CLSID或者 WINCC 是以另一个用户身份跑的。换管理员账户登录再注册一次通常能解决。3.2 画面布局与控件命名项目结构一般是三个画面主画面做导航报表画面做汇总日报表画面做查询和表格。日报表画面上放两个 DTPicker、一个 MSFlexGrid、两个按钮。控件拖进去之后第一件事是改 Name 属性因为脚本里用 ScreenItems(名字) 取对象名字对不上脚本跑到那一行就报“对象不存在”。我习惯按功能命名不直接用默认的 DTPicker1、MSFlexGrid1。控件名类型作用关键属性Date1MS DTPicker起始日期Format 设为短日期Date2MS DTPicker结束日期Format 设为短日期MSFlexGrid1MSFlexGrid结果显示Cols5Rows 由脚本动态设btnQuery按钮触发查询OnClick 挂查询脚本btnPrint按钮导出打印OnClick 挂打印脚本MSFlexGrid 的外观属性不用在属性面板里一个个点画面初始化时用脚本设一次更清楚 画面打开时调用设定表格骨架查询脚本里只改内容 MSFlexGrid1.Cols 5 MSFlexGrid1.Rows 10 MSFlexGrid1.FixedCols 0 MSFlexGrid1.FixedRows 2 MSFlexGrid1.ColWidth(0) 900 MSFlexGrid1.ColWidth(1) 1900 MSFlexGrid1.ColWidth(2) 1000 MSFlexGrid1.ColWidth(3) 1000 MSFlexGrid1.ColWidth(4) 1100FixedRows2 表示前两行固定不随滚动消失第一行是合并后的标题第二行是列名。ColWidth 的单位是像素级序号列 900、时间列 1900剩下的指标列各 1000 出头基本不用再横向滚动。3.3 变量绑定与画面切换WINCC 变量管理器里建三个内部变量cpu、ram、hd类型选浮点和全局脚本里 HMIRuntime.Tags 读的名字保持一致。如果现场是从 PLC 采上来的这里可以换成外部变量全局脚本不用改。变量类型别随手选成整型现场 CPU 占用率经常带小数整型会把小数截掉报表上看着像少了精度。画面切换用按钮的鼠标单击事件挂 OpenPicture或者组态画面窗口。日报表画面建议做成弹出式查询完关掉回主画面避免操作工在多个画面之间迷路。组态完先别写查询脚本先在画面上放一个临时按钮脚本里写一句 MsgBox Date1.Value点一下看能不能取到日期。取不到说明控件名或者控件本身有问题先解决这个再往下走比在几百行查询脚本里定位快。4. 查询与打印两条脚本把数据送上屏、送上纸4.1 时间参数组装与合法性校验DTPicker 的 Value 是日期型脚本里取年、月、日拼成字符串再补上时分秒Dim Date1, Date2 Dim By, Bm, Bd, Ny, Nm, Nd Dim BeginDate, EndDate Set Date1 ScreenItems(Date1) Set Date2 ScreenItems(Date2) By Year(Date1.Value): Bm Month(Date1.Value): Bd Day(Date1.Value) Ny Year(Date2.Value): Nm Month(Date2.Value): Nd Day(Date2.Value) BeginDate By - Bm - Bd 00:00:00 EndDate Ny - Nm - Nd 23:59:59 If By Ny Or (By Ny And Bm Nm) Or (By Ny And Bm Nm And Bd Nd) Then MsgBox 输入的时间不正确, vbOKOnly, 错误的起始时间 Exit Sub End If起始时间补 00:00:00、结束时间补 23:59:59BETWEEN 这个闭区间才能把当天的数据完整包进来。月份和日期不补零也能被 SQL Server 识别但补零更稳遇到区域设置不同的机器不至于翻车。原文的校验只弹了 MsgBox 没有退出脚本会继续往下跑查一个起止倒序的区间结果为空还以为是数据问题——这个 Exit Sub 是必须加的。4.2 两条 SQL明细给表格聚合给统计行查询分两条一条拉明细给表格一条算最大、最小、平均给底部统计行。明细 SQL 里用 CONVERT 把时间转成 19 位字符串省得在 VBS 里再处理日期格式Dim Sql, Sql1 Sql SELECT CONVERT(char(19), shijian, 20) AS shijian, cpu, ram, harddisk _ FROM Report WHERE shijian BETWEEN BeginDate AND EndDate _ ORDER BY shijian Sql1 SELECT AVG(cpu) AS ylp, AVG(ram) AS wdp, AVG(harddisk) AS llp, _ MIN(cpu) AS ylx, MIN(ram) AS wdx, MIN(harddisk) AS llx, _ MAX(cpu) AS yld, MAX(ram) AS wdd, MAX(harddisk) AS lld _ FROM Report WHERE shijian BETWEEN BeginDate AND EndDate CONVERT(char(19), shijian, 20) 的输出格式是 yyyy-mm-dd hh:mi:ss20 是 ODBC 标准样式正好 19 个字符。BETWEEN 两端都包含配 00:00:00 和 23:59:59 覆盖一整天。连接和取数用 ADODBDim conn, oRs, oCom, oRs1, oCom1 Dim strcn strcn ProviderSQLOLEDB.1;Integrated SecuritySSPI; _ Persist Security InfoFalse;Initial CatalogSQL-Report;Data Source.\wincc Set conn CreateObject(ADODB.Connection) conn.ConnectionString strcn conn.CursorLocation 3 adUseClientRecordCount 才准 conn.Open Set oCom CreateObject(ADODB.Command) oCom.CommandType 1 Set oCom.ActiveConnection conn oCom.CommandText Sql Set oRs oCom.Execute Set oCom1 CreateObject(ADODB.Command) oCom1.CommandType 1 Set oCom1.ActiveConnection conn oCom1.CommandText Sql1 Set oRs1 oCom1.ExecuteCursorLocation 3 是关键服务端游标下 RecordCount 经常返回 -1表格行数就算错填到一半越界。聚合结果用本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑