
简介这是组态王软件教程系列中专讲报表系统的DOC文档适合工业自动化项目中的工程调试人员、组态画面开发者和需要制作数据报表的维护人员使用。文档以图文形式系统讲解了实时数据报表与历史数据报表的创建方法包括绘制报表框架、设计表头格式、调用日期时间函数、关联变量实时值以及通过报表函数实现查询、打印、页面设置等操作并涉及利用Excel输出历史报表的扩展思路。资源包共1个文件为DOC文档大小约9.92MB已有113人学习。通过学习本讲内容读者可以掌握从报表模板设计到历史数据检索输出的完整流程理解报表函数、变量引用和命令语言的关键用法有助于减少重复组态工作提高生产数据汇总与分析效率。1. 报表系统不是花架子组态王里生产数据出表的关键一步生产现场走到报表这一步往往是最不起眼又最容易翻车的环节。组态王画面里的按钮、趋势线、仪表盘看实时趋势没问题可到了交接班记录、日报统计、设备运行分析数据必须落到能打印、能回查、能导出的表里——这就是组态王报表系统要解决的事。本讲围绕内嵌报表从建表、显示实时值、按时间段回查历史到用EXCEL扩展输出的完整流程展开适合正在做上位机监控画面的工程人员也适合想把“手写记录本”换成电子报表的老项目改造。报表系统功能本身不复杂但控件名、单元格等号、历史变量记录这几个细节藏了不少坑值得一次讲透。2. 实时数据报表从画表格到显示实时值再到打印的完整链路2.1 报表窗口、控件名和行列定义进入组态王开发系统新建或打开一个画面工具箱里找到“报表窗口”工具——一个带网格线的表格图标。在画面合适位置拖出一个区域松开鼠标就生成一张默认报表。这张表现在还是一张空壳双击表格的灰色部分才能打开“报表设计”对话框。注意这里的双击位置是单元格区域外、没有网格线的空白处很多人第一次都点错位置双击单元格内部只会进入编辑状态。对话框里需要定义三个关键参数报表控件名、行数、列数。报表控件名我习惯填“实时数据报表”这个名字会在后面所有报表函数里作为参数反复出现行数填15、列数填6只是初始规模后续合并单元格、调行高列宽都不受这个数字限制。需要说明的是报表控件名不等于画面名称它只标识这张报表对象本身画面跳转用的是画面名两者别混用。参数填写建议说明报表控件名实时数据报表报表函数第一参数全工程唯一行数15初始行数可后续调整列数6初始列数可后续调整确认后画面里出现一张空表。从工程习惯上讲行列数先按业务需要的最大值估后面用超了再加行会麻烦报表格子看似简单等到数据填满再插行格式全乱。2.2 表头、日期时间与实时值的三种写法表头格式设置是报表设计的第一个实际操作。选中b1到e2这个区域报表工具箱上点“合并单元格”把四格合成一格然后输入“实时数据报表”。输入有两种方式选中合并区后在工具箱编辑框里打字再点“输入”按钮或者直接双击合并后的单元格进入编辑状态键入。接着点“设置单元格格式”弹出的对话框里数字选常规字体设成隶书、规则、一号、红色对齐方式水平垂直都选居中图案里给单元格加灰色底纹。这样表头既是标题也是画面里的视觉重点。日期时间这一格经常被漏掉。d3单元格双击输入“Date($年,$月,$日)”e3输入“Time($时,$分,$秒)”然后分别把这两个单元格的格式设成“日期(YYYY年MM月DD日)”和“时间(XX时XX分XX秒)”。这里的$年$月$日是组态王的系统时间参数运行时自动取当前日期不需要手动维护格式不设置的话函数返回的是一串数字读起来很别扭。实时值显示有三种思路。第一种是用数据改变命令语言这也是“实时”两个字的核心给变量建数据改变命令语言把最新值写进报表单元格。比如变量“原料油液位”变化时执行ReportSetCellValue( 实时数据报表, 4, 1, 原料油液位 );这一段代码的含义是找到名为“实时数据报表”的报表对象调用ReportSetCellValue函数把原料油液位的当前值写入第4行第1列单元格——也就是文档里说的a4。注意函数第一个参数是报表控件名而不是画面名写错就报“对象不存在”。催化剂液位、成品油液位按同样方法各建一条报表里a5、a6两格也就跟着刷新了。第二种是直接引用变量。在单元格里输入“原料油液位”以等号开头运行时会显示该变量的实时值。等号是触发符没有等号的话组态王会把这个输入当成普通字符串原样显示这是报表里最常见的“不刷新”翻车原因。第三种是用报表函数在命令语言里主动写值一般用在按钮触发、定时刷新这类场景。三种方式选哪种看场景数据改变命令语言适合高频变量实时刷新直接引用适合临时查看主动写值适合批量生成报表。2.3 保存成rtl文件和打印输出报表设计完成后要落盘。开发状态下报表工具箱上有个保存按钮点击后弹出保存对话框选好路径、输入文件名比如“实时数据报表.rtl”然后点保存。rtl是组态王报表文件格式下次要复用这张报表直接在相同位置加载即可。保存这一步很多人跳过结果重新打开工程发现报表打回原形。打印功能在运行画面里做。切到画面编辑状态放一个按钮文本改成“打印报表”双击按钮在“弹起时”命令语言里写ReportPrint2( 实时数据报表, 1 );这里两个参数第一个是报表控件名第二个是打印方式1表示运行到这一步直接送打印机0表示先弹打印对话框让操作人员确认。如果项目需要先预览再打印可以用ReportPrintSetup代替在预览界面里点打印。报表保存为rtl文件还有一个额外用处把通用表头保存成rtl相当于自制的报表模板下个画面先ReportLoad把半成品表加载进来再做数据绑定省去重画表头的时间。3. 历史数据报表查询按钮、时间参数与变量选择3.1 历史报表的表格设计复用实时报表的套路历史报表的表格设计和实时报表几乎一样工具箱里拖报表窗口双击灰色区域设置控件名、行列数合并单元格做表头设置字体底纹。唯一差别在数据来源——实时报表显示的是变量的当前值历史报表要按时间段把之前存下来的数据重新取出来显示。这里有一个前提容易被忽略组态王只有对勾选了“保存历史数据”的变量才记录历史库。如果变量没有勾选记录后面查询函数写得再对表格里也是空的。检查方法是打开变量定义对话框找到“记录和安全区”或“历史记录”相关选项确认已经勾上。老项目里经常遇到报表查不出数查到最后是变量压根没记录数据——这个坑在排障时优先级最高因为画面看起来一切正常按钮也生效了唯独数据是空的。3.2 查询按钮与ReportSetHistData参数历史报表查询的核心函数是ReportSetHistData。画面里放一个“报表查询”按钮在“弹起时”命令语言中调用它。常见写法是ReportSetHistData( 历史数据报表, HTConvertTime( 2024-01-01 08:00:00 ), HTConvertTime( 2024-01-01 16:00:00 ), 60, 催化剂液位 );这一行做了四件事指定报表对象“历史数据报表”把字符串时间转换成组态王能识别的时间整数作为起始时间再转一个结束时间以60秒为间隔查询变量“催化剂液位”把结果填入报表。需要说明的是HTConvertTime这类时间转换函数在不同版本里名称略有差异有的工程用StrToTime有的直接在对话框里填时间具体以《组态王函数速查手册》和当前版本在线帮助为准参数顺序、间隔单位秒一般不变。多个变量就多写几行依次查询ReportSetHistData( 历史数据报表, HTConvertTime( 2024-01-01 08:00:00 ), HTConvertTime( 2024-01-01 16:00:00 ), 60, 催化剂液位 ); ReportSetHistData( 历史数据报表, HTConvertTime( 2024-01-01 08:00:00 ), HTConvertTime( 2024-01-01 16:00:00 ), 60, 成品油液位 );这样两张变量表依次填进同一张报表催化剂液位在上半段成品油液位在下半段。查询间隔参数单位是秒写60就是每分钟一条记录写3600就是每小时一条记录。3.3 运行查询对话框起止时间、间隔和变量怎么配合运行组态王打开历史报表画面点“报表查询”按钮弹出查询对话框。操作人员要填三样东西起始时间、结束时间、时间间隔然后点“增加”按钮把要查询的变量加进列表多个变量可以依次增加。点“确定”后报表按设定的时间范围逐条填数据。比如查询催化剂液位、成品油液位两个变量8:00到16:00、间隔60秒一张报表里就出现两个变量的全部采样值。时间间隔这个参数直接决定报表行数和数据颗粒度。间隔60秒查8小时是480条记录间隔600秒就是48条行数不够时查询结果会被截断行数多则报表冗余。建表时行数最好按“查询时长/最短间隔表头行数”估一个上限宁多勿少多的行可以在报表属性里隐藏。这里给个参照交接班报表常用8小时、间隔5分钟约96条记录日报常用24小时、间隔15分钟约96条月报则按天汇总行数按31天算。4. 报表函数速查打印、单元格写值与历史取数的参数细节4.1 打印三兄弟ReportPrint、ReportPrint2与ReportPrintSetup组态王报表函数里打印相关的有三个功能有重叠用错会绕弯路。先看速查表函数主要作用关键参数ReportPageSetup对指定报表进行页面设置报表控件名ReportPrint将数据报告文件输出到打印机文件名ReportPrint2打印指定报表报表控件名、是否自动打印ReportPrintSetup打印预览并可输出报表控件名ReportGetCellString获取指定单元格文本报表控件名、行、列ReportGetCellValue获取指定单元格数值报表控件名、行、列ReportGetColumns获取报表列数报表控件名ReportGetRows获取报表行数报表控件名ReportLoad读取rtl报表文件报表控件名、路径ReportSaveAs保存报表到指定文件报表控件名、路径ReportSetCellString写指定单元格字符串报表控件名、行、列、文本ReportSetCellString2写单元格区域字符串报表控件名、区域、文本ReportSetCellValue写指定单元格数值报表控件名、行、列、数值ReportSetCellValue2写单元格区域数值报表控件名、区域、数值ReportSetHistData按参数查询历史数据报表控件名、起止时间、间隔、变量ReportPrint官方说明指向的是“数据报告文件”而不是报表对象它输出到打印机配置设定的打印口适合直接打印已生成好的文件。报表打印最常用的是ReportPrint2第一个参数传报表控件名第二个参数传1直接打印、传0弹对话框。ReportPrintSetup则是打印预览适合在正式打印前让操作人员确认页面格式。页面设置另有一个ReportPageSetup调整纸张方向、边距这类打印属性一般放在报表初始化时调用一次。4.2 单元格读写四件套String、Value和带2的版本单元格读写是报表函数里使用频率最高的一组。ReportSetCellString写的是字符串ReportSetCellValue写的是数值两者前三个参数一致报表控件名、行号、列号。行号列号从1开始比如第4行第1列就是a4。举例ReportSetCellString( 历史数据报表, 4, 3, 正常 ); ReportSetCellValue( 历史数据报表, 4, 2, 催化剂液位 );第一行把“正常”两个字写入第4行第3列适合写状态描述第二行把催化剂液位的数值写入第4行第2列。带2的版本ReportSetCellString2和ReportSetCellValue2是区域操作第二个参数传一个区域字符串比如“b4:e8”可以直接把一串数据一次填进去不用写循环批量初始化报表时能省不少时间。对应的读取函数是ReportGetCellString和ReportGetCellValue一个取文本一个取数值。这两个函数通常用在报表数据需要二次处理时比如从报表里把某个单元格的值读出来判断后再写另一个单元格或者在按钮命令语言里对报表内容做校验。配合ReportGetRows和ReportGetColumns可以拿到报表的总行数和总列数做循环遍历时先取行列数再逐个读不会越界。4.3 报表取数与保存ReportLoad、ReportSaveAs和行列查询ReportLoad和ReportSaveAs是一对文件操作。ReportLoad把指定路径下的rtl报表文件读到当前报表中来经常用在开机初始化画面加载时先加载空白模板再填充数据。ReportSaveAs把当前报表按所给文件名存到指定目录一般配合“导出报表”按钮使用——运行画面里点一下就生成一份带当日数据的文件方便归档。这两个函数的路径参数建议用相对路径跟工程放在同一个目录体系下。如果写死成绝对路径比如“C:\report\today.rtl”工程换电脑或者备份到别的盘报表加载直接失败。实际项目里我习惯把报表文件统一放到工程路径下的report目录运行时动态拼接路径这样工程拷到哪报表就跟到哪。5. 避坑记报表控件名、单元格等号和路径写死的五个常见问题5.1 单元格输入变量不刷新少了前面的等号现象运行画面里单元格显示“原料油液位”这几个字数据一动不动。原因组态王把没有等号开头的输入当成普通字符串并不当作变量解析。这是报表系统里最典型的翻车点新手和老手都会偶发。解决选中单元格确认文本以“”开头且等号和变量名之间没有空格。“原料油液位”和“ 原料油液位”是两种效果前者是变量引用后者会被当成字符串。检查时逐格看不要只看第一行表头就放过。5.2 报表函数报“对象不存在”控件名和画面名混用现象按钮命令语言里写了报表函数编译通过但运行时弹窗提示找不到对象。原因函数第一参要的是报表控件名填成了画面名称。报表控件名在“报表设计”对话框里定义画面名在画面属性里定义两者独立存在组态王不会自动关联。解决打开报表设计对话框看控件名复制过来用不要手打。我习惯按统一规则命名报表控件名前缀带“rpt”比如“rpt实时数据报表”这样画面名和控件名一眼能区分函数里抄错概率大幅下降。5.3 历史报表全是空行变量没有勾选历史记录现象查询按钮点了对话框也正常返回报表区域里只有表头数据部分是空的连0都不显示。原因变量定义时没有开启历史记录历史库里压根没有该变量的数据。查询函数本身没问题查了个不存在的时间段自然返回空。解决在变量定义对话框里勾选记录选项重新保存数据后再查询。这个坑容易误判成脚本错误排查优先级要放到最前面。另外已经保存过的历史数据不会因为变量定义修改而补齐只有修改之后新采样的数据才会落库。5.4 换了机器报表文件丢失rtl只保存在本地路径现象工程拷到另一台电脑报表要么变空白要么加载时提示找不到文件。原因rtl文件保存在当初设计时的绝对路径下换了机器路径对不上。开发机上能用是因为路径存在换机器后同一路径下没有这个文件。解决报表文件统一放到工程路径下的相对目录和工程一起拷贝。加载时用相对路径拼工程目录不写死盘符。工程交接时除了拷贝rtl文件还要确认报表工具箱里保存按钮生成的路径是否指向新位置。5.5 EXCEL报表路径写死kintable.xls查不到数据现象用EXCEL方式做历史报表查询点完“确定”之后sheet1里没数据。原因kintable.xls里INI_HistoryRecord函数写的是官方示例工程路径比如“C:\Program Files\Kingview\Example\Kingdemo2”不是当前工程路径查询子系统初始化后找不到对应的历史库。解决打开VBA编辑器把INI_HistoryRecord的第三个参数历史库路径和最后一个参数工程路径改成实际路径保存后重新运行。这个坑在下一章详细展开改一行就够。6. EXCEL扩展报表kintable.xls里那一行路径改对了就成功一半6.1 启用宏与VBA编辑器入口组态王安装路径下可以找到kintable.xls文件默认安装情况下位于c:\Program Files\Kingview目录。双击打开Excel会弹出安全提示点“启用宏”才能让报表逻辑跑起来。进入EXCEL画面后菜单栏找到“工具→宏→Visual Basic编辑器”打开VBA环境在过程列表框里选“auto_open”光标会停在对应的Sub过程上。这就是EXCEL报表初始化的入口。6.2 改对INI_HistoryRecord的两个路径参数auto_open里有一行核心代码ret INI_HistoryRecord(0, 0, C:\Program Files\Kingview\Example\Kingdemo2, 0, C:\Program Files\Kingview\Example\Kingdemo2)INI_HistoryRecord函数用于初始化查询子系统第三个参数是组态王的历史库路径最后一个参数是组态王的工程路径。示例填的是官方Demo工程路径直接跑必然查不到自己的数据。把两个路径改成当前工程的实际路径例如工程在“E:\培训工程”下历史库同为该目录就改成ret INI_HistoryRecord(0, 0, E:\培训工程, 0, E:\培训工程)保存修改、关闭VBA编辑器回到EXCEL环境。菜单“报表→历史报表”弹出查询对话框输入变量的起始时间、结束时间、时间间隔点“增加”把要查的变量加进列表点“确定”相应时间段的历史数据就生成在sheet1中。这套流程查出的数据可以继续用EXCEL函数加工成统计图表比内嵌报表更灵活适合管理岗需要复杂统计的场景。从那以后我每次切换工程都会做同一件事打开kintable.xls检查INI_HistoryRecord路径是不是当前工程内嵌报表则先核控件名再写函数。养成固定排查顺序报表问题基本十分钟内定位。希望帮到你。本文还有配套的精品资源点击获取