四、任务实施

四、任务实施

我们新建一个“报表”窗口来为本监控系统开发报表功能,在新建的“报表”窗口中添加窗口切换按钮,关于按钮的添加方法与其他几个任务类似。

在“报表”窗口中创建专家报表和历史报表,并对报表对象进行组态配置以实现系统要求。

1.创建专家报表

在“工程项目”导航栏中选择“复合组件”,在弹出的“复合组件”对话框中的“报表”中双击“专家报表”,即可在窗口中出现专家报表对象,调整大小和位置即可。

2.配置专家报表

专家报表的配置主要通过报表向导来完成,报表向导的设置步骤参见本任务的知识链接部分。这里重点把报表向导中需要注意的事项进行说明。

(1)基本配置

报表向导主要有5步,下面分别介绍。

第一步,选择向导类型。我们的数据源为力控数据库而非关系型数据库,这里选择“力控数据库报表向导”,如图2-7-1所示。

目前报表向导类型主要有3种。

力控数据库报表向导:其数据源为力控数据库,通过此向导可以产生需要的班报表、日报表、周报表、月报表、季报表、年报表以及基于力控数据库的自定义报表。使用此向导之前必须先在力控数据库中保存历史数据,如果需要统计值时,还需要在数据库中选中数据库点的“统计”选项。

关系数据库报表向导:其数据源为关系数据库,通过此向导可以连接关系数据库并查询其中的表页,还可执行增加、减少、修改数据库记录的功能。

无模板向导:对表页不做处理,由用户自己定义。

第二步主要是针对报表的外观和行列的参数进行设置,若无特殊要求使用默认设置即可,可以把“拖动改变行高”和“拖动改变列宽”勾选上,如图2-7-2所示,这样当报表中显示的内容不完整时可以拖动改变行列的高和宽使页面显示完整。同时要勾选上“行标”和“列标”前面的“显示”选项,这样报表在显示时才能显示列名。否则只显示表格内的数据而没有列名。

报表向导的第三步,主要设置报表的类型和时间等内容。也是重点要配置的一步。在报表类型中可以选择“自定义报表”“班报表”“日报表”“周报表”“月报表”“季报表”和“年报表”。这里我们选择“自定义报表”,如图2-7-3所示。

978-7-111-54974-1-Chapter02-331.jpg

图2-7-1 “力控数据库报表向导”

978-7-111-54974-1-Chapter02-332.jpg

图2-7-2 报表的外观和行列设置

978-7-111-54974-1-Chapter02-333.jpg

图2-7-3 报表类型和时间设置

不同类型报表之间的区别主要在于时间长度和时间间隔设置上,例如若选择“日报表”,则时间长度为8小时,时间间隔为1小时,两者都不能修改。若选择“周报表”,则时间长度为7日,时间间隔为1日,两者都不能修改。在取值类型中我们可以选择“瞬时值”“平均值”“最大值”和“最小值”。瞬时值为数据库中某一时刻的历史值,而平均/最大/最小值为采集的是规定时间段内的统计值,在配置的时候可以根据用户的需求灵活选择,这里选择“瞬时值”,我们只需要查看某一时刻变量的历史值即可。

在填充时间一栏中,若选择“周报表”和“日报表”等类型则该项是灰色的、不可编辑的。由于这里我们选择的是“自定义报表”,因此需要设置报表的时间长度和时间间隔。这里设置时间长度为10分钟,时间间隔为1分钟,即每隔一分钟显示一次,很显然报表中要显示10行。(在自定义报表中,报表要显示的行数可以由时间长度和时间间隔计算出来,若时间长度为10min,时间间隔为30s,则要显示的行数为10×60/30=20行,依次类推)。

在行统计和列统计中,可以显示每一列或每一行的“平均值”“累加值”“最大值”和“最小值”,可以根据需要进行添加。

报表向导的第四步中主要设置时间格式以及基准行列。在时间格式中我们选择一种需要显示的格式即可,这里使用默认格式。在基准行列中,使用默认值即可。基准行为1,基准列为1,表示第一个数据是从第1行第1列开始显示的。若修改基准行为3,基准列为3,则第一个数据是从第3行第3列开始显示的,如图2-7-4所示。

报表向导的第五步中主要完成报表中要显示的变量的添加以及显示次序的调整。如图2-7-5所示,在该对话框的左侧为所有点的列表,右侧为已经选中点的列表,我们可以通过中间的“>”“<”“》”“《”按钮来添加要显示的点,删除不想显示的点。同时通过右侧的“最前”“向上”“向下”和“最底”按钮,可以调整已经选中点在报表中的显示顺序。

978-7-111-54974-1-Chapter02-334.jpg

图2-7-4 报表时间格式设置

978-7-111-54974-1-Chapter02-335.jpg

图2-7-5 报表变量添加

本项目中我们需要在报表中显示3个水箱的液位,因此需要添加点mid_tank_lev-el.PV、high_tank_level.PV和tank_level.PV。添加和调整完成后,单击“完成”按钮,则报表的设置完成。完成之后退出报表设置环境即可。

(2)扩展配置

报表向导配置完成后只是完成了报表的基础配置,要实现项目的要求需要在报表向导的基础上进行其他功能的扩展,具体的扩展配置如下。

1)数据自动刷新。

报表向导配置完成后,在运行中报表中数据不能实现自动刷新,需要添加应用程序脚本来实现数据的自动刷新,具体步骤如下。

在开发环境中的“工程项目”导航栏中,我们依次点开“全局脚本→动作”,双击“应用程序动作”,在弹出的脚本编辑器中,选中“程序运行周期执行”编辑区,然后在左侧导航窗口中依次点开“对象→窗口→报表”,双击“报表”,则弹出报表窗口中所有对象的名称,这里我们找到专家报表对象“Report”,点开“Report”左侧的“+”,则可以看到“Report”对象所有的函数。现在双击“RefreshSheet”函数,则在脚本编辑区自动添加“#报表.#Report.RefreshSheet()”,为函数“#报表.#Report.RefreshSheet()”添加参数“-1”,即为“#报表.#Report.RefreshSheet(-1)”,即可实现实时刷新专家报表中的当前表页。这里注意一定要把该函数放置在“程序运行周期执行”编辑区。

编辑完成后,运行系统回到专家报表窗口,可以看到报表中的数值可以实现实时更新。

详细的步骤可以参见本任务知识链接中的专家报表扩展配置部分。

2)报表中无效数据的处理。

报表中无效的数据默认显示为“-9999.00”,如图2-7-6所示,这里可以根据需要来显示无效数据,设置的方法如下。

在开发环境中,我们双击专家报表对象,弹出“报表设置”窗口,点开该窗口工具栏中的“格式→无效数据处理(I)”,弹出无效数据处理对话框,在该对话框的下拉菜单中可以设置“显示数据库数据”“为0/-9999无显示”“为-9999无显示”和“为0无显示”。也可以在“替换数据”中填入要替换为的数据,这样当数据无效时就可以显示替换数据,这里我们选择“为-9999无显示”即可,运行后的效果如图2-7-7所示。

978-7-111-54974-1-Chapter02-336.jpg

图2-7-6 报表无效数据处理前

978-7-111-54974-1-Chapter02-337.jpg

图2-7-7 报表无效数据处理后

3)报表的查询。

专家报表默认没有提供查询工具,需要我们手动添加。查询功能可以通过“工具箱”中“Window组件”中的“日期”和“时间范围”来实现。

我们为专家报表对象添加一个日期组件和两个时间范围组件,如图2-7-8所示,通过查看这3个对象的属性我们知道它们的名字分别为“DateTime”“TimeSpan”和“TimeSpan1”,然后分别为这3个对象添加文本注释为“开始时间”“时间段”和“时间间隔”,并添加一个名为“查询”的增强型按钮。接下来我们为按钮添加左键动作,在左键动作的脚本编辑器中的“按下鼠标”编辑区中输入“#Report.SetFreeReportPar(-1,#DateTime.GetTime(),#TimeSpan.GetTime(),0,#TimeSpan1.GetTime(),0);”如图2-7-9所示。

978-7-111-54974-1-Chapter02-338.jpg

图2-7-8 报表的日期和时间组件

保存、编译之后,运行即可。

这里我们调用了对象的函数来实现对专家报表数据的查询。调用了专家报表对象的Set-FreeReportPar(nSheetIndex,nBeginTime,nTimeRange,nTimeRangeUint,nTimeSpc,nTime- SpcUnit)函数。调用了日期组件和日期范围组件的GetTime()函数。关于这些函数的功能和参数说明详见本任务知识链接中的“专家报表数据的查询方式”。

978-7-111-54974-1-Chapter02-339.jpg

图2-7-9 添加查询函数

4)报表数据导出。

报表数据的导出也需要调用报表对象的函数来是实现,这里只导出最常用的excel文件,需要调用的函数为ExportExcelFile(nSheetIndex,nWithDlg,strPath,nExportAll)。

在窗口中添加一个“Excel导出”按钮,为该按钮添加左键动作,在左键动作的脚本编辑器中的“按下鼠标”编辑区中输入“#Report.ExportExcelFile(-1,1,"",1)”,当单击该导出按钮则弹出“输出Excel文件”对话框,单击“目标文件名”后边的按钮就可以选择导出文件要保存的地址和文件的名称。在输出内容中可以选择“当前表页”和“所有表页”,如图2-7-10所示,这里选择“当前表页”。设置完成后单击“开始转换”按钮,转换完成后弹出转换完成提示框,就可以在刚才指定的路径中找到该excel文件,打开即可以看到导出后的excel数据,如图2-7-11所示。

978-7-111-54974-1-Chapter02-340.jpg

图2-7-10 设置输出文件格式

978-7-111-54974-1-Chapter02-341.jpg

图2-7-11 导出后报表效果

5)报表的打印预览和打印。

报表的打印预览和打印功能也需要调用函数来实现,分别需要调用报表对象的#Re-port.PrintPreview(nSheetIndex,nPageSetDlg)和#Report.PrintSheet(nSheetIndex,nWithDlg)来实现打印预览和打印。

具体的步骤如下:在窗口中添加“打印预览”和“打印”按钮,然后分别为两个按钮添加左键动作。

关于这两个函数的功能和说明参加本任务知识链接。

6)报表的运行。

报表的所用功能全部实现的运行界面如图2-7-12所示,图中详细说明了在之前组态中设置的值在监控画面中的呈现效果。

报表运行时我们可以通过拖拉的方式调整报表的行高和列宽,可以通过在日期组件和时间范围组件中选择指定的时间段进行报表的查询,还可以对报表中的数据进行excel导出,同时可以预览和打印报表中的数据。

3.创建历史报表

在工具箱“常用组件”中选择“历史报表”,在窗口中单击并拖曳到合适大小后释放鼠标或者选择“复合组件→报表→历史报表”,双击历史报表即可创建历史报表。

978-7-111-54974-1-Chapter02-342.jpg

图2-7-12 报表组件的完整运行效果

4.配置历史报表

历史报表的配置可分为基本配置和查询、数据导出导入和打印等扩展功能的配置,下面就分别进行说明。

(1)基本配置

历史报表的基本配置主要是报表的外观、时间设置和变量选择的配置上,这些配置都是通过报表的“属性”对话框来完成的。双击历史报表对象,弹出“属性”对话框,如图2-7-13所示,在“属性”对话框中有“报表”和“变量”两个选项卡,下面分别介绍“属性”对话框中各中组态的含义。

978-7-111-54974-1-Chapter02-343.jpg

图2-7-13 历史报表“属性”对话框

978-7-111-54974-1-Chapter02-344.jpg

图2-7-14 历史报表“变量”选项卡

在“报表”选项卡中我们重点要设置的是报表开始的时刻、时间范围和数据源。起始时间默认的是专家报表创建的时间,使用默认的时间即可,也可以手动修改。时间范围设置为5分钟,间隔为20秒(为了看到更多的数据我们时间设置得比较短,实际使用中时间范围和时间间隔会比较长,比如时间范围为1天,时间间隔为2个小时。)在数据源中我们的历史数据来自于本机而非远程数据源,因此这里选择“系统”即可。

在“变量”选项卡中,如图2-7-14所示,单击“点名”下方的空白框即可弹出变量选择对话框,为报表添加要显示的点。这里分别添加要显示的点mid_tank_level.PV、high_tank_level.PV和tank_level.PV。在对话框下方的“标题类型”下拉框中有“自定义”“点名”和“点描述”三种类型可以选择,默认的是自定义。标题类型对应的是报表中的列名,这里选择“点描述”就是把点描述作为标题的名称。若要选择“自定义”,自定义标题的名称,可以任意填写。若要选择“点名”则把点名名作为标题的名称。“格式”输入框用来指定数值的字符显示宽度和报表数值的精度,默认的是8.2,表示字符显示宽度为8,其中小数点后位数为2。由于宽度为8时不能完整显示历史报表的列名造成各个列的列名部分重叠,因此这里我们设置格式为12.2。

设置完之后的运行效果如图2-7-15所示。

978-7-111-54974-1-Chapter02-345.jpg

图2-7-15 历史报表运行效果

(2)扩展配置

在扩展配置中我们要进一步完善历史报表的功能,为历史报表提供基础查询、快捷查询、定时打印、导出导入等功能,这些功能的实现更多地是通过对象函数的调用来实现,下面就逐一介绍。

1)历史报表的基础查询。

历史报表的基础查询要实现当输入一个时间段,能显示该段时间内指定点的历史数据,并以报表的形式呈现,实现的方法与专家报表的实现方法类似,也需要为历史报表添加3个组件,一个日期组件和两个时间范围组件,同时添加一个查询按钮。日期组件用来指定报表开始的日期和时间,时间范围组件分别用来设定要显示的时间长度和时间间隔,由查询按钮来调用历史报表对象的相关查询函数来实现数据的查询。

关于组件的添加这里不再赘述,我们重点说一下历史报表中查询函数的使用情况。

我们在查询按钮的左键动作的“鼠标按下”编辑区中输入

#HisReport.SetTimeEx(#DateTime1.GetTime());//设置历史报表开始时间

#HisReport.SetTimeSpan(#TimeSpan2.GetTime(),#TimeSpan3.GetTime())//设置历史报表的时间段和时间间隔。即可。(在输入时可以通过脚本编辑器左侧导航栏中的“对象→窗口→报表”来选择历史报表对象,单击历史报表对象的名字“HisReport”,则可以看到该对象下面所有可以调用的函数,双击要调用的函数则该函数自动添加到脚本编辑区中来,接下来在函数的参数中填入合适的值即可),如图2-7-16所示。

978-7-111-54974-1-Chapter02-346.jpg

图2-7-16 历史报表添加查询函数

HisReport.SetTimeEx(intnTime)函数用来设置历史报表的开始时间,HisRe- port.SetTimeSpan(intnRange,intnSpace)用来设置时间长度和时间间隔,关于这两个函数的功能和说明参见本任务知识链接中的历史报表扩展配置部分。

2)历史报表的快捷查询。

在进行历史报表的基础查询时通过日期和时间范围组件来选择具体的某一个时间段来进行报表数据的查询,每次查询都需要输入日期和时间范围。历史报表的快捷查询是在现有时间的基础上直接移动报表开始的时间。比如可以快速查询当前时间的前一天或后一天的数据,前一小时或后一小时的数据,前一分钟或后一分钟的数据,也可以直接查看以当前时间为起点的报表数据。

这些快捷功能的实现都是通过添加响应按钮,为按钮添加左键动作来调用历史报表对象HisReport的相关函数来实现的。具体如下:

978-7-111-54974-1-Chapter02-347.jpg

上述函数的参数intnDays、intnHours和intnMinutes可以表示从设定日期开始往后(正整数)或者往前(负整数)的天数/小时数/分钟数。例如:

978-7-111-54974-1-Chapter02-348.jpg

这里我们分别需要创建7个按钮分别命名为“前一天”“后一天”“前两小时”“后两小时”“前一分钟”“后一分钟”和“当前时间”。分别为这7个按钮添加左键动作,在脚本编辑区中调用对应函数即可。这里只以“前一天”、“后一天”按钮为例进行说明。分别在脚本编辑区中输入如下函数即可978-7-111-54974-1-Chapter02-349.jpg。其他5个按钮与此类似。

3)历史报表的打印预览。

历史报表的打印预览需要调用历史报表对象HisReport的PrePrint()函数。我们添加一个“打印预览”按钮,为按钮添加左键动作978-7-111-54974-1-Chapter02-350.jpg即可。关于PrePrint()函数的说明参见本任务知识链接。

4)历史报表的手动打印。

历史报表对象的手动打印需要我们调用该对象HisReport的Print()函数,我们只需要为打印按钮添加左键动作#HisReport.Print()978-7-111-54974-1-Chapter02-351.jpg,即可。当单击“打印”按钮,则弹出“打印当前报表”窗口。关于Print()函数的说明参见本任务知识链接。

5)历史报表的定时自动打印。

历史报表的定时打印要求我们的工程在运行时能在每天17点自动定时调用打印函数来实现报表数据的打印。这里需要用到力控提供的系统函数PrintEx(WindowName,n,left,top,right,bottom),该函数的主要功能是打印窗口的特定区域,关于该函数的功能和用法参见本任务知识链接。

定时打印的实现方法如下:

激活Draw菜单命令“特殊功能→动作→数据改变”,进入“脚本编辑”对话框,在“变量名”内键入系统变量“978-7-111-54974-1-Chapter02-352.jpgHour”,在编辑器内键入脚本:

978-7-111-54974-1-Chapter02-353.jpg

编辑好的数据改变动作脚本如图2-7-17所示。

978-7-111-54974-1-Chapter02-354.jpg

图2-7-17 历史报表的定时打印

把脚本程序创建在“数据改变”脚本中可以保证数据改变时只执行一次,不会重复打印。若把脚本放置“程序运行周期执行”中,有可能造成多次打印。

这里的两个坐标(703,93)和(1216,359)分别是历史报表对象的左上角和右下角,也是函数要打印的窗口区域。(要查看窗口中对象的坐标可以通过“查看→工具栏→坐标工具栏”来调出坐标工具栏,当光标在屏幕上移动则坐标工具栏中自动显示当前光标所在的坐标)、“报表,1”表示要打印的是名为“报表”的窗口,“1”表示放缩到整张纸。

实际上,如果我们希望打印时间再灵活些,而不是固定在某一个时间点的话,可以将动作脚本中的小时数值“17”换成一个变量即可,通过对该变量赋值就可以实现任务控制报表打印时间了。

6)历史报表的导出。

历史报表的导出可以通过调用历史报表对象的HisReport.SaveCSV(char * str-FileName)来实现。

我们首先创建一个名为“导出CSV”的增强型按钮,然后为该按钮添加左键动作#His-Report.SaveCSV("d:\hisReport.csv")978-7-111-54974-1-Chapter02-355.jpg,保存、编译运行后单击该“导出CSV”按钮就可以在D盘根目录下找到导出的csv文件——“hisReport.csv”文件。

关于HisReport.SaveCSV(char * strFileName)函数需要说明的是函数的参数str-FileName必须是一个绝对路径,同时需要指定带扩展名的文件名,这样每单击一次“导出CSV”按钮则更新一次该文件的内容。因此,若要保存两次导出的文件,需要及时进行复制备份保存,否则第二次导出操作会把之前文件的内容重新改写。

7)历史报表的运行。

在历史报表基本配置和扩展配置完成后,在运行界面中我们看到的历史报表界面如图2-7-18所示。

978-7-111-54974-1-Chapter02-356.jpg

图2-7-18 历史报表完整功能运行界面

我们可以通过设置日期和时间范围来查询历史数据,也可以通过快捷查询按钮来查询数据,还可以导出数据为CSV格式的文件,通过“打印预览”和“打印”按钮可以打印历史报表,同时每天的17点中系统都会自动打印一张在窗口显示区中显示的历史报表数据(历时报表自动打印功能只能打印监控窗口中报表所在区域的内容,若历史报表的数据在窗口中显示不完则右侧会有竖向的下拉条,此种情况下自动打印的报表不能显示窗口中看不到的数据,只能显示呈现在监控画面中的数据,我们可以通过在开发环境中调整历时报表对象的大小来保证所有的数据都能打印出来)。