(一)规划调度系统
还是以佳华瓦斯电站为例,来介绍 “调度控制” 应用的使用方法。首先,需要对调度系统进行规划,也就是要明确调度需求是什么。
(1)明确调度场景和需求
佳华瓦斯电站是以从煤矿矿井直接抽采的瓦斯为燃气的电站,前面应用讲解的案例中反复介绍过,直接抽采的瓦斯气体的压力、浓度都非常不稳定。
下面这张图,就是佳华瓦斯电站的整体示意图。
从这个图可以看到,从煤矿矿井直接抽采的瓦斯燃气,有时候多,有时候少。燃气充足的时候,不仅可以让整个电站的5台发电机组全开,而且可以把每台机组的发电功率开得大;而燃气不足的时候,不仅无法满足发电机组全开的燃气需求,而且机组的发电功率也不能很高。
燃气的供应和分配,也可以用一张图来表示:
对电站而言,最需要解决的问题,就是如何根据瓦斯燃气的工况条件,来决定机组开还是不开,以及如果开,能开多大(额定功率范围)。这就是我们的调度需求。
这其实就是非常典型的 “动态配载” 的调度案例,也就是说,根据 “动态” 的变化,提出最优的 “配载” 方案。
(2)确定统计量
确定了调度的需求,接下来就要确定调度的依据。前面介绍过,这是一个非常典型的 “动态配载” 调度案例。那么就需要找到什么是 “动态”,要 “配载” 什么,依据什么去配载。这些都是需要确定的内容。
“调度控制” 应用需要确定的这些内容就是调度的依据。这些东西,就是统计量。一定要记住,“调度控制” 这个应用最大的特点、最大的需求、最重要的地方,就是统计。
瓦斯燃气工况条件的衡量,可以用 “燃气当量” 这个指标。这在 “统计计算” 应用中讲解过,这是泵站干管的供气情况,可以准确的反映当前瓦斯燃气的条件。
之前在 “统计计算” 中,有过 2个统计项目,一个是电站每小时燃气当量的统计项目,另一个是各机组每小时发电量统计。
这两个统计非常有指标性意义,它说明了两个事情:一个是每小时的燃气当量是多少;另一个是在这个燃气(当量)条件下,每台机组每小时的发电量是多少。
需要注意的是,这个燃气当量是整个电站的,那怎么来量化每台机组燃气消耗量在其中所占的比例呢?这也需要用到当量的方法。
机组的燃气当量统计,我们并没有在 “统计计算” 应用里面找到,也就是说在“统计计算”应用里面,之前只有电站的燃气当量统计项目,而没有机组的燃气当量的统计和计算。所以,这些就只能在项目内来计算。
看一下机组对象的变量(FV):
机组的燃气当量可以这样来计算:
QM=(主燃气阀开度+辅燃气阀开度)×一体阀开度×Sqrt(燃气压力+增压压力)×燃气浓度给定值,
也就是:
那么,在某个 [T] 时段里面,每台机组燃气总当量为:
用 R1、R2、…、R5来表示每台机组的燃气当量比例,那么:
那我们就可以大概知道,每台机组大概占用的燃气(当量)比例是多少,这也是非常重要的一个调度依据。
(3)是否使用已有统计量
有了需要的统计量,剩下的就是调度规划了。虽然我们已经有整个电站的燃气当量统计,但这个统计是每小时统计一次。如果调度项目的计算周期不是一个小时,而是 [T] 周期,那就还需要 [T] 时段整个电站燃气当量。
当然,我们可以用统计量的比例来粗略计算,比如 T=10 分钟,那么,当期这个计算周期的燃气当量可以用上一个统计周期的(1小时)的统计结果除以6,这个结果是近似当前最近 10分钟的燃气当量。
除了这个方式,最精确的方法就是重新计算,可以参考 “统计计算” 应用里面的计算公式:
那么,T 时段电站燃气当量(QE)就是 qE T时段的数值积分:
也就是说,在使用 “调度控制” 的时候,如果调度计算的周期是确定的,最好的方式就是预先在 “统计计算” 应用中,把调度计算需要的统计量项目预先创建好。如果不确定调度计算的周期,也可以在调度项目中进行所需要统计量的计算。
(4)调度依据
任何调度控制项目,都需要明确调度依据。所谓调度依据,就是调度的规则或者原则。
这个瓦斯电站调度项目的原则很清晰,就是依据上一个[T]时段整个电站的燃气当量来决定下一个 [T] 时段电站设备运行的调度规则,也就是:停几台?开几台?开的几台功率分别是多少?
假设,我们有一个这样的规则,这个规则暂且可以认为是电站工作人员的经验总结:
上面这个表(规则),虽然可以作为规则,但这是一个范围。
我们之所以这样来设计这个案例,就是因为这是最普遍、最可能发生的情况。很多调度规则,都是一个范围,这就需要在调度的时候,灵活掌握这个其间的尺度。
我们可以利用 “调度控制” 应用的特点,也就是把调度规则(调度依据)以调度系统的常数参数和可调控参数的方式体现,这在后面在创建调度系统(项目)的时候会有详细的讲解。
(5)构造调度对象
有了前面的准备,就可以来构造调度对象了。把需要的这些FV变量,凑成一个对象,这个对象就是我们的调度对象。构造调度对象,是 “调度控制”应用的非常关键的一步。
这里需要了解 “调度控制” 的使用规则:每个调度项目(调度系统)只能包括一个调度对象。通常,调度对象都需要重新构建。
要构造调度对象,就要看一下一共涉及到哪些参数:
从前面计算燃气当量的计算公式可以知道,我们需要每台机组的 S01(一体阀开度)、S02(主燃气阀开度)、S03(辅燃气阀开度)、S23(燃气浓度给定值)、S25(燃气压力) 和 S28(增压压力),还有机组的 S24(J功率预设)和 S29(有功功率)。
除此以外,我们还需要整个电站的变量,FP(干管前端压力)、EP(干管后端压力)和 GD(燃气甲烷含量)。
有了这些,就很清楚哪些参数是需要用来计算的,哪些是用来控制的。
为了与机组对象和电站对象的区别,也为了容易编写调度程序,我们需要把这些变量的命名调整一下:
机组的用 X1#、X2#、X3#、X4# 和 X5#,分别代表 1#、2#、3#、4# 和 5# 机组的变量;
电站的用 Y1、Y2 和 Y3 来创建这个调度对象的映射表:
需要注意的是,上面的 “双斜杠” 只是为了更加容易理解映射表脚本而特别写出来的注释行。但在 “对象管理” 应用中实际创建映射表的时候,这是不能出现的,否则会报错。
现在回到 “对象管理” 去创建调度对象的映射表:
保存后,可以在 “对象管理” 映射表视图列表看到这个映射表。
有了映射表,就需要来创建调度对象:
保存后,可以在对象的视图列表上看到这个对象:
(二)创建调度系统
有了前面的各项准备,就可以创建调度系统了。我们按顺序一步一步进行调度系统的创建:
(1)基本属性:
跟其他 MixIOT 应用项目一样,调度项目的基本属性包括项目名称、别名,还有调度对象。
前面的章节中介绍过,每个调度项目(系统)只能有一个对象。在这个项目中,就是我们专门创建的 “佳华调度对象”。
(2)D&C 面板
调度项目通常是需要有人盯着看的,我们可以为调度系统设计一个显示板,来显示调度 系统的调度对象当前是什么状态。
可以这样来设计这个调度系统的显示板:
这个显示板用非常直观的方法,让整个调度系统(调度对象)的状态一览无余,不仅有总体,还有细节。
我们在“显示板管理”创建这个显示板:
这样就可以在D&C面板中选择这个显示板:
(3)常数参数
调度项目中,可以设定一些常数参数。
一般来说,常数参数都是跟调度有关的而且需要独立出来的数据。常数参数配置后,在项目启动后,是不能修改的。如果要修改,需要停止调度系统运行,再通过项目编辑方式修改。
我们要设置为常数参数的是:
为了简化常数参数,可以用列表方式:
这些都是经验值,也许过一段时间,煤矿瓦斯工况条件改变的话,就可能需要改变,但并不会经常改变。
(4)可调控参数
常数参数是在调度项目运行过程中,不能改变的参数。如果需要改变参数,需要停止调度项目的运行去修改,然后再启动调度项目 。
在调度项目中,有些参数可能需要经常根据实际情况来调整,而且这些调整都是在调度项目运行过程中随时可能发生的。那么,就可以把这些参数配置为可调控参数。
规划好、选择好和使用好可调控参数,在调度系统中非常重要。选择可调控参数的方式有很多,不同的调度系统和调度需求的选择也都不尽相同,选择的依据自然就是调度系统的需求。
在瓦斯电站调度系统中,我们选择两个参数作为可调控参数,即 Level 的 “范围中间度”,一个是开机台数(范围)的中间度,另一个是 J 功率设置(范围)的中间度。
“范围中间度” 有时候也称为 “范围左右度”,用 MR(Middle Rate)表示,这是一类最常见最常用的调度系统调控参数,其含义很简单,即我们的选择在这个可选择范围中的居中程度。
首先,要看一下我们可以选择的范围,这个范围就是“常数参数”列的那些。
为了简化,不管哪一个 Level,开机机组数量我们使用同一个 “范围中间度”,记为 MMR,而机组 J功率设定范围也使用同一个范围中间度,记为 JMR。
范围中间度一般取值范围是 “-1~+1” 之间的数字,MR=0 的时候,决策值为 ,也就是可选范围的居中值。
如果可选值范围为 ,中间度为 MR,依据中间度计算的值叫 “决策值”,记为 V ,它的计算公式为:
这是初中几何都能推导出来的结果:
通过中间度MR来计算决策值V的时候,我们经常会遇到这样的问题,就是这个V是一个 “刻度值”,也就是说 ~ 之间,可以最终选择的并不是一个任意连续的值,而是一个等分刻度。
那么,计算出来的V,最终就是离自己最近的刻度值。
在 “调度控制” 应用中,中间度可以有两个不同类型,一个是单值,就是给定一个数字,也可以是一个列表。在这个例子里面,两个可调控参数,MMR 和 JMR 都是单值。
对决策值只能是整数(MMR),或者 10 倍数(JMR)的情况,我们通过 MMR 或 JMR 计算决策值 V 的时候,就是看看算出来 V 接近可选范围的哪一个,就用哪一个。如果是绝对居中,就按 “左规则” 来选择,就是 。
看一下这个结果,如果确定了 MMR 和 JMR,那么这个调度,实际上就是根据 GAS 落在哪一个 Level,根据 MMR 去选择开机多少台,根据 JMR 去计算J功率要设定到多少。
这个调度逻辑大致就是这样,我们也可以很直观地通过这个表知道。
(5)调度程序
每个调度控制系统(项目)的调度逻辑和调度过程,都是需要通过这个调度项目的调度程序来实现的。
在 “调度控制” 应用中,每个调度控制项目至少要有一个调度程序,如果需要也可以有多个调度程序。
调度程序是 MixIOT Lua,有一个专门的使用手册来介绍,可以供使用者参考。
MixIOT Lua 是标准 Lua 语言的一个扩展,MixIOT 有一个 MixIOT Lua 内置了 MixIOT 体系的很多东西,可以在 Lua程序中,直接访问(使用)MixIOT应用的项目结果,也可以通过控制码功能对所有对象进行反向控制。
在 “调度控制” 应用中,MixIOT Lua 也可以读取本调度项目的常数参数和可调控参数,这些都有规范的使用方法。
除了对 MixIOT 体系中不同应用数据的读取访问外, MixIOT Lua 还可以使用 MixIOT Lua 的数学计算函数。随着调度模型的不断丰富,MixIOT 可以直接调用 MixIOT 的调度模型,只需要把相关的参数传导进去,就可以直接使用调度模型返回的计算结果。虽然目前的调度程序只能选择 Lua,但未来可以使用更多的脚本语言,不排除可能是 Python、Julia 等等。
每个调度程序,都需要有一个唯一的程序名。如果同一个调度项目中使用了多个调度程 序,就可以实现不同调度程序之间的相互访问,这样就实现了多个调度程序的协同工作。
在这个项目中,只需要一个调度程序。这个调度程序的范例后面会写出来供大家参考。
在这里清晰梳理一下这个调度逻辑:
- 读取项目参数,比如调度对象编号、调度对象参数、调度周期,还有常数参数、可调控参数;
- 根据调度周期,去循环计算,输出结果。调度周期的意思,就是根据上一个周期的数据,计算出结果,当做下一个周期的控制值;也就是说,在“调度控制”应用中,调度周期一般不会作为调度项目的属性,我们可以把调度周期作为一个可调控参数来处理。
- 计算整个电站燃气当量:
- 计算每台机组的燃气当量:
- 计算每台机组的当量比例:
- 计算后,根据规则:
算出开机机组数量,以及J分配。
- 反向控制,完成本周期调度
Lua 调度程序示范如下:
Lua 调度程序示范如下:
程序开始:
这部分的含义是定义服务端口,以及服务访问的用户名密码。
定义调度对象变量
main_fv就是我们定义的调度对象的变量列表;
constant_parameter和adjust_parameter是通过param[ ]函数来获取这个调度项目的常数参数和可调控参数。
确定调度周期,启动循环计算
这个部分是决定调度程序的启动周期。
计算QE、MQ、R
这一段是计算燃气当量,看看落到哪一个Level。
计算总开机台数和总J功率
根据总开机台数和总J功率,分配机组启停以及启动机组的J功率预设
获取调度对象函数
反向控制函数
消息函数
访问鉴权
基本函数,时间戳,运行日志
(三)使用调度项目
配置好调度项目的各项内容,完善调度程序后,就可以保存这个调度项目。保存后的调度项目可以在调度项目的视图列表上看到:
我们可以通过操作菜单来操作这个调度项目 。
调度项目视图列表提供的操作菜单,提供了相关操作:
- 查看详情。
- 编辑项目。如果项目是运行状态,则需要先把该调度项目停止,才能进行编辑。
- 删除项目。如果项目是运行状态,也需要先停止调度项目运行,才能删除。
- 启动、停止项目。启动项目,意味着该调度项目中所有的调度程序都同时运行;停止项目则该调度项目所有的调度程序都会停止运行。
- D&C 调节提供了一个该调度项目可调控参数的调整交互,在这里不需要停止项目运行,就可以直接修改可调控参数,调整后,这个参数会在下一个调度周期的计算中生效。
- D&C 程序控制可以对该项目的某个调度程序进行重载,但不能控制单个调度程序的运行状态。
(1)调度项目详情
我们可以查看一下这个调度项目的详情:
详情包括该调度项目的基本设置信息,这些都是在创建项目的时候编辑的属性。这些属性包括项目编号、项目名称/别名以及相关备注。
在详情中,该项目的参数也可以看到,包括常数参数和可调控参数:
注意可调控参数,初始值是我们设定的值。在调度过程中,可能需要随时经常调整可调控参数的值,这里的“当前值”,是当前实际调整后的参数值。
另外可以看到,我们把一个很重要的参数“调度周期(DCycle)”也放到可调控参数里面。我们可以根据实际情况,随时调整调度周期。
详情中,可以看到这个调度项目的所有调度程序:
这里可以看到调度程序的实际运行状态。
调度程序的运行状态也是我们需要关心的,如果调度程序状态是停止运行,则不会输出调度结果。
详情中的 D&C 面板,给我们提供了该调度项目的整体展示:
这个画面,是我们重要查看的画面,除了该调度项目(调度对象)的整体状况,还可以在这个地方,对可调控参数进行调整。
详情中的日志,是该调度项目的运行情况:
(2)可调控参数修改
前面说过,调度项目在调度过程中,经常需要对一些调度参数修改。这些参数在设置的 时候,可以设置成调度项目的可调控参数。修改可调控参数的过程,叫 D&C 调节。
我们可以直接在调度项目的操作菜单上,直接进行 D&C 调节:
在 D&C 调节交互界面上,我们看到的参数值,是当前的值。可以直接对这些参数值进行修改,修改完成后,按 “确定”。
按下 “确定” 后,这个参数值就会在下一个调度周期中生效,这个调节无需把项目停止后重新启动。这是因为 “调度控制” 应用中,对可调控参数有一个 “热加载” 机制。
(3)D&C程序控制
在调度项目列表的操作菜单上,打开 D&C 程序控制项:
这个调度程序的控制,可以对本调度项目的调度程序进行加载操作。
这个地方需要做一些解释。
一个调度项目的调度程序,是运行在这个调度项目内的调度程序运行容器里面的,简单地说,调度程序是运行在一个封闭的独立容器里面,这样做的目的是为了安全。
如果调度程序的编写不是十分完美,一旦程序运行出现什么问题,就会导致一些不良后果,但这些不良后果也都只会影响本容器里面的程序,而不会外溢这些影响。
我们要知道,调度程序写完,是没有办法在“调度控制”外部去测试和验证的,程序的测试只能是在本调度项目里面,一旦调度程序写的有问题,MixIOT系统会强制停止调度程序的运行,这也是“调度控制”应用自己的一个保护措施。
如果需要重新去加载调度程序,就需要在“D&C程序控制”里面,对调度程序重新加载。