基于场景设计的电力监控培训仿真系统

2020-11-23 05:11李佑文褚红健蔡一磊
无线互联科技 2020年17期
关键词:表达式线程对象

李佑文,褚红健,蔡一磊

(南京国电南自轨道交通工程有限公司,江苏 南京 210032)

0 引言

电力监控系统通过对轨道交通供电系统主变电所、牵引变电所、降压变电所等全线供电设备数据的监视和控制,以确保牵引供电和全线电力变、配电系统的安全可靠运行[1]。由于电力监控系统的复杂性和系统设备价格昂贵以及受到现场环境、安全性等限制,直接在现场的真实系统上进行学习和培训显得不切实际[2-3],因此,需设计一种数字化的电力监控培训仿真系统。该系统通过模拟电力监控中各类设备的运行工况,提供电气设备操作、系统运行方式、事故处理等场景的培训;提高电调人员日常操作技能水平,培养其对供电系统异常和事故工况的判断与处理能力;避免各种事故特别是人为原因引起的误操作事故的发生,最终减少人为系统故障、降低运营公司成本,保证供电系统的连续稳定运行。

1 培训、仿真场景

电力监控培训仿真系统的功能经历了从单一到综合、从简单到复杂的发展,其作用也由演示性转变为指导性,已然成为电力监控自动化的一个重要产品,同时也是电力控制中心培训操作员的得力工具[4]。

电力监控培训仿真系统的核心内容是生成不同的培训、仿真场景,并尽可能多地满足各类培训、仿真业务场景。仿真业务包括设备仿真、控制仿真、线路仿真、五防连锁仿真、联动仿真,培训业务包括日常培训、操作培训、正常工况、异常工况、事故处理培训等。

从系统软件设计角度出发,场景可抽象定义为电力监控系统内特定条件、事件发生时导致的一系列数据变化的集合。在电力监控仿真培训系统中,如何使所有培训、仿真场景有效地联动起来,在最大程度上模拟真实现场的联动运行工况就十分关键。文章首先设计一种电力监控系统中常用的数据对象结构,然后依据数据对象与属性进行数据组织,再设计能够涵盖各类场景的配置文件,最后基于多线程实现后台场景的运行,并使各个场景的运行条件与结果有效联动,达到仿真现场实际联动工况的目的。

2 配置设计

设计良好的数据对象及组织方式使系统支持各类复杂场景成为可能,同时可为场景配置、场景执行提供更好的支持。将数据对象组织成的配置文件是培训仿真场景的核心,连接了场景执行、场景配置两个过程。同时,如何将数据对象进行逻辑组织才能最大程度上增强场景配置的灵活性,保证能够涵盖并实现各类仿真、培训场景也是最关键的。

2.1 数据对象设计

任何对数据的组织都离不开数据对象的设计。电力监控系统中数据一般以对象的形式存在,常见的数据点对象包括遥信点(Double Point)、遥测点(Measured Value)、遥控点(DoubleCommand)和遥脉点(Integrated Total),每个对象点包括多个属性,每个属性对应一个值。以DoublePoint对象为示例给出遥信点对象设计如表1所示。

表1 Double Point对象示例

2.2 数据对象组织

为实现场景运行的前置条件,需要对设计数据对象组织方式,定义以下两个概念。

2.2.1 定义1:点变量Var

点变量Var包含一个alias(唯一标识)、ID(数据对象的ID)、attribute(数值类型属性)、compareOperation(包括“>”“<”“==”“!=”“≥”“≤”)和一个value(数值类型,可以为已定义过的其他点变量的alias,如果为alias,则表示取该alias点id的attribute值)。每个点变量逻辑表达式最后运算的结果为一个Bool类型。点变量举例如下。

{"alias" : "V3", "id" : 527972140,"attribute" : "FieldValue","compareOperation" : ">", "value" : "5"},即{V3: 527972140-> FieldValue >5},点变量V3表示数据点527972140的FieldValue属性大于5时为true,否则为false;

{"alias" : "V4", "id" : 527972141,"attribute" : "FieldValue","compareOperation" : "!=", "value" : "V3"},即{V4: 527972141-> FieldValue != 527972140-> FieldValue },点变量V4表示数据点527972141的FieldValue属性与527972140的FieldValue属性不相等时为true,否则为false,即对于V4忽略V3的compareOperation和value。

2.2.2 定义2:中间变量MidVar

中间变量MidVar包含一个alias(唯一标识)、expression(表达式,连接符含“&&”或“||”等,表达式中只能出现已定义过的点变量、中间变量和连接符)、compareOperation(包括“==”“!=”)和一个value(Bool类型)。每个中间变量逻辑表达式最后运算的结果为一个Bool类型。中间变量举例如下。

{"alias" : "M1", "expression" : "V1 && V2", "compareOperation" : "==", "value" : true,},即{M1: V1 && V2 ==true},中间变量M1表示逻辑表达式“V1 && V2 ==true”的结果,即V1和V2的值都为true时M1的值为true,否则M1为false;

{"alias" : "M2", "expression" : "M1 && V2","compareOperation" : "==", "value" : true,},即{M2: M1 || V2 ==true},中间变量M2表示逻辑表达式“M1&& V2 ==true”的结果,即M1或者V2的为true时M2的值为true,否则M2为false。

2.3 场景步骤设计

场景是包含一系列数据变化的集合,若定义每个数据变化为一个场景步骤,则一个场景将包含多个场景步骤。每个场景步骤包含一个alias(唯一标识)、ID(数据对象的ID)、attribute(数值类型属性)、value以及一个event事件组合,event中可以包含delay(表示执行步骤前延时的毫秒时间)、condition(表示执行步骤的前提,一般配置为中间变量/点变量,当该中间变量/点变量的值为真时,这个步骤的前提条件得以满足,若delay与condition同时存在,则先执行delay后再判断condition)、在配置condition时还允许配置检测周期次数conditionCycleCount以及周期检测间隔时间conditionCyclePeriod(ms),表示在conditionCycleCount个周期内每隔conditionCyclePeriod时间检查condition,若condition为真则该步骤的条件满足,直至次数到后若该条件仍未满足,则该步骤失败。场景步骤举例如下。

{"alias" : "S2", "id" : 518523516, "attribute" : "FieldState", "value" : "1","event" : {"condition" : "M1","conditionCycleCount":20, "conditionCyclePeriod" : 1000,"delay" : 200,}},步骤S2表示延时200ms后在20个周期(每个周期1000ms)内循环检测中间变量M1,如果在周期内检测到其值为true则执行该步骤,即将518523516的FieldState属性设置为1;若一直检测不到值为true,则该步骤失败,场景执行失败。

2.4 场景文件设计

本方案使用配置文件组织场景中出现的各种数据,每个配置文件包含场景的基本信息、变量信息、场景步骤等,基于以上定义,设计如典型场景配置文件结构(见图1),文件使用JSON(JavaScript Object Notation)数据格式进行组织。

图1 基于数据点对象的场景配置文件设计

(1)场景的基本信息。

①scenceName:场景名称。

②scenceDescription:场景描述。

③sceneEnabled:是否启用场景,true启用(表示参与到所有的场景联动之中,在条件得以满足均会自动执行此场景),false停用(表示不参与到所有的场景联动之中,即使条件满足也不会自动执行)。

④isCycledScene:是否为循环场景,true循环场景,false非循环场景。

⑤onTimeExec:定时执行场景的时间,大于当前时间为有效,否则无效。定时到达后,忽略场景执行条件直接执行。

⑥onConditionExec:条件执行场景的条件表达式,可配置为中间变量/点变量,每次在条件表达式的结果从false变位true时自动执行一次场景。

(2)点变量集合。

(3)中间变量集合。

(4)场景步骤集合,在场景运行时,依次执行各步骤(各步骤执行前按要求进行延时、周期检测,满足条件后执行)。

3 基于多线程的场景实现设计

培训仿真系统中的业务由场景进行,要培训仿真的业务越多,配置的场景就越多,如何将所有场景协同运行起来至关重要,文章设计了一种基于多线程协同的场景实现方案,可以有效联动所有场景。场景具有3种触发执行的条件。

(1)定时执行:要求场景配置为启用,定时时间到后,立即执行场景,若场景为循环场景则一直在后台循环执行。

(2)条件执行:要求场景配置为启用,后台循环检测场景的条件,在每次条件表达式的结果从false变为true时执行一次。

(3)立即执行:立即执行一次场景。

所有场景的执行都受控于教学状态,只有教学状态为开始时才能执行,当教学状态设置为暂停时所有已经在执行中的场景在执行完当前步骤后暂停,等待教学状态再变为开始后继续执行,当教学状态设置为结束时结束所有场景的执行。

基于多线程的后台场景实现方式主要包括3种线程,主线程一个,定时检测子线程一个,场景执行子线程N个(0≤N视同时执行的场景个数而定)。(1)主线程:负责场景文件的解析与加载,监听所有场景文件是否需要立即执行,并负责启动定时检测子线程。(2)定时检测子线程:每秒对定时类型的场景进行检测,定时到后启动子线程执行该场景,同时,对条件类型的场景条件表达式进行检测,若其条件表达式的值从false变为true,则启动子线程执行一次。(3)场景执行子线程:负责场景内容的具体执行,其可由主线程、定时检测子线程启动,各场景执行子线程相互独立。

4 结语

文章在电力监控仿真系统中引入场景设计方法,将所有培训、仿真业务导致的一系列数据变化采用场景方式进行配置,并合理设计了对象数据结构及配置文件组织方式,通过采用简便直观的配置工具极大地降低了仿真场景过程的配置工作。场景执行使用多线程并行方式可仿真各类场景的全景联动,而不是单纯模拟一个场景的运行,极大地还原了真实的工况,有助于受训学员了解最真实的现场状况。

变量符号多者可在正文前单独列出,少的直接在公式后解释即可。符号与解释之间用破折号,单位与解释之间用逗号隔开,字母和数字使用6号Times New Roman,汉字使用6号宋体。

猜你喜欢
表达式线程对象
神秘来电
一个混合核Hilbert型积分不等式及其算子范数表达式
表达式转换及求值探析
浅析C语言运算符及表达式的教学误区
攻略对象的心思好难猜
浅谈linux多线程协作
基于熵的快速扫描法的FNEA初始对象的生成方法
区间对象族的可镇定性分析
基于上下文定界的Fork/Join并行性的并发程序可达性分析*
Linux线程实现技术研究