李佑文,褚紅健,蔡一磊
(南京國電南自軌道交通工程有限公司,江蘇 南京 210032)
電力監(jiān)控系統(tǒng)通過對軌道交通供電系統(tǒng)主變電所、牽引變電所、降壓變電所等全線供電設(shè)備數(shù)據(jù)的監(jiān)視和控制,以確保牽引供電和全線電力變、配電系統(tǒng)的安全可靠運行[1]。由于電力監(jiān)控系統(tǒng)的復(fù)雜性和系統(tǒng)設(shè)備價格昂貴以及受到現(xiàn)場環(huán)境、安全性等限制,直接在現(xiàn)場的真實系統(tǒng)上進行學(xué)習(xí)和培訓(xùn)顯得不切實際[2-3],因此,需設(shè)計一種數(shù)字化的電力監(jiān)控培訓(xùn)仿真系統(tǒng)。該系統(tǒng)通過模擬電力監(jiān)控中各類設(shè)備的運行工況,提供電氣設(shè)備操作、系統(tǒng)運行方式、事故處理等場景的培訓(xùn);提高電調(diào)人員日常操作技能水平,培養(yǎng)其對供電系統(tǒng)異常和事故工況的判斷與處理能力;避免各種事故特別是人為原因引起的誤操作事故的發(fā)生,最終減少人為系統(tǒng)故障、降低運營公司成本,保證供電系統(tǒng)的連續(xù)穩(wěn)定運行。
電力監(jiān)控培訓(xùn)仿真系統(tǒng)的功能經(jīng)歷了從單一到綜合、從簡單到復(fù)雜的發(fā)展,其作用也由演示性轉(zhuǎn)變?yōu)橹笇?dǎo)性,已然成為電力監(jiān)控自動化的一個重要產(chǎn)品,同時也是電力控制中心培訓(xùn)操作員的得力工具[4]。
電力監(jiān)控培訓(xùn)仿真系統(tǒng)的核心內(nèi)容是生成不同的培訓(xùn)、仿真場景,并盡可能多地滿足各類培訓(xùn)、仿真業(yè)務(wù)場景。仿真業(yè)務(wù)包括設(shè)備仿真、控制仿真、線路仿真、五防連鎖仿真、聯(lián)動仿真,培訓(xùn)業(yè)務(wù)包括日常培訓(xùn)、操作培訓(xùn)、正常工況、異常工況、事故處理培訓(xùn)等。
從系統(tǒng)軟件設(shè)計角度出發(fā),場景可抽象定義為電力監(jiān)控系統(tǒng)內(nèi)特定條件、事件發(fā)生時導(dǎo)致的一系列數(shù)據(jù)變化的集合。在電力監(jiān)控仿真培訓(xùn)系統(tǒng)中,如何使所有培訓(xùn)、仿真場景有效地聯(lián)動起來,在最大程度上模擬真實現(xiàn)場的聯(lián)動運行工況就十分關(guān)鍵。文章首先設(shè)計一種電力監(jiān)控系統(tǒng)中常用的數(shù)據(jù)對象結(jié)構(gòu),然后依據(jù)數(shù)據(jù)對象與屬性進行數(shù)據(jù)組織,再設(shè)計能夠涵蓋各類場景的配置文件,最后基于多線程實現(xiàn)后臺場景的運行,并使各個場景的運行條件與結(jié)果有效聯(lián)動,達到仿真現(xiàn)場實際聯(lián)動工況的目的。
設(shè)計良好的數(shù)據(jù)對象及組織方式使系統(tǒng)支持各類復(fù)雜場景成為可能,同時可為場景配置、場景執(zhí)行提供更好的支持。將數(shù)據(jù)對象組織成的配置文件是培訓(xùn)仿真場景的核心,連接了場景執(zhí)行、場景配置兩個過程。同時,如何將數(shù)據(jù)對象進行邏輯組織才能最大程度上增強場景配置的靈活性,保證能夠涵蓋并實現(xiàn)各類仿真、培訓(xùn)場景也是最關(guān)鍵的。
任何對數(shù)據(jù)的組織都離不開數(shù)據(jù)對象的設(shè)計。電力監(jiān)控系統(tǒng)中數(shù)據(jù)一般以對象的形式存在,常見的數(shù)據(jù)點對象包括遙信點(Double Point)、遙測點(Measured Value)、遙控點(DoubleCommand)和遙脈點(Integrated Total),每個對象點包括多個屬性,每個屬性對應(yīng)一個值。以DoublePoint對象為示例給出遙信點對象設(shè)計如表1所示。
表1 Double Point對象示例
為實現(xiàn)場景運行的前置條件,需要對設(shè)計數(shù)據(jù)對象組織方式,定義以下兩個概念。
2.2.1 定義1:點變量Var
點變量Var包含一個alias(唯一標識)、ID(數(shù)據(jù)對象的ID)、attribute(數(shù)值類型屬性)、compareOperation(包括“>”“<”“==”“!=”“≥”“≤”)和一個value(數(shù)值類型,可以為已定義過的其他點變量的alias,如果為alias,則表示取該alias點id的attribute值)。每個點變量邏輯表達式最后運算的結(jié)果為一個Bool類型。點變量舉例如下。
{"alias" : "V3", "id" : 527972140,"attribute" : "FieldValue","compareOperation" : ">", "value" : "5"},即{V3: 527972140-> FieldValue >5},點變量V3表示數(shù)據(jù)點527972140的FieldValue屬性大于5時為true,否則為false;
{"alias" : "V4", "id" : 527972141,"attribute" : "FieldValue","compareOperation" : "!=", "value" : "V3"},即{V4: 527972141-> FieldValue != 527972140-> FieldValue },點變量V4表示數(shù)據(jù)點527972141的FieldValue屬性與527972140的FieldValue屬性不相等時為true,否則為false,即對于V4忽略V3的compareOperation和value。
2.2.2 定義2:中間變量MidVar
中間變量MidVar包含一個alias(唯一標識)、expression(表達式,連接符含“&&”或“||”等,表達式中只能出現(xiàn)已定義過的點變量、中間變量和連接符)、compareOperation(包括“==”“!=”)和一個value(Bool類型)。每個中間變量邏輯表達式最后運算的結(jié)果為一個Bool類型。中間變量舉例如下。
{"alias" : "M1", "expression" : "V1 && V2", "compareOperation" : "==", "value" : true,},即{M1: V1 && V2 ==true},中間變量M1表示邏輯表達式“V1 && V2 ==true”的結(jié)果,即V1和V2的值都為true時M1的值為true,否則M1為false;
{"alias" : "M2", "expression" : "M1 && V2","compareOperation" : "==", "value" : true,},即{M2: M1 || V2 ==true},中間變量M2表示邏輯表達式“M1&& V2 ==true”的結(jié)果,即M1或者V2的為true時M2的值為true,否則M2為false。
場景是包含一系列數(shù)據(jù)變化的集合,若定義每個數(shù)據(jù)變化為一個場景步驟,則一個場景將包含多個場景步驟。每個場景步驟包含一個alias(唯一標識)、ID(數(shù)據(jù)對象的ID)、attribute(數(shù)值類型屬性)、value以及一個event事件組合,event中可以包含delay(表示執(zhí)行步驟前延時的毫秒時間)、condition(表示執(zhí)行步驟的前提,一般配置為中間變量/點變量,當(dāng)該中間變量/點變量的值為真時,這個步驟的前提條件得以滿足,若delay與condition同時存在,則先執(zhí)行delay后再判斷condition)、在配置condition時還允許配置檢測周期次數(shù)conditionCycleCount以及周期檢測間隔時間conditionCyclePeriod(ms),表示在conditionCycleCount個周期內(nèi)每隔conditionCyclePeriod時間檢查condition,若condition為真則該步驟的條件滿足,直至次數(shù)到后若該條件仍未滿足,則該步驟失敗。場景步驟舉例如下。
{"alias" : "S2", "id" : 518523516, "attribute" : "FieldState", "value" : "1","event" : {"condition" : "M1","conditionCycleCount":20, "conditionCyclePeriod" : 1000,"delay" : 200,}},步驟S2表示延時200ms后在20個周期(每個周期1000ms)內(nèi)循環(huán)檢測中間變量M1,如果在周期內(nèi)檢測到其值為true則執(zhí)行該步驟,即將518523516的FieldState屬性設(shè)置為1;若一直檢測不到值為true,則該步驟失敗,場景執(zhí)行失敗。
本方案使用配置文件組織場景中出現(xiàn)的各種數(shù)據(jù),每個配置文件包含場景的基本信息、變量信息、場景步驟等,基于以上定義,設(shè)計如典型場景配置文件結(jié)構(gòu)(見圖1),文件使用JSON(JavaScript Object Notation)數(shù)據(jù)格式進行組織。
圖1 基于數(shù)據(jù)點對象的場景配置文件設(shè)計
(1)場景的基本信息。
①scenceName:場景名稱。
②scenceDescription:場景描述。
③sceneEnabled:是否啟用場景,true啟用(表示參與到所有的場景聯(lián)動之中,在條件得以滿足均會自動執(zhí)行此場景),false停用(表示不參與到所有的場景聯(lián)動之中,即使條件滿足也不會自動執(zhí)行)。
④isCycledScene:是否為循環(huán)場景,true循環(huán)場景,false非循環(huán)場景。
⑤onTimeExec:定時執(zhí)行場景的時間,大于當(dāng)前時間為有效,否則無效。定時到達后,忽略場景執(zhí)行條件直接執(zhí)行。
⑥onConditionExec:條件執(zhí)行場景的條件表達式,可配置為中間變量/點變量,每次在條件表達式的結(jié)果從false變位true時自動執(zhí)行一次場景。
(2)點變量集合。
(3)中間變量集合。
(4)場景步驟集合,在場景運行時,依次執(zhí)行各步驟(各步驟執(zhí)行前按要求進行延時、周期檢測,滿足條件后執(zhí)行)。
培訓(xùn)仿真系統(tǒng)中的業(yè)務(wù)由場景進行,要培訓(xùn)仿真的業(yè)務(wù)越多,配置的場景就越多,如何將所有場景協(xié)同運行起來至關(guān)重要,文章設(shè)計了一種基于多線程協(xié)同的場景實現(xiàn)方案,可以有效聯(lián)動所有場景。場景具有3種觸發(fā)執(zhí)行的條件。
(1)定時執(zhí)行:要求場景配置為啟用,定時時間到后,立即執(zhí)行場景,若場景為循環(huán)場景則一直在后臺循環(huán)執(zhí)行。
(2)條件執(zhí)行:要求場景配置為啟用,后臺循環(huán)檢測場景的條件,在每次條件表達式的結(jié)果從false變?yōu)閠rue時執(zhí)行一次。
(3)立即執(zhí)行:立即執(zhí)行一次場景。
所有場景的執(zhí)行都受控于教學(xué)狀態(tài),只有教學(xué)狀態(tài)為開始時才能執(zhí)行,當(dāng)教學(xué)狀態(tài)設(shè)置為暫停時所有已經(jīng)在執(zhí)行中的場景在執(zhí)行完當(dāng)前步驟后暫停,等待教學(xué)狀態(tài)再變?yōu)殚_始后繼續(xù)執(zhí)行,當(dāng)教學(xué)狀態(tài)設(shè)置為結(jié)束時結(jié)束所有場景的執(zhí)行。
基于多線程的后臺場景實現(xiàn)方式主要包括3種線程,主線程一個,定時檢測子線程一個,場景執(zhí)行子線程N個(0≤N視同時執(zhí)行的場景個數(shù)而定)。(1)主線程:負責(zé)場景文件的解析與加載,監(jiān)聽所有場景文件是否需要立即執(zhí)行,并負責(zé)啟動定時檢測子線程。(2)定時檢測子線程:每秒對定時類型的場景進行檢測,定時到后啟動子線程執(zhí)行該場景,同時,對條件類型的場景條件表達式進行檢測,若其條件表達式的值從false變?yōu)閠rue,則啟動子線程執(zhí)行一次。(3)場景執(zhí)行子線程:負責(zé)場景內(nèi)容的具體執(zhí)行,其可由主線程、定時檢測子線程啟動,各場景執(zhí)行子線程相互獨立。
文章在電力監(jiān)控仿真系統(tǒng)中引入場景設(shè)計方法,將所有培訓(xùn)、仿真業(yè)務(wù)導(dǎo)致的一系列數(shù)據(jù)變化采用場景方式進行配置,并合理設(shè)計了對象數(shù)據(jù)結(jié)構(gòu)及配置文件組織方式,通過采用簡便直觀的配置工具極大地降低了仿真場景過程的配置工作。場景執(zhí)行使用多線程并行方式可仿真各類場景的全景聯(lián)動,而不是單純模擬一個場景的運行,極大地還原了真實的工況,有助于受訓(xùn)學(xué)員了解最真實的現(xiàn)場狀況。
變量符號多者可在正文前單獨列出,少的直接在公式后解釋即可。符號與解釋之間用破折號,單位與解釋之間用逗號隔開,字母和數(shù)字使用6號Times New Roman,漢字使用6號宋體。