遲海龍,袁平路,鄧鵬程,周 文
(1.中國水利水電科學(xué)研究院自動化所,北京 100038;2.五凌電力有限公司,湖南 長沙 410029)
傳輸規(guī)約IEC 60870-5-103(以下簡稱103規(guī)約)繼電保護設(shè)備信息交換標準是在IEC 60870-5系列標準的基礎(chǔ)上,對物理層、鏈路層、應(yīng)用層、用戶進程作了大量的具體的規(guī)定和定義。其目的是為了保障變電站或廠站中不同繼電保護設(shè)備(或間隔單元)和控制系統(tǒng)之間能夠順利地互換信息。標準內(nèi)容可參考我國等同采用的DL/T-667[1]電力行業(yè)標準。標準描述了2種方法:①基于嚴格規(guī)定的應(yīng)用服務(wù)數(shù)據(jù)單元(ASDUx,其中字母x為數(shù)據(jù)編號,以下同)和標準化報文的傳輸應(yīng)用過程、方法;②通用分類服務(wù)法。本文只針對前者的通信方法進行討論。
103規(guī)約實現(xiàn)的模型源于開放互聯(lián)的ISO-OSI的7層參考模型。該規(guī)約實現(xiàn)主要涉及其中的物理層、鏈路層和應(yīng)用層。本文主要針對規(guī)約的鏈路層內(nèi)部及對外接口部分進行討論。本文開展的IEC 103通信主站側(cè)規(guī)約開發(fā)工作借鑒了國內(nèi)其他學(xué)者和科研機構(gòu)在有限狀態(tài)機(finite state machine,F(xiàn)SM)[2-4]的研究成果,取得了較好的效果。
本文所設(shè)定的硬件接口為RS-232或者RS-485,采用的傳輸模式為一對多的非平衡傳輸模式。同一時刻內(nèi)只有一個從站使用通信鏈路。主站需要將每個從站的通信狀態(tài)信息記錄到本地的狀態(tài)信息庫中,以便作出正確的回應(yīng)。
103規(guī)約鏈路層采用FT1.2幀格式[5]。傳輸過程可分為數(shù)據(jù)采集(上行)和命令(下行)2個方向。通信過程中,主站和從站之間通過若干個請求/確認或者指示/響應(yīng)服務(wù)原語[6]進行數(shù)據(jù)交換,以達到兩端數(shù)據(jù)一致。
1.2.1 初始化過程
103規(guī)約開始工作后,主站順次輪詢各從站的用戶數(shù)據(jù)。如果從站產(chǎn)生數(shù)據(jù),通過置位要求訪問位(access demand,ACD)標志位[5],并上送數(shù)據(jù)幀請求主站查詢數(shù)據(jù)。初始化中也要進行超時重傳、時間同步和設(shè)備信息采集等工作。
1.2.2 數(shù)據(jù)采集過程
裝置初始化后,主站周期性地順次召喚每個間隔單元召喚2級用戶數(shù)據(jù)。具體過程可參考文獻[5]、文獻[6]。
1.2.3 命令控制過程
命令傳輸過程有2種:①選擇和執(zhí)行命令;②直接命令。詳細的過程參見文獻[6] 。由于控制系統(tǒng)對命令的時效性要求較高,所以本文后續(xù)重點討論FSM對命令中斷處理的過程。
1.2.4 異常超時處理過程
基于狀態(tài)的程序中必須要考慮中間過渡態(tài)的超時返回問題。如果中間態(tài)在通信過程中出現(xiàn)擾動而產(chǎn)生異常,可能使中間態(tài)無法復(fù)位到起始或者接收的最終狀態(tài)。所以在所有中間的過渡狀態(tài)上,必須加上超時返回處理過程。當系統(tǒng)處于中間過程而長時間收不到返回的消息時:系統(tǒng)要么進行超時重傳工作,再次發(fā)送數(shù)據(jù)請求;要么定時將系統(tǒng)狀態(tài)強制到系統(tǒng)的起始狀態(tài)或接收狀態(tài),以便系統(tǒng)重新復(fù)位設(shè)備重建鏈路等工作。
FSM[7]是一個五元組,即M=(S,δ,Σ,s,A)。其中:S為有限的狀態(tài)集合,代表系統(tǒng)的各個狀態(tài)集合;δ為從S×Σ到S的狀態(tài)轉(zhuǎn)移函數(shù);Σ為各個通信事件;s為初始狀態(tài),s∈S,可表示為二維表格形式;A為消息處理槽函數(shù)集合。
狀態(tài)樹即狀態(tài)搜索樹,由狀態(tài)節(jié)點和邊構(gòu)成:節(jié)點代表每個狀態(tài);邊為每個狀態(tài)之間的從屬關(guān)系。按照SCXML[8]規(guī)范,狀態(tài)樹中狀態(tài)可以分為頂層狀態(tài)(樹根節(jié)點)、原子狀態(tài)(不可分狀態(tài),樹葉節(jié)點)和組合狀態(tài)(中間層節(jié)點)。定義原子狀態(tài)是一個沒有子狀態(tài)的狀態(tài)。復(fù)合狀態(tài)由原子狀態(tài)、復(fù)合態(tài)或它們的組合構(gòu)成。邊可分為父子關(guān)系邊、歷史狀態(tài)、初始狀態(tài)邊等信息。
FSM狀態(tài)轉(zhuǎn)移圖和狀態(tài)樹關(guān)系的關(guān)系如下:轉(zhuǎn)移圖表示狀態(tài)間的動態(tài)過渡關(guān)系;狀態(tài)樹則強調(diào)狀態(tài)間的從屬,關(guān)系便于狀態(tài)過渡前的狀態(tài)的搜索和定位。
搜索分為上行搜索和下行搜索。定義:上行搜索為每次選擇的節(jié)點距離根節(jié)點遞減方向為上行搜索;反之,為下行搜索。上行搜索主要沿著父屬性遞歸,搜索以到達根節(jié)點為終止;下行主要根據(jù)業(yè)務(wù)不同選擇子節(jié)點、歷史節(jié)點屬性遞進,搜索以到達葉子節(jié)點為終止。詳細的搜索算法及算例參見4.2節(jié)。
狀態(tài)樹設(shè)計可以自頂向下分層級設(shè)計。先設(shè)計頂層狀態(tài)然后定義狀態(tài)的細節(jié)的個子狀態(tài)。按照1.2節(jié),狀態(tài)樹定義如表1所示。
表1 狀態(tài)樹定義Tab.1 State tree definition
事件作為狀態(tài)機的輸入,是狀態(tài)機正常運轉(zhuǎn)的的激勵和策動源。狀態(tài)機的事件集合部分主要內(nèi)容參見表2。
表2 事件集合Tab.2 Events collection
狀態(tài)轉(zhuǎn)移函數(shù)可以表示行列分別為|S|×|Σ|的二維表格,具體可以反映為由<當前狀態(tài) ,事件 ,跳轉(zhuǎn)狀態(tài) ,動作>構(gòu)成的四元組的集合。其代表當前狀態(tài)下遇到某個事件應(yīng)該轉(zhuǎn)移到跳轉(zhuǎn)狀態(tài)并執(zhí)行響應(yīng)操作。狀態(tài)轉(zhuǎn)移可分為有條件轉(zhuǎn)移和無條件轉(zhuǎn)移。無條件轉(zhuǎn)移就是當遇到任何事件都會跳轉(zhuǎn)的到跳轉(zhuǎn)狀態(tài)。當狀態(tài)搜索樹遇到有無條件轉(zhuǎn)移的節(jié)點時,會立即轉(zhuǎn)移到該節(jié)點的下一狀態(tài)。
槽函數(shù)集合A是FSM對事件的響應(yīng),是FSM執(zhí)行規(guī)約過程的最終體現(xiàn),也是FSM重要組成部分。槽函數(shù)集合如表3所示。
表3 槽函數(shù)集合Tab.3 Slot fuction collection
FSM頂層工作狀態(tài)如圖1所示。
圖1 FSM頂層工作狀態(tài)圖Fig.1 FSM top-level working state diagram
圖1可分為正常工作態(tài)、異常處理態(tài)及設(shè)備初始化狀態(tài)這3個部分。
初始化狀態(tài)負責對對側(cè)設(shè)備的鏈路召喚、復(fù)位傳輸以及同步時鐘等工作。正常工作態(tài)是在主從站設(shè)備通道建立后,負責遙測遙信量的周期召喚、總召喚和命令傳輸?shù)裙ぷ鳌C顐鬏斢兄戎芷谡賳靖叩膬?yōu)先級,所以單獨分組。異常處理態(tài)負責在設(shè)備請求應(yīng)答超時或者鏈路中斷等異常情況下進行恢復(fù)通信的工作。
系統(tǒng)初始化后就進入正常工作態(tài)。此狀態(tài)主要負責遙測遙信采集和命令的傳輸。遙測遙信采集過程的正常工作態(tài)如圖2所示。
圖2 正常工作態(tài)示意圖Fig.3 Normal working state diagram
正態(tài)工作態(tài)由子狀態(tài)s21~s23構(gòu)成。s21為起始狀態(tài)和穩(wěn)定態(tài),其他狀態(tài)均為請求過程中的過渡狀態(tài)。過渡狀態(tài)中均有定時器負責超時后的狀態(tài)復(fù)位到穩(wěn)定態(tài)的工作。系統(tǒng)每次轉(zhuǎn)移到穩(wěn)定態(tài)s21后都會向控制端發(fā)送系統(tǒng)就緒的消息,以便其處理后續(xù)通信工作。
IEC 103規(guī)約主要由負責作業(yè)調(diào)度的主控模塊、FSM模塊和接口消息處理模塊這3個部分組成。主控模塊主要負責系統(tǒng)上電后自檢復(fù)位以及正常掃查召喚的常規(guī)性工作。此模塊也通過消息方式和狀態(tài)機進行互動,在向狀態(tài)機發(fā)送管理指令的同時,接收FSM反饋的異?;蛘吖ぷ骶途w的狀態(tài)信息。FSM模塊是規(guī)約的具體執(zhí)行者,按照之前討論的方式對各種通信的報文指令作出正確的判斷及響應(yīng),并不斷地將自己的工作狀態(tài)向作業(yè)調(diào)度端進行匯報。接口消息處理模塊作為單獨的作業(yè)任務(wù),主要監(jiān)視通信串口發(fā)過來的信息,將發(fā)來的信息進行分類判斷后翻譯成FSM能夠識別的消息和數(shù)據(jù),并轉(zhuǎn)發(fā)給FSM。
FSM的實現(xiàn)已有很多成熟的商業(yè)軟件框架,比如文獻[3]、文獻[9] 采用的Qt自帶的狀態(tài)機[10],以及文獻[11]采用的JAVA中Spring的狀態(tài)機。本文系統(tǒng)由于運行在ARM嵌入式處理器上,對運行的環(huán)境和空間要求比較嚴格,所以采用C語言自定義開發(fā)框架。
FSM的構(gòu)造如2.1節(jié)定義所述。狀態(tài)機為一組狀態(tài)的集合,F(xiàn)SM在確定的時刻里就是某一確定的狀態(tài)元素的體現(xiàn)。框架采用了2.1節(jié)中定義的狀態(tài)樹結(jié)構(gòu)作為記錄狀態(tài)的數(shù)據(jù)庫,便于狀態(tài)節(jié)點的管理和搜索。其中,復(fù)合狀態(tài)具有歷史狀態(tài)和初始狀態(tài)屬性,可方便狀態(tài)組中斷操作中返回中斷前的某個具體狀態(tài)。定義復(fù)合狀態(tài)是為了方便狀態(tài)集合的分組管理,減少狀態(tài)成組遷移的過渡邊的個數(shù)。首先,狀態(tài)結(jié)構(gòu)是一個樹形結(jié)構(gòu),所以每個節(jié)點具有父子節(jié)點屬性,并通過方法addChildState()來增加子節(jié)點同時也將子節(jié)點的父節(jié)點指針屬性指向該節(jié)點。新的狀態(tài)結(jié)構(gòu)體可以通過方法createState()產(chǎn)生。其次,狀態(tài)具有過渡邊集合屬性,該屬性是一個集合可由數(shù)組或者鏈表給出。狀態(tài)可以通過方法addTransition()來增加圖的過渡邊,過渡邊是一個由<事件,目標狀態(tài),槽函數(shù)>構(gòu)成的結(jié)構(gòu)體 。所有的狀態(tài)構(gòu)成了FSM的狀態(tài)S集合(節(jié)點集合)所有狀態(tài)的過渡集合最終構(gòu)成FSM的轉(zhuǎn)移δ集合,即狀態(tài)轉(zhuǎn)移表(狀態(tài)圖邊集合)。每個狀態(tài)在轉(zhuǎn)入時都會啟動超時定時器,并在定時器時間到達后向狀態(tài)機發(fā)送一個超時事件來觸發(fā)狀態(tài)的異常超時處理過程。超時處理可以使狀態(tài)機無論在哪個狀態(tài)都能最終返回設(shè)備就緒狀態(tài),以免FSM陷入某個狀態(tài)中死鎖。FSM按照正常流程或者異常超時流程返回到s21后發(fā)送“處理完畢事件”通知總調(diào)度模塊進行后續(xù)設(shè)備的輪詢。
狀態(tài)樹結(jié)構(gòu)及狀態(tài)轉(zhuǎn)移如圖3所示。
圖3 狀態(tài)樹結(jié)構(gòu)及狀態(tài)轉(zhuǎn)移示意圖Fig.3 State tree structure and state transfer diagram
程序初始階段先創(chuàng)建s1~s4及s21~s23等狀態(tài),之后在通過方法addChildState(sFSM,s1)…addChildState(sFSM,s4)(括號中前者代表父節(jié)點,后者代表子節(jié)點)使sFSM成為具有子狀態(tài)s1~s4的復(fù)合狀態(tài)。同樣讓s2成為具有s21至s23的復(fù)合狀態(tài)。至此就構(gòu)造成了如圖3所示的狀態(tài)樹。接下來通過諸如addTransition(s21,<Σ1,s22)的方法來增加每個節(jié)點的過渡邊信息。括號中:第一個元素為過渡邊始發(fā)狀態(tài);第二元素尖括號中依次為事件、目標狀態(tài)和對應(yīng)槽函數(shù)。不斷重復(fù)該過程,直至將狀態(tài)機的所有過渡邊和狀態(tài)點添加完成。
至此,整個FSM狀態(tài)轉(zhuǎn)移圖和狀態(tài)節(jié)點樹的構(gòu)造工作完畢。以上構(gòu)造的是對應(yīng)一個子站的狀態(tài)圖。由于需要和多個子站輪流通信,上述過程還需重復(fù)多次以構(gòu)建狀態(tài)組數(shù)組。每個狀態(tài)組都與一個設(shè)備對應(yīng)。最后,定義FSM框架為頂級根節(jié)點,依次遍歷數(shù)組中每個成員的sFSM。
FSM的運行其實就是按事件條件在狀態(tài)樹上找到下一步應(yīng)切換的狀態(tài)和所需要的執(zhí)行函數(shù),并不斷狀態(tài)轉(zhuǎn)移過程。stateMachine的fsmRun()方法就是一個狀態(tài)輪詢處理函數(shù)。開始運行時,stateMachine通過setInitial()方法指定某個狀態(tài)為初始運行狀態(tài)(active state);當一個事件到達后,調(diào)用getTransition()方法來遍歷狀態(tài)樹找到下一步的狀態(tài)的過程。按照狀態(tài)的種類和狀態(tài)遷移的方向,可將狀態(tài)轉(zhuǎn)移分為原子狀態(tài)的上行搜索及復(fù)合狀態(tài)的上、下行搜索。
①原子狀態(tài)搜索。
原子狀態(tài)遇到事件到達時,先上行搜索是否有父狀態(tài)(復(fù)合狀態(tài))存在。如果存在,則遞歸地搜索父(復(fù)合)狀態(tài)節(jié)點的過渡信息,一旦找到則立即執(zhí)行父節(jié)點后續(xù)轉(zhuǎn)移操作;否則,在本狀態(tài)內(nèi)搜索對應(yīng)事件及操作并進行跳轉(zhuǎn)處理。
②復(fù)合狀態(tài)的搜索。
上行搜索時,首先將轉(zhuǎn)入的子狀態(tài)寫入history屬性中作壓棧操作,然后在本狀態(tài)內(nèi)搜索對應(yīng)事件并相應(yīng)跳轉(zhuǎn)對應(yīng)狀態(tài)。如果沒有對應(yīng)事件,則再次按照原子狀態(tài)操作作上行搜索操作。復(fù)合狀態(tài)的下行搜索操作首先檢查history指定子狀態(tài)。如果子狀態(tài)還是復(fù)合狀態(tài),則繼續(xù)轉(zhuǎn)入history對應(yīng)狀態(tài)直至返回到最初的原子狀態(tài),并執(zhí)行該原子狀態(tài)后續(xù)的事件響應(yīng)操作。定義歷史狀態(tài)historyState為復(fù)合狀態(tài)的偽裝態(tài)。這是以某個復(fù)合狀態(tài)為父節(jié)點的狀態(tài)。它具有g(shù)etHistoryState()方法,以向下遍歷父狀態(tài)history屬性的方式找到最終的中斷轉(zhuǎn)移前的原子狀態(tài)并返回。
狀態(tài)搜索算法流程如圖4所示。
圖4 狀態(tài)樹搜索算法流程圖Fig.4 Flowchart of sate tree search algorithm
測試算例為起始狀態(tài)為s1,輸入事件序列為[Σ4,Σ1,Σ21,Σ4,Σ22,Σ21]時的狀態(tài)變化情況。為了簡化說明s2內(nèi)部的狀態(tài)轉(zhuǎn)化,簡化圖如圖3(b)所示。運行時,狀態(tài)轉(zhuǎn)移情況和函數(shù)調(diào)用的測試算例如表4所示。其中,狀態(tài)轉(zhuǎn)移序列代表整個轉(zhuǎn)移過程所經(jīng)歷的狀態(tài)節(jié)點路徑,最后一個狀態(tài)也為下一狀態(tài)的起始狀態(tài)。這里討論中斷事件Σ4到達的情況,如表4中第四行所示。此時狀態(tài)正處于s22狀態(tài)節(jié)點上。由圖3(a)可知,s22為原子節(jié)點,此時首先上行查找父節(jié)點s2并置s2的屬性history為s22,如圖3(a)中1號箭頭所示。然后在s2的transitions查找對應(yīng)事件。由于從圖3(a)可知,沒有對應(yīng)事件轉(zhuǎn)移信息,所以s2再次向上跳轉(zhuǎn)父節(jié)sFSM,并在其transitions搜索對應(yīng)事件。從圖3(a)可以看到,在這里可以找到事件Σ4過渡信息并跳轉(zhuǎn)至s4,即圖3(a)中2號、3號箭頭所示。s4執(zhí)行完后返回節(jié)點是sFSM的歷史狀態(tài)且是無條件轉(zhuǎn)移,故通過getHistoryState()方法反向回退至最初的s22狀態(tài),即圖3(a)中4號、5號、6號箭頭所示。從而完成了中斷至s4并返回起點的整個操作。整個狀態(tài)轉(zhuǎn)移過程s4,s2h(s22)(括號中s22為s2h偽狀態(tài)具體內(nèi)容)。搜索過程路徑如表中第4列所示。由此可見本次狀態(tài)搜索和轉(zhuǎn)移達到了預(yù)期的目的。同樣地,超時異常也是一個類似命令中斷的操作過程,只不過返回的路徑不同于去程,是從s3到s1再到s21。從以上過程可以看出,引入復(fù)合節(jié)點s2和sFSM后,s21等子狀態(tài)無需在每個狀態(tài)中增加對s4中斷轉(zhuǎn)移信息,僅對sFSM增添一個轉(zhuǎn)移信息就可使s1到s3及s21到s23所有狀態(tài)的轉(zhuǎn)移處理,從而大大減少了狀態(tài)過渡邊的數(shù)量。
表4 測試算例Tab.4 Test example
103通信系統(tǒng)中,子站需要按照分時順序交替地使用通信鏈路。從站上各個設(shè)備的優(yōu)先級都是相同的,并且通過周期性應(yīng)答輪詢的方式報告本地設(shè)備的參數(shù)信息。主控站也是按照預(yù)設(shè)的順序和步驟周期輪詢子站,如果遇到子站有數(shù)據(jù)請求則相應(yīng)地發(fā)出召喚數(shù)據(jù)。為了縮小單站長時間占用昂貴的通信資源,多環(huán)節(jié)通信處理過程可以拆分成多次進行。因此,設(shè)備的初始化階段和數(shù)據(jù)采集階段可以分兩步進行。第一個周期只負責將從站設(shè)備從初始狀態(tài)召喚至設(shè)備就位狀態(tài)s21。此時,F(xiàn)SM的狀態(tài)數(shù)據(jù)庫(狀態(tài)樹)會為每個子站保留最近一次的工作狀態(tài),并作為下一周期工作的依據(jù)。工作在s2狀態(tài)下的掃查工作可以放到第二個周期內(nèi)進行。按照工作場景的要求,命令處理有一定的實效性需要優(yōu)先安排傳輸。這里需采用4.2節(jié)中闡述的中斷狀態(tài)處理方式。該方式FSM無論處于哪個狀態(tài)都會中斷當前工作,并在保存當前狀態(tài)然后跳轉(zhuǎn)到中斷狀態(tài)處理工作。待中斷過程執(zhí)行完畢后,F(xiàn)SM重新找到歷史狀態(tài)信息并繼續(xù)之前的工作。這樣既可以保障已有工作場景不受破壞,又可以保證高優(yōu)先級的工作得以及時處理。
本文在IEC 103規(guī)約通信控制器系統(tǒng)開發(fā)中,引入FSM及狀態(tài)樹來管理通信狀態(tài),方便了狀態(tài)的搜索和歷史狀態(tài)信息的管理、加強了代碼結(jié)構(gòu)化、擴展性。本文設(shè)計了狀態(tài)搜索樹及算法來擴展FSM的行為表達,使原有按照過渡表單次跳轉(zhuǎn)方式轉(zhuǎn)變?yōu)榘凑諣顟B(tài)類型和實際業(yè)務(wù)連續(xù)多次的定位和跳轉(zhuǎn)方式,讓FSM的行為表達變得更加豐富和精確且滿足SCXML的規(guī)范,為后面業(yè)務(wù)優(yōu)化工作奠定基礎(chǔ)。業(yè)務(wù)優(yōu)化中改過去周期發(fā)送為中斷的命令處理方式可以使實時控制命令響應(yīng)時延控制在200 ms以內(nèi)。本文FSM框架具有自身輕量化、環(huán)境低依賴等特點,可以很方便地應(yīng)用于IEC 104等其他相關(guān)規(guī)約的嵌入式通信開發(fā)中。用于其他通信規(guī)約時,只需修改業(yè)務(wù)狀態(tài)流程圖代碼及處理槽函數(shù)即可,從而讓業(yè)務(wù)代碼和底層代碼分離便于復(fù)用。目前,設(shè)備已應(yīng)用的場景為抽水蓄能電站現(xiàn)地控制通信,現(xiàn)場性能符合預(yù)期。