王國棟,陳宏君,劉克金
(南京南瑞繼保電氣有限公司,江蘇 南京 211102)
順序控制圖源代碼形成方案設(shè)計(jì)與實(shí)現(xiàn)
王國棟,陳宏君,劉克金
(南京南瑞繼保電氣有限公司,江蘇 南京 211102)
為實(shí)現(xiàn)順序控制功能和狀態(tài)轉(zhuǎn)換功能圖形程序轉(zhuǎn)換成可執(zhí)行的C語言程序,文中設(shè)計(jì)了順序控制圖的圖形化編程符號(hào)、定義符號(hào)的C代碼范式并實(shí)現(xiàn)C代碼生成方法。首先,將順序控制圖形化頁面分為任務(wù)頁面、執(zhí)行步頁面和功能圖子頁面,可清晰地組織可視化程序;其次,設(shè)計(jì)多種符號(hào)塊實(shí)現(xiàn)程序步順序執(zhí)行和轉(zhuǎn)移控制;最后,根據(jù)圖形化編程符號(hào)的拓?fù)漤樞蚝涂刂七壿嬌蓪?duì)應(yīng)的C語言代碼。進(jìn)一步提出基于雙switch-case順序控制圖的任務(wù)函數(shù)代碼生成模式,在第一個(gè)switch結(jié)構(gòu)中更新狀態(tài)變量的值,在第二個(gè)switch結(jié)構(gòu)中根據(jù)新的狀態(tài)變量值運(yùn)行相應(yīng)的控制函數(shù),可在同一個(gè)運(yùn)行周期內(nèi)完成狀態(tài)切換和動(dòng)作執(zhí)行。提高了嵌入式順序功能程序的運(yùn)行效率,適用于高實(shí)時(shí)嵌入式系統(tǒng)的順序控制。
順序控制;雙switch-case;代碼生成;狀態(tài)切換
順序控制圖是指用于設(shè)計(jì)實(shí)現(xiàn)某個(gè)順序控制功能或者狀態(tài)轉(zhuǎn)換功能的圖形程序,它將整個(gè)控制流程分割為一系列的控制步,并描述出生效的執(zhí)行順序和控制條件。圖形化的順序控制圖已經(jīng)在工業(yè)控制等領(lǐng)域中得到了應(yīng)用[1-5]。文獻(xiàn)[1]介紹了基于SIMENS公司生產(chǎn)的S7-200系列機(jī)型,利用指令和內(nèi)部寄存器實(shí)現(xiàn)順序編程的方法。文獻(xiàn)[2]介紹了PLC的SFC在送料小車的應(yīng)用實(shí)例。文獻(xiàn)[3]提出了數(shù)組式編程方法,通過指針尋址功能對(duì)數(shù)組進(jìn)行邏輯運(yùn)算實(shí)現(xiàn)控制功能。文獻(xiàn)[4]通過在上位機(jī)運(yùn)用全組態(tài)配置和后臺(tái)程序搭配的設(shè)計(jì)方法,實(shí)現(xiàn)了混合流程的順序控制。文獻(xiàn)[5]基于IEC 61850標(biāo)準(zhǔn)對(duì)順序控制的過程狀態(tài)和操作配置進(jìn)行建模,設(shè)計(jì)了順序控制功能標(biāo)準(zhǔn)化的狀態(tài)和控制模型,適用于智能變電站順序控制。文獻(xiàn)[6-9]介紹了控制保護(hù)系統(tǒng)的可視化編程軟件設(shè)計(jì)理念,采用圖形化符號(hào)搭建裝置功能。
上述文獻(xiàn)并未闡述圖形化順序控制圖到嵌入式裝置運(yùn)行所需的源代碼生成技術(shù)。文中設(shè)計(jì)了一套基于C語言流程控制結(jié)構(gòu)的圖形化符號(hào)塊,并提出了雙switch-case架構(gòu)的順序控制圖代碼生成方案,可在一個(gè)周期內(nèi)完成狀態(tài)切換和動(dòng)作執(zhí)行,適用于實(shí)時(shí)控制系統(tǒng)。
順序控制圖的原理如圖1所示。相關(guān)的基本概念有事件、狀態(tài)、轉(zhuǎn)換、動(dòng)作,外部事件觸發(fā)狀態(tài)轉(zhuǎn)換,之后執(zhí)行相關(guān)動(dòng)作,并且將輸出或指令傳遞給其他模塊[10-14]。
圖1 順序控制圖的原理
(1)事件(Event):在時(shí)間和空間上占有一定的位置,事件通常會(huì)引起狀態(tài)的變遷,促使?fàn)顟B(tài)機(jī)從一種狀態(tài)切換到另一種狀態(tài),通常指其他輸出變量值發(fā)生變化。
(2)狀態(tài)(State):是對(duì)象在其生命周期中的一種狀況,處于某個(gè)特定狀態(tài)中的對(duì)象會(huì)滿足相關(guān)條件,執(zhí)行某些動(dòng)作或者等待某些事件。
(3)轉(zhuǎn)換(Transition):是兩種狀態(tài)之間的一種關(guān)系,對(duì)象將在狀態(tài)1中執(zhí)行一定的動(dòng)作,并將在滿足某個(gè)特定條件下進(jìn)入狀態(tài)2。
(4)動(dòng)作(Action):指狀態(tài)機(jī)可以執(zhí)行一些原子操作,在順序控制圖中是運(yùn)行一個(gè)執(zhí)行步函數(shù)。
文中,順序控制圖對(duì)應(yīng)的代碼用元件進(jìn)行封裝。元件是基于面向?qū)ο蟮脑O(shè)計(jì)思想,它包括一組數(shù)據(jù)定義和對(duì)數(shù)據(jù)進(jìn)行處理的若干函數(shù),處理完后輸出傳遞給其他元件作為輸入源[6]。其源代碼包括h/c文件,在h文件中定義數(shù)據(jù)結(jié)構(gòu)體,包括輸入變量、輸出變量和參數(shù)等對(duì)外接口,在c文件中定義相關(guān)函數(shù),包括構(gòu)造函數(shù)、初始化函數(shù)、功能塊函數(shù)、頁面函數(shù)、任務(wù)函數(shù)等。
順序控制圖元件:用于設(shè)計(jì)實(shí)現(xiàn)某個(gè)順序控制功能或者狀態(tài)轉(zhuǎn)換功能的元件,外部事件觸發(fā)其狀態(tài)的轉(zhuǎn)換,并執(zhí)行相應(yīng)的動(dòng)作。順序控制元件的輸入、輸出和參數(shù)變量來自于順序執(zhí)行控制頁面和執(zhí)行步頁面。順序控制圖元件的核心組成部分為:
(1)一個(gè)狀態(tài)轉(zhuǎn)換變量,根據(jù)狀態(tài)變量的當(dāng)前值運(yùn)行相應(yīng)執(zhí)行步頁面功能;
(2)狀態(tài)轉(zhuǎn)換控制的規(guī)則,通過設(shè)計(jì)順序執(zhí)行控制頁面來實(shí)現(xiàn)。
順序控制圖頁面類型有順序執(zhí)行控制頁面、執(zhí)行步頁面、功能圖子頁面。其頁面功能設(shè)計(jì)如下:
(1)順序執(zhí)行控制頁面:用于設(shè)計(jì)順序控制或狀態(tài)轉(zhuǎn)換的頁面(可支持多頁)。順序執(zhí)行控制頁面通過執(zhí)行步和轉(zhuǎn)移塊的前后連接關(guān)系實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換的規(guī)則。
(2)執(zhí)行步頁面:執(zhí)行步頁面代表執(zhí)行步塊所對(duì)應(yīng)的功能,代碼生成時(shí)將該頁面的功能封裝成一個(gè)函數(shù),供順序控制任務(wù)函數(shù)調(diào)用。執(zhí)行步頁面通常由各種功能塊組成計(jì)算或邏輯功能,原則上不包含子元件塊。
(3)功能圖子頁面:在一個(gè)層次化的設(shè)計(jì)中用于代表一個(gè)子功能圖頁面的圖塊,將子功能圖頁面中的輸入輸出作為該圖塊的輸入輸出顯示在執(zhí)行步頁面上。當(dāng)執(zhí)行步的頁面功能比較復(fù)雜時(shí),可以通過若干功能圖子頁面進(jìn)行分解,然后在執(zhí)行步頁面連接子頁面的輸入輸出,在代碼生成時(shí),將子頁面對(duì)應(yīng)的符號(hào)復(fù)制到執(zhí)行步頁面。
用于順序控制的圖形符號(hào)有:起始符號(hào)塊、執(zhí)行步塊、無條件轉(zhuǎn)移塊、IF塊、單IF_ELSE塊、雙IF_ELSE塊、雙IF_ELSE塊、SWITCH_CASE塊。圖2是各種符號(hào)的圖形化形態(tài),其中SWITCH_CASE塊根據(jù)分支數(shù)目動(dòng)態(tài)調(diào)整顯示。
圖2 順序控制符號(hào)塊
各個(gè)符號(hào)功能設(shè)計(jì)如下:
(1)起始符號(hào)塊:在順序執(zhí)行控制頁面中,起始符號(hào)塊用于自動(dòng)形成一個(gè)狀態(tài)機(jī)變量,該變量作為元件中的成員變量,初始化為0。
(2)執(zhí)行步塊:代表一個(gè)執(zhí)行步頁面,對(duì)應(yīng)一個(gè)狀態(tài),點(diǎn)擊可以進(jìn)入相應(yīng)的功能圖設(shè)計(jì)頁面。執(zhí)行步塊表示運(yùn)行該執(zhí)行步頁面的功能函數(shù)。元件的結(jié)構(gòu)定義為SFCComp,則執(zhí)行步塊對(duì)應(yīng)的函數(shù)形式為:
void runPageIndex(SFCComp* pcp)
(3)無條件轉(zhuǎn)移塊:表示根據(jù)上一狀態(tài),直接跳轉(zhuǎn)到另外一個(gè)狀態(tài)值。其代碼原型為:
pcp->sta=new_stat;
(4)IF塊:根據(jù)某個(gè)變量值來決定是否轉(zhuǎn)移或轉(zhuǎn)移到哪一個(gè)狀態(tài)。判斷變量可以是程序設(shè)計(jì)頁面中的輸入變量、輸出變量、成員變量,為二值(0、1)類型。IF塊需要指定判斷變量名。其代碼原型為:
if(pcp->var){pcp->state=stax;}
(5)單IF_ELSE塊:根據(jù)判斷變量的值決定執(zhí)行哪條分支。單IF_ELSE對(duì)應(yīng)的代碼原型為:
if(pcp->var){pcp->state=stax;}
else{pcp->state=stay;}
(6)雙IF_ELSE塊:有三個(gè)輸出點(diǎn),需要指定兩個(gè)條件判斷變量,支持在ELSE分支中有子IF_ELSE條件。其代碼原型為:
if(pcp->var1)
{pcp->state=stax;}
else{
if(pcp->var2)
{pcp->state=stay1;}
else
{pcp->state=stay2;}
}
(7)SWITCH_CASE塊:需要用戶設(shè)定case的分支數(shù),和每個(gè)分支的設(shè)置值,其圖形需要根據(jù)分支數(shù)動(dòng)態(tài)生成。對(duì)應(yīng)的代碼原型為:
switch(pcp->var)
{
case value_0:pcp->state=stax; break;
case value_1:p->state=stay;break;
default:break;
}
5.1 頁面規(guī)則設(shè)計(jì)
順序執(zhí)行控制頁面的規(guī)則如下:
(1)順序執(zhí)行控制頁面的功能封裝成元件的一個(gè)任務(wù)函數(shù)(默認(rèn)為任務(wù)等級(jí)1的函數(shù)),在每個(gè)任務(wù)周期里執(zhí)行此任務(wù)函數(shù),該函數(shù)決定狀態(tài)跳轉(zhuǎn)的規(guī)則;
(2)該頁面允許存在的符號(hào)有起始符號(hào)塊、執(zhí)行步塊、轉(zhuǎn)移條件塊、連接線、輸入塊、輸出塊和頁面鏈接符號(hào)(指存在多頁的情形);
(3)該頁面的連接線不表示數(shù)據(jù)流的關(guān)系,只表示執(zhí)行順序和狀態(tài)切換的規(guī)則;
(4)該頁面符號(hào)的輸出連接點(diǎn)只能連接一條連接線,表示只跳轉(zhuǎn)到一個(gè)狀態(tài),輸入連接點(diǎn)可以連接多條連接線,表示可以由不同的其他狀態(tài)轉(zhuǎn)移到本狀態(tài);
(5)一個(gè)執(zhí)行步塊的后繼一般為轉(zhuǎn)移塊(條件轉(zhuǎn)移和無條件轉(zhuǎn)移),若存在多個(gè)執(zhí)行步塊順序串聯(lián)在一起,則這些執(zhí)行步塊等同為一個(gè)狀態(tài);
(6)只能有一個(gè)起始符號(hào)塊,至少有一個(gè)執(zhí)行步塊和條件轉(zhuǎn)移塊;
(7)轉(zhuǎn)移塊的后繼必須是執(zhí)行步塊,IF塊和無條件轉(zhuǎn)移塊必須有后繼,IF_ELSE、SWITCH_CASE必須至少有一個(gè)分支為執(zhí)行步塊的后繼;
(8)執(zhí)行步塊的后繼一般為轉(zhuǎn)移塊,如果是轉(zhuǎn)移塊,轉(zhuǎn)移條件需設(shè)定為一個(gè)狀態(tài)值。如果存在多個(gè)轉(zhuǎn)移塊串聯(lián),則這些轉(zhuǎn)移塊的狀態(tài)值相同,必須是一個(gè)整體,不能有分支。
執(zhí)行步頁面的規(guī)則如下:
(1)該頁面可以包含輸入塊、輸出塊、參數(shù)塊、常量塊、功能圖子塊、頁面鏈接符號(hào)、連接線、功能塊等符號(hào);
(2)該頁面設(shè)計(jì)的功能相對(duì)獨(dú)立、清晰,允許各功能圖頁面之間通過頁面鏈接符號(hào)進(jìn)行數(shù)據(jù)流交換(定義為元件中的私有變量);
(3)所有功能圖頁面功能塊的任務(wù)等級(jí)都相同,功能塊之間的連接線變量定義為函數(shù)中的局部變量。
功能圖子頁面的規(guī)則為:子頁面內(nèi)不再包含功能圖子塊符號(hào),只支持一層嵌套關(guān)系。
5.2 雙switch-case控制函數(shù)結(jié)構(gòu)設(shè)計(jì)
順序控制頁面任務(wù)函數(shù)的代碼,采用兩個(gè)switch結(jié)構(gòu),第一個(gè)switch結(jié)構(gòu)更新狀態(tài)變量的值,第二個(gè)switch結(jié)構(gòu)根據(jù)新的狀態(tài)變量,運(yùn)行相應(yīng)的控制執(zhí)行函數(shù),控制執(zhí)行函數(shù)運(yùn)行在同一個(gè)周期。以圖3的順序控制頁面為例,有3個(gè)狀態(tài),2個(gè)執(zhí)行步頁面,3個(gè)條件判斷跳轉(zhuǎn)符號(hào)。
圖3 順序執(zhí)行控制頁面示例
其C函數(shù)代碼原型定義為:
void sfcControlFunc(SfcComp* pcp)
{
switch(pcp->state) //transfer the state
{
case 0:
if(pcp->var0)
{pcp->state=1;}
else
{pcp->state=2;}
break;
case 1:
if(pcp->var1)
{pcp->state=2;}
break;
case 2:
if pcp->var2)
{pcp->state=1;}
break;
default:
pcp->state=0;
break;
}
switch(pcp->state) //action
{
case 0:break;
case 1:runPage1(pcp); break;
case 2:runPage2(pcp); break;
default:break;
}
}
6.1 模塊劃分
順序控制圖程序代碼形成工具,劃分為5個(gè)部分:
(1)符號(hào)數(shù)據(jù)模塊:對(duì)程序設(shè)計(jì)頁面中的各種符號(hào)進(jìn)行建模。
(2)數(shù)據(jù)組織模塊:負(fù)責(zé)對(duì)頁面、元件文件數(shù)據(jù)進(jìn)行管理。
(3)數(shù)據(jù)處理模塊:形成元件內(nèi)符號(hào)的連接關(guān)系并對(duì)符號(hào)進(jìn)行拓?fù)渑判?;形成層次化元件關(guān)系;檢查圖形化程序設(shè)計(jì)規(guī)則;對(duì)預(yù)編譯語句進(jìn)行解析處理。
(4)代碼生成模塊:形成元件的h/c源代碼和配置文件。
(5)編譯鏈接模塊:形成每個(gè)處理器的MakeFile,并調(diào)用交叉編譯器,形成可執(zhí)行程序。
基于常規(guī)FBD模式的功能圖代碼形成,已有文獻(xiàn)闡述[6],下節(jié)闡述順序控制圖任務(wù)函數(shù)代碼形成算法。
6.2 順序控制任務(wù)函數(shù)代碼形成算法
順序控制任務(wù)函數(shù)是元件中最關(guān)鍵的周期運(yùn)行函數(shù),該算法步驟如圖4所示。
如圖4所示,讀取控制頁面的數(shù)據(jù),解析相關(guān)符號(hào)和連接線信息,形成各符號(hào)的數(shù)據(jù)類實(shí)例。之后從起始符號(hào)開始,按照深度優(yōu)先遍歷的排序算法,填充與符號(hào)輸入點(diǎn)關(guān)聯(lián)的前驅(qū)符號(hào)鏈表、填充與符號(hào)輸出點(diǎn)關(guān)聯(lián)的后繼符號(hào)鏈表。之后匯總執(zhí)行步個(gè)數(shù),并設(shè)置各個(gè)執(zhí)行步對(duì)應(yīng)的狀態(tài)編碼。然后形成第1、2個(gè)switch-case語句結(jié)構(gòu)代碼,最后輸出C代碼文本。
圖4 順序控制任務(wù)函數(shù)形成步驟
第1個(gè)switch_case結(jié)構(gòu)的關(guān)鍵算法代碼為:
for(int i=1;i<=stateNum;i++){
m_txt+="case"+QString::number(i);
CSFCRunBlock*prb=searchStepRunBlock(i);
bool bHasSameNextSybl=false;
for(int j=i+1;j<=stateNum;j++){
CSFCRunBlock*ptmp=searchStepRunBlock(j);
if(prb && ptmp){
if(prb->m_nextSybl==ptmp->m_nextSybl){
bHasSameNextSybl=true;
break;
}}}
if(bHasSameNextSybl){m_txt+=": ";}
else
{
m_txt+=": { ";
QString str;
if(prb) makeSfcBlockCode(str,rb->m_nextSybl);
m_txt+=str+"} break; " ;
}}
第二個(gè)switch_case結(jié)構(gòu)的關(guān)鍵算法代碼為:
for(i=1;i<=stateNum;i++){
QList
m_txt+="case"+QString::number(i);
m_txt+=": ";
searchStepRunBlockList(list,i);
foreach(CSFCRunBlock*prb,list)
{
QString fname; getPageDocFuncName(fname,prb);
QString refName=prb->getRefPageName();
CPage*pdoc=pcp->searchPage(refName);
if(pdoc) m_txt+=fname;
}
m_txt+="break; " ;
}
文中提出一種基于C語言流程結(jié)構(gòu)符號(hào)的方案實(shí)現(xiàn)順序控制圖的可視化建模方法,將頁面分為順序功能頁面、執(zhí)行步頁面、功能圖子頁面,通過層次模型管理可視化程序,設(shè)計(jì)了順序控制代碼轉(zhuǎn)換規(guī)則,并以雙switch-case的代碼模式提高了順序控制圖的運(yùn)行效率。基于文中設(shè)計(jì)的順序控制圖已經(jīng)在直流輸電保護(hù)控制裝置中進(jìn)行了應(yīng)用,滿足了高實(shí)時(shí)性要求的順序控制需求。
[1] 王丁磊,郭 濤.PLC順序控制的編程方法及應(yīng)用[J].機(jī)電一體化,2011(4):102-104.
[2] 齊傳剛,熊永超,邵 娜.PLC的SFC圖在編寫順序控制梯形圖中的應(yīng)用[J].遼寧工程技術(shù)大學(xué)學(xué)報(bào):自然科學(xué)版,2006,25:234-236.
[3] 時(shí)文飛.數(shù)組式編程方法在PLC編程中的應(yīng)用[J].電氣傳動(dòng),2014,44(1):85-87.
[4] 翁 元.基于上位機(jī)的混合流程順序控制系統(tǒng)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2014,23(6):42-47.
[5] 樊 陳,倪益民,竇仁暉,等.智能變電站順序控制功能模塊化設(shè)計(jì)[J].電力系統(tǒng)自動(dòng)化,2012,36(17):67-71.
[6] 劉克金,陳宏君,馮亞東,等.新一代控制保護(hù)系統(tǒng)可視化編程軟件設(shè)計(jì)與實(shí)現(xiàn)[J].工業(yè)控制計(jì)算機(jī),2014,27(10):82-84.
[7] 盧 娟,李兆成,陳鋼杰,等.保護(hù)與測(cè)控領(lǐng)域通用可視化平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J].電力系統(tǒng)自動(dòng)化,2005,29(4):58-61.
[8] 鄧秋娥,杜奇壯,盧 娟.可視化編程在微機(jī)保護(hù)中的實(shí)現(xiàn)[J].繼電器,2008,36(3):1-4.
[9] 姚 成,黃國方,周邵亮,等.軟PLC技術(shù)應(yīng)用于智能保護(hù)測(cè)控裝置的實(shí)現(xiàn)方案[J].電力系統(tǒng)自動(dòng)化,2010,34(23):115-118.
[10] 馮亞東,陳宏君,劉克金,等.一種順序功能圖的可視化實(shí)現(xiàn)方法:CN,201210036915.9[P].2012-07-25.
[11] Kernighan B K,Ritchie D M.The C programming language[M].Beijing:China Machine Press,2006.
[12] Aho A V,Lam M S,Sethi R,et al.Compilers:principles,techniques,and tools[M].2nd ed.Beijing:China Machine Press,1986.
[13] Lewis R W.Programming industrial control systems using IEC 1131-3[D].London:The Institution of Electrical Engineers,1995.
[14] Hoppe G.Software motion control with IEC61131-3 motion profile interface the system independent set of function blocks[C]//Proc of TECH/EXPO technology update conference.[s.l.]:[s.n.],2001:463-472.
Design and Implementation of Source Code Generation for SFC Graphical Program
WANG Guo-dong,CHEN Hong-jun,LIU Ke-jin
(NR Electric Co.,Ltd.,Nanjing 211102,China)
To generate source code for SFC graphical program,it presents a source code generation scheme which designs graphical programming symbols for Sequential Function Chart (SFC) and defines C code normal form for the symbols and generates real C code finally in this paper.Firstly,the scheme divides sequential function chart pages into three types including task page,execution step page and functional graph page,and manages all pages hierarchically.Then it designs various graphical symbols to achieve sequential execution and transfer control of SFC graph.Finally,it generates C code according to the topological structure and control logic of these graphical symbols.This scheme further promotes source code generation approach for dual switch-case SFC graph page by updating the value of status variables in the first switch structure and executing corresponding control functions in the second switch structure according to the updated status variables,thus completing status switching and function execution in exactly one operation cycle.It increases execution efficiency of embedded sequential function programs,which is suitable for sequence control of high real-time embedded systems.
SFC;dual switch-case;code generating;state switching
2015-06-08
2015-09-14
時(shí)間:2016-02-18
國家“863”高技術(shù)發(fā)展計(jì)劃項(xiàng)目(2015AA050101)
王國棟(1988-),男,碩士,工程師,研究方向?yàn)榭梢暬幊誊浖?/p>
http://www.cnki.net/kcms/detail/61.1450.TP.20160218.1630.030.html
TP31
A
1673-629X(2016)03-0149-05
10.3969/j.issn.1673-629X.2016.03.035