(一)第一个报表和模板

还是以佳华电站为例,看看如何在 “自动报表” 应用中,创建第一个报表项目。

首先,要做好报表规划,也就是要弄清楚,我们需要的报表到底是什么。佳华电站需要的第一个报表,是机组和电站的日报表,如:

这个报表对佳华电站而言,是一个非常重要的统计报表。在这一个报表里,就把电站各机组的运行情况和发电量,以及电站的整体情况、燃气情况,都包括了进来。

不难看出,这是一个日报表,每天一个,这个日报表,有些内容是不变的:

也就是说,它就是这个报表项目的模板。

那么,就可以把它变成一个Excel文件,这其实就是这个报表项目的模板。

有了这个模板,以后每天一个报表,其实就是右上角的日期在变化,里面每个格子的数字在变化。日期也好,格子里面的数字也好,都通过报表脚本来产生。

但是,如果仔细看一下这边报表里面的数据,实际上,也未必所有格子里的数据都需要计算:

上图表格中,蓝色的数据,实际上是根据红色数字算出来的。换句话说,即便是写报表项目脚本,也可以不写蓝色的,只需要写红色的。

比如,右上角的日期,就是Excel里面的Today函数:

比如,达产率这一列:

是左边两列的计算结果。

电站一行,也是计算结果:

电站达产率,是计算结果的再计算结果:

所以,这个报表项目的模板可以做成这样:

其中,红色的B_3、C_5、E_7和F_8,实际上就是对应于Excel表格的单元格编号。

也就是说,在生成报表的时候,只需要把红色单元格的数字算出来,蓝色单元格的按预先设定的公式也就算出来了。

(二)报表数据

前面花了大篇幅解释了“报表模板”是怎么回事,这一点现在应该很清楚了。

现在重要的是,我们要弄清楚,报表模板中红色单元的数据怎么来。其实这一点很容易想到,当然就是来自“统计计算”应用。

“统计计算” 应用的数据确实是“自动报表”数据的主要来源,但并非唯一的来源。事实上,在 MixIOT 体系中,报表的数据可以来自任何地方。

这个报表是一个 “日报表”,也就是说,这里面的数据一定都是 “日统计” 的结果。那需要回头看一下我们的统计项目都有哪些:

其中,每日的统计项目只有一个,其他的都是每小时的:

很容易看到这样一种情况:

(1)正常运行时间(Hr),也就是 C_3 ~ C_7 这些数据与统计项目 STATISTICS3232196900002 是一致的,应该是可以直接获得;
(2)总运行时间(Hr),也就是 B_3 ~ B_7 这些数据还没有统计项目。所以,这个统计项目需要补上;
(3)发电量有统计,但并非 “日统计”,而是 “每小时统计”。

所以,我们要做的事情就有两件:

第一件,增加一个机组总运行时间的日统计,这不是什么困难,只需要精确到小时,那么,其实就是“S31”的读数转用量。

S32(运行时间MIN)这个是分钟,我们可以忽略。

创建一个机组运行时间的统计项目:

只要启动这个统计项目就可以了。那第二个问题就解决了。

要做的第二件事,就是要完善报表模板。这个问题可以这样来思考,因为我们已经有了每小时的统计项目,所以不如增加一个工作簿页,把小时统计结果放进来:

这样,所有的每小时统计都有了。再把总表也调整一下:

(三)报表项目

进入 “自动报表” 应用,创建报表项目:

报表项目名称和别名为“佳华电站机组运行日报表(DailyReport-JH)”;执行方式选择自动执行,每天凌晨 01:15 跑一次报表;再上传刚才做好的模板文件(Excel格式)。

完成了这些,就可以编写报表脚本了。

后面再详细说明报表脚本的编写规则。完成脚本编写,确定保存这个报表项目:

报表项目创建后,项目的状态默认是关闭的。这是一个自动执行的报表,需要手动启动这个项目:

启动这个项目后,以后每天在规定的时间,就会自动生成报表。

(四)报表脚本

“自动报表” 应用的核心是报表脚本,而报表脚本的编写,目前还是一个相对复杂的工作,在未来版本能提供 “界面化” 交互工具之前,还需要手工去编写。报表脚本的编写,重要的是理解脚本的规范。理解了这个规范,编写脚本也只是一个工作量的问题。

我们仅以1#机组总运行时间(B_3)为例,说一下这个脚本要怎么写。

上面这一串脚本,是B_3(B3)单元格的计算脚本。从这个脚本,大概可以感觉到,完整的脚本结构应该是这样的:

也就是说,再复杂的报表,其实都是要为每个单元格写脚本算出来。

当然, MixIOT 的脚本系统也有非常巨大的灵活性,比如用一段脚本就把横着一整行或者竖着的一整列里面所有的单元都包含进来。

比如可以一段脚本就把整个 H_xx 给算出来(属于同一个统计项目)。这其中的奥秘,就在脚本中的两行,“from” 和 “to”。当然其他的内容也需要调整。

甚至,如果是同—个统计项目的话,一段脚本可以把一片数据都给算出来:

当然,我们这个报表做不到一个脚本管一片,因为它们并不同属同一个统计项目。但至少可以这样:

这一段脚本:

跟前面一段B_3的脚本一样,都是 “基础脚本”。基础脚本的作用,就是去“给报表模板单元格渲染数据”。基础脚本可以用来渲染某一个单元格、某一行或某一列单元格,或者是某一个区域的单元格的数据。

这样一来就很清楚了,我们最终需要熟练掌握的东西,就是基础脚本的内容。

我们从第 3~20 行来解释

Line 4
block_id" : "apim"

MixIOT API 是一个复杂的系统,“apim” 是其中的一个(API-M),在这里的含义是报表需要使用这个 API 去获取数据。 API-M 是主要的一个 API,单元格获取的数据是来自统计项目,需要用这个API。如果报表单元格的数据是来自其他的地方,则此处的写法会不同。

事实上,MixIOT API 体系里面每一个不同的 API(如API-M、API-Proxy等等),都是 MixIOT 体系中的 Block(应用块),它们都分别起这不同的作用。

我们可以打开 “CLI控制台” 应用:

可以看到所有的 API:

Line 5
"field" : "data"

这是使用 “apim” 这个 API ,我们需要从这个 “data” 中获取需要的数据的字段。也就是说,我们需要的数据,都在这个 “field”:“data” 里面。如果暂时还没办法弄得十分清楚,也没关系,照葫芦画瓢便是。

Line 6~9
"position" : {
"from" : "H_4",
"to" : "H_27"
},

这是指脚本需要渲染数据的位置,H4~H27。

Line 10
"sequence":"columnData",

这一行的意思是,从 H4~H27,是一个 “列数据”(column 是列的意思)。

Line 11~18
"condition":{
"items":24,
"start":"date('Y-m-d 01:00:00', time())",
"end":"date('Y-m-d 23:59:59', time())",
"action":"get_statistics_list",
"object_id":"OBJ3253466500005",
"script_uid":"STATISTICS3254065900018"
},

这几行的意思是,数据一共有 24项,数据来源(统计结果)的起始时间和结束时间分别是当天的 1 点到 24点。这是因为 0点~1点 的数据,是1点后才算出来的,所以这个地方需要等。

“action” 是获取数据的动作,这里 “get_statistics_list” 是获取统计结果的列表。

后面的 “object_id” 和 “script_uid” 分别是对象编号和统计项目编号:

Line 19
"format_function" : ""

这一行的意思是,我们拿到结果需要用哪一个格式化函数去格式化,这里的 “”(空),意思是无需格式化。

弄清楚了这些,就可以完全做好这个报表的脚本了。

B3有了,B4也就有了。只需要把对象编号换成佳华2#机组即可:

C3 也是一样,只需要把统计项目编号换一个就行了:

C4 也就呼之欲出了:

那么,报表中的“总表”就全有了。

报表的 “小时报表” 工作簿,其实也是一样。H4~H27 有了:

其他的也不难,基本上也就是照葫芦画瓢。

比如,B4~B27:

这是1#机组的 “每小时发电量” 统计项目:

只要把统计项目和对象编号对号入座就行。

同理,C4~C27(2#机组每小时发电量)的脚本也出来了:

现在可以确认,每一个报表模板的单元格,都有对应的脚本去渲染赋值。我们把完整的脚本放到该报表项目的脚本中,这个报表项目就算是完成了。

我们可以在报表结果中,看到每天的报表结果:

2023-12-28

2023-12-29

2023-12-30

这些报表,对整个电站的意义是极大的,对三普能源集团(SERG)也有非常重要的意义。

文档更新时间: 2024-06-29 23:50   作者:Mixiot