ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

组态王报表系统开发实战:从数据词典到SQL查询的完整数据链路

组态王报表系统开发实战:从数据词典到SQL查询的完整数据链路 简介组态王软件详细教程第七讲报表系统是一份面向工业自动化监控与组态王初学者的实操型文档重点解决实时数据报表与历史数据报表的制作难题。资源共一个文档文件压缩包大小约9.92兆字节内容完整便于按章节查阅。文档从报表窗口绘制、单元格合并、表头格式设置讲起逐步演示日期时间函数、实时变量引用、数据改变命令语言以及报表保存、打印等常用操作同时针对历史报表查询、统计分析和模板复用进行了说明并补充常用报表函数与电子表格软件输出方法。文档特别强调以等号开头输入函数或变量、通过报表模板避免重复工作等细节并附有常用报表函数的用途说明方便读者直接套用。已有113人学习过该文档适合需要快速上手组态王报表系统、提升生产数据管理能力的工程人员使用可据此高效生成反映生产过程的详细报表为生产监控、数据留存与流程优化提供直接支撑。1. 组态王报表系统它不是表格而是一套要提前规划的数据流接手过几套老工厂的组态项目后你会发现一个规律组态王(KingView)项目里最容易被业主挑毛病的不是画面漂不漂亮而是“报表到底能不能按我想要的格式导出来”。第八讲点名“报表系统”讲的就是组态王里最容易被当成“画个表格”但其实是一整套数据链路的东西。很多人从组态王6.60sp4下载安装教程开始学最后卡在报表上就是因为把报表理解成了一张静态的表格而不是一条从数据采集到历史存储再到查询输出的流水线。这篇教程按我自己的落地经验来写先讲清楚报表系统的数据从哪来、存到哪再讲怎么在组态王里搭一张能用的报表最后把最常见的坑一次性说透。不管你是刚装完组态王还在翻安装教程的新手还是已经在用图库画画面、准备补上报表这块的老手照着做都能跑通。2. 报表的数据从哪里来数据词典、历史库和查询参数的三角关系2.1 报表系统不是“画表格”而是“查数据”我第一次做组态王报表时也犯过这个错在画面里拖了个报表控件直接在单元格里写变量名。画面一跑起来数字确实在动但一保存、一打印啥都没有。后来才想明白组态王的报表系统分成两层一层是“实时数据报表”画面上直接看当前值另一层是“历史数据报表”把变量历史库里存的记录按条件捞出来展示或导出。这就是第八讲标题里“报表系统”四个字的真正含义——你搭的是数据流的后半段。数据流的源头是数据词典。你在数据词典里建的每一个I/O变量、内存变量都是报表系统的基础原料。变量建好后还必须勾上“记录”属性历史库才会存它的数据。很多人报表查不到数90%是因为变量没勾记录、或者记录死区设得不对。这块后面避坑章节会专门展开这里先记住一个结论报表系统的第一道工序不在报表控件里而是在数据词典里。常见做法是把变量按信号来源分组来自PLC的模拟量、开关量、中间计算量各建一组每组统一设置记录属性。这样后面建历史报表时按变量组查询特别方便不用一个个去勾。2.2 数据词典里的记录属性报表系统的地基在组态王工程浏览器左侧树里找到“数据库→数据词典”双击任意一个变量看到“记录”和“安全区”两项这就是报表数据的开关。我一般会建议凡是现场需要追溯的工艺参数全部打开历史记录临时变量、中间变量一律不记否则历史库文件膨胀得很快。记录属性还有一个更细的选项叫“记录死区”。它的含义是只有当变量变化超过这个范围时才写一条记录。比如温度在±0.5度内抖动你设了0.5的死区那这层抖动就不会被记录下来。这个参数直接影响报表数据量的大小和历史曲线的平滑度。新人容易把死区设成0觉得“记全才准确”结果历史库以肉眼可见的速度膨胀报表查询也越来越卡。我通常按变送器精度来定变送器精度0.5%死区就给0.5%对应的工程值再去掉零漂就差不多了。变量记录属性调整完别忘了一个动作在组态王运行系统里执行一次“历史数据压缩”。这个功能在工程浏览器的“数据库→历史数据管理”里能手动把冗余的历史数据压缩合并。很多老项目跑了一年才发现历史库文件巨大一查全是抖动记录就是这个环节省掉了。做报表系统前先把这个地基打牢。分组做法参考下表变量分组典型对象记录属性死区建议工艺模拟量温度、压力、流量开启按变送器精度折算设备状态电机启停、阀门开到位开启0开关量没有死区概念中间计算量累加值、效率计算关闭不记录操作指令手自动切换、设定值开启02.3 历史数据存储路径与容量估算报表系统要历史数据历史数据要存盘。组态王默认历史库是放在工程目录下的以二进制文件形式存在。老手一般会建议把历史库存到单独的盘符比如D盘专门开一个KingviewData目录避免C盘满了报表直接“黑匣子”般停摆。估算容量有个粗公式一天的数据量 ≈ 变量总数 × 记录次数 × 单条记录字节数。单个变量的单条记录大概是32字节左右记录次数取决于采集周期和死区。举例现场有200个变量采集周期1秒死区设得不离谱一天大概就是200×86400×32 ≈ 553MB听着吓人但很多数据会被死区过滤掉实际通常不到这个量的三分之一。不过你还是按峰值去预留磁盘空间比较稳。存储路径的设置在工程浏览器的“系统配置→历史数据”里可以指定历史库文件目录、单个文件大小上限、保存天数。保存天数一般按业主需求定报表要求追溯一年就留一年的量多留等于浪费磁盘。做这套规划时顺手把路径记下来后面排查报表查不到数据、或查询极慢时第一步就是去这个目录看文件在不在、大小是否异常。3. 在组态王里搭一张能用的实时报表控件属性和数据绑定3.1 新建画面并拖入报表控件确认数据词典和历史库配置到位后开始搭画面。在工程浏览器左侧“画面”上右键新建一幅画面命名“生产报表”。然后在工具箱中找到“报表”控件拖到画布上。常用的报表控件有两个选择一个是老版本的“KingView报表”另一个是支持Excel模板的报表控件。新项目我一般用后者因为它可以直接绑定Excel模板导出格式和打印格式完全可控。拖入报表控件后会弹出一个属性页里面有几样必须设置。“报表名称”是内部引用名方便脚本调用“背景色”“网格线”这些是外观一般保持默认“加载Excel模板”要看你是否准备做固定格式报表。如果只是临时看看数据不选模板也行但如果业主说“报表格式必须跟以前的一样”那就需要先做模板再绑定。组态王图库里其实也内置了一些报表示例画面从图库管理器里可以拖出来看结构。我见过不少人打开图库发现里面已经有现成报表画面直接在它基础上改数据源省了不少事。但图库里的东西是通用模板变量名、数据源、行列格式都要重新设置别指望拖进来就是成品。报表控件拖到画面上后旁边一般会有“数据源”设置按钮。点击进去可以看到绑定的是实时数据库还是历史数据库。实时报表选“实时数据库”历史报表选“历史数据库”。这一步选错报表要么不动、要么查不出数据是最常见的低级错误。选完数据源后还有一行“变量名”需要填写可以直接点旁边的浏览按钮从数据词典里选变量比手敲变量名更不容易写错。3.2 实时报表的单元格绑定全局变量 vs 关联变量实时报表最常见的做法是让每个单元格绑定一个变量。在报表控件的属性对话框里找到“单元格绑定”可以逐个绑定变量名和刷新周期。我一般把刷新周期设成与PLC采集周期一致比如PLC扫描周期250ms报表刷新也设250ms没必要更快。设得比采集周期还快不会拿到新数据反而白白占CPU。绑定变量的一个细节是“是否启用历史记录关联”。如果报表只显示当前值不用勾如果要求单元格上面显示当前值、同时在旁边显示历史趋势那就要开启这个关联。开启后单元格里可以引用到该变量过去1小时、过去24小时的平均值、最大值、最小值等统计值。这些统计值在报表里展示时显示格式控制在小数位和单位上。我常用格式是整数位保留到千位再加一位小数单位单独占一列不和数值全部挤在同一格里打印出来干净不少。实时报表还有个“安全区”参数决定了谁能修改报表内容。如果是车间接线室里的显示画面一般设为无修改权限防止现场人员误操作把公式或绑定删掉。如果是工程师站的报表画面再开放修改权限。这个安全区是区域级别的跟用户管理里的优先级联动实际项目中经常有操作工不小心把报表模板改了、导致下白班的人看不到数据的翻车事故。设安全区就是给报表上一道锁。3.3 报表控件的行列操作与公式栏组态王的报表控件不是死表格行和列可以右击进行插入、删除、追加。典型的实时报表布局大概是第一列序号第二列变量描述第三列当前值第四列单位第五列变化趋势比如一小时内最大值。这些行列操作在实际项目中反复用到特别是把一张“交接班报表”做成“每班一行数据、一天24行”时行列的复制、追加是高频动作。在单元格里写公式也是常见需求比如计算“本小时累计产量”公式栏里的语法是常规算术表达式和统计函数混用。公式可以引用其他单元格比如C5单元格是本班产量D5是效率E5写C5*D5。注意公式里引用的单元格坐标如果上面插入了一行公式里的坐标不会自动调整这是所有电子表格的通病——不是组态王独有但值班的人不会去调公式恢复起来很痛苦。所以做完报表后我习惯把公式写在最后一行不夹在中间数据行里。做完一张实时报表后经验上是先跑20分钟观察刷新是否正常别等下班了发现报表整屏都是“0”或“####”。出现####通常是列宽不够好解决全是0就要检查变量绑定和数据词典里的变量名是否匹配了。4. 历史报表到SQL查询把报表系统接入数据库的落地写法4.1 组态王历史查询的两种渠道自带查询与SQL访问组态王历史报表系统有两条查询路径一条是组态王自带的“历史数据浏览器”直接在画面里指定起止时间然后查某个变量在某段时间的历史记录另一条是“SQL访问管理器”把历史数据写入外部数据库SQL Server、MySQL等再用自己的查询页面或外部报表工具去做复杂查询。我一般按需求场景选路径只需要把一段时间的数据拉出来看用前者需要做复杂统计、多条件查询、跟第三方系统对接就必须用后者。比如业主每月要做一次产量汇总按班组、按产品型号分别汇总这种查询条件在组态王自带浏览器里很难写反而是一段SQL语句的事。这也是“第七讲”里报表系统最接近“系统”二字的部分——你不能只靠画面上那张表要让数据流出去。SQL访问管理器的启用位置在工程浏览器的“SQL访问管理器”下主要做两件事定义“表格模板”建好外部数据表的结构建立“记录体”把组态王变量跟数据表字段做映射。这个组合就相当于告诉组态王哪个变量写入哪一列以什么类型存。很多项目报表因为记录体字段类型和数据库字段不匹配写入失败所以类型映射要在建表的时候对标好。4.2 建数据库表并映射变量的具体步骤先去数据库中建好目标表。以SQL Server为例建一张“HourlyReport”表字段包括采集时间、设备编号、产量、温度、压力、状态。CREATE TABLE HourlyReport ( id INT IDENTITY(1,1) PRIMARY KEY, RecordTime DATETIME NOT NULL, DeviceNo VARCHAR(20), Output DECIMAL(10,2), Temperature DECIMAL(8,2), Pressure DECIMAL(8,2), Status INT );这段SQL建了一张小时报表表。id用自增整数每条记录进去自动编号后续报表循环或外部工具读这张表会很方便RecordTime用DATETIME保存采集时间Output是产量用DECIMAL(10,2)保留两位小数Temperature和Pressure同理按量程决定精度Status用INT保存设备状态码比如1运行、0停机比直接存中文字符串省空间查询起来也快。表建好后在组态王SQL访问管理器里新建“记录体”将DeviceNo对应数据词典里的“\本站点\设备编号”Output对应“\本站点\产量”Temperature对应“\本站点\温度”依此类推。这里有一个关键点记录体里的字段名和SQL Server表里的字段名必须完全一致大小写可以不同但拼写不能差。而且组态王的记录体里字段顺序不重要名字对应才重要很多人栽在这里。4.3 用脚本定时写入INSERT语句与时间条件数据从变量映射到数据库表需要脚本在背后周期执行。常见做法是在组态王里建一个定时事件每到整点触发一次写入。写入脚本的写法类似于这样// 先connect再执行insert SQLConnect(SQLConnectID, ProviderSQLOLEDB.1;Persist Security InfoTrue;User IDsa;Password123456;Initial CatalogKingviewDB;Data Source192.168.1.10); // 往记录体里更新当前变量值 \\本站点\产量 HourlyOutput; \\本站点\温度 CurrentTemp; // 执行插入 SQLInsert(SQLConnectID, HourlyReport, HourlyReportRecord);这段脚本做了三件事SQLConnect建立到数据库的长连接注意连接字符串里的Initial Catalog是数据库名Data Source是数据库服务器IP然后两行赋值是给记录体的变量赋当前值注意记录体绑定的是变量不是数值所以要先给变量赋值最后SQLInsert把记录体里所有字段按映射关系插入到HourlyReport表。SQLConnectID是一个整数型变量用于标识连接句柄脚本执行前要在数据词典里定义好。HourlyReportRecord是你在SQL访问管理器里建的记录体名称大小写要完全一致。这个脚本放在“应用程序命令语言”里事件触发选“时间”执行周期按需求设为1小时或1天。脚本里连接的数据库如果是远程的连接串里的Password按明文写存在工程文件里。这个位置安全性一般但组态王本身没有加密的存放方式所以工程文件要按公司资料管起来别随便拷贝。数据库连接不稳定时SQLConnect失败返回负值可以通过判断SQLConnectID 0去弹窗提示值班人员别让数据悄悄断流。断流后无人发现是最令人火大的报表事故。4.4 历史报表导出Excel两种导出方式的边界一个常见的需求是把查询到的历史报表导出成Excel。组态王里有两种做法一种是用报表控件自带的导出功能右击报表区域选择“导出”生成Excel文件另一种是自己写脚本通过OLE调用Excel对象把报表数据逐行写到Excel里。报表控件自带的导出适合简单场景数据量不大格式只要一个表格导出后人工再做微调。但它有个边界导出列数受控件网格列数限制而且不会带上你预先做好的模板表头导出来通常是一张“白表”需要二次加工。因此如果你的报表有固定的企业表头、签字栏建议用第二种方式把Excel模板做好脚本只负责把数据填到模板指定的单元格。写OLE脚本调用Excel有一点要特别注意Excel进程在调用后必须释放否则每次导出都会在服务器上留下一个看不见的Excel进程几十次下来服务器变“乌龟”。具体写法上脚本结束前要ReleaseObject掉工作簿和Excel对象再杀进程。这个坑在老项目中反复出现属于典型的“导出功能很爽导出十几次后系统卡死”型问题。5. 报表系统避坑指南现象、原因、解决5.1 现象报表查不出历史数据画面一片空白这个现象排在报表问题第一位。画面是空的没有报错历史报表查指定时间段也没有数据返回。原因是多方面的但最常见的是变量在数据词典里没勾“历史记录”或者勾了之后工程没有重新编译运行。有时改完变量属性直接切到运行状态组态王运行系统加载的是上一次编译的结果新设置没生效。解决步骤很直接回到工程浏览器逐一检查数据词典里相关变量的记录属性然后关闭运行系统重新从工程浏览器“文件→全部编译”编译一次再进入运行系统。如果这样还查不到去历史库存放目录看文件是否新增。文件没增长说明变量写历史库本身就没成功这就不是报表的问题要回到变量属性和采集驱动上去排查。5.2 现象报表显示很多“0”或固定不变的值报表有显示但数值不对一直是0或者一直停在某个值上不动。原因是变量绑错了。有些内部变量名在数据词典里被删掉又重建报表控件里还是旧引用页面显示为0。另一种是变量本身采集成功但工程值转换设置不对原始值明明是6400工程值是0到100你直接在报表里显示原始值看起来就像固定的量程底数。解决方式是检查数据词典里变量的“最小值/最大值”“初始值”设置确认采集进来的原始值可以被正确转换成工程值。然后在报表控件里重新绑定变量名而不是“信任”之前那个看起来对的名字。绑定后临时加一个显示原始值的单元格做对比可以快速确定是转换问题还是采集问题。5.3 现象时间段的报表查询特别慢像卡住了一样报表能查但一等就是几十秒查一次卡一次。有时候还会把运行系统界面搞到“无响应”状态。原因是历史数据没压缩、文件过大且查询时段跨得太宽。举个例子查一整年的数据即便只有少量变量查询也要扫描一整年的记录文件。如果变量死区设为0这个文件体积还会成倍放大查询就不只是慢而是几乎不可用。解决方式分两步第一步在历史数据管理里做“数据压缩”把冗余点压掉再看查询用时有没有下降第二步优化查询粒度不要让用户一次性拉整年数据。界面上做查询条件控制默认查当天可选最近7天最多30天按天分页翻。这一条是通用经验不管用什么组态软件做历史报表查询时间段都得限制。5.4 现象SQL写入失败运行日志提示字段不匹配用SQL访问管理器做外部数据库写入时运行时提示字段类型或名称不匹配。原因通常是记录体字段与数据库表字段不一致要么拼写差了一个字母要么类型不一致。比如组态王变量是实数数据库字段却建成了INT组态王写入时就会失败。很多时候改字段名字做到一半两边的名字查起来费劲最终就在某个下划线处栽了。解决方式是导出数据库表结构逐字段对照记录体列表去查。养成一个固定习惯给记录体写一个固定命名规则字段用“小写下划线”数据库建表也用同一套规则两边一致。建好后不要轻易改名因为SQLInsert脚本里的记录体名称和表名都写死在脚本里改一个就要全部同步最容易漏。5.5 现象报表导出Excel后表头是斜的或列宽乱掉导出Excel后内容对但格式难看表头不居中、列宽很窄。多次导出还会出现列错位。原因是报表控件自带的导出功能不经过模板是直接把网格内容搬过去。网格里的列宽、合并单元格信息在导出时丢失或转换不完整。尤其是合并过单元格的表头导出到Excel里经常变成跨列不对。解决方式是用Excel模板方案在Excel里做好表头、列宽、边框、打印区域再在组态王报表控件里加载这个模板文件然后只绑定数据区域。这样导出时的效果等于“填表”而不是“重建表格”格式永远稳定。这个方案多花的时间不超过十分钟但是后面每月的报表整理都能省下半小时值得。6. 用报表模板和自动导出把系统做到位验证思路与最后一个习惯报表系统做到能查、能写、能导出之后最后一个关键环节是验证。“能打开看”不等于“报表系统正常”。我一般会把验证拆成三块准确性验证、完整性验证、时效性验证。准确性验证是拿一个已知数值的变量做测试比如手动给一个内存变量赋一个固定值然后在报表里看显示是否一致。这可以用来排除绑定和转换参数的问题。完整性验证是把报表导出的Excel跟历史数据库里的原始记录做抽样比对看行数和关键字段是否对得上。时效性验证是监控从变量变化到报表显示之间的延迟这个延迟如果超过两个采集周期就要查是不是报表刷新周期设得太长或者SQL写入频率太低。最后一个习惯是关于模板的Excel报表模板不要放在工程目录下因为工程目录会被组态王的备份功能整个打包工程文件一大模板被覆盖、被误改的情况时有发生。我习惯在D盘固定一个“ReportTemplate”目录模板命名带版本号比如交接班报表_v3.xls每改一次就另存一个新版本旧版本不删。这样如果新版模板做坏了还能快速退回去。这个“保留旧版本”的习惯在组态项目里特别管用因为业主的需求总是在变模板永远在改没有后悔药吃。组态王报表系统从数据词典到历史库再到报表控件和SQL数据库是一条完整的数据链路。任何一个环节断了报表都出不来。但这个系统好在设计逻辑是统一的理解了数据从哪来、怎么存、怎么取剩下的就是在组态王里把这些环节一一落实。我做过的项目里报表系统一直是业主验收时最关注的模块之一也是最容易出问题的模块。每一个坑都是从前一个项目里带出来的血泪经验希望这篇能帮你少走一段弯路把报表系统从“能画出来”做到“能稳定用起来”希望帮到你。本文还有配套的精品资源点击获取
返回列表