順序功能圖圖形化組態(tài)軟件的設(shè)計(jì)開發(fā)
時間:2008-12-10 11:37:09來源:dujing
導(dǎo)語:?概述SFC的功能、組成和編程規(guī)則。介紹所開發(fā)的SFC組態(tài)軟件的圖形系統(tǒng)的構(gòu)成。詳盡給出了SFC圖形系統(tǒng)的設(shè)計(jì)方案及其基于VC++的方案實(shí)現(xiàn)。
概述SFC的功能、組成和編程規(guī)則。介紹所開發(fā)的SFC組態(tài)軟件的圖形系統(tǒng)的構(gòu)成。詳盡給出了SFC圖形系統(tǒng)的設(shè)計(jì)方案及其基于VC++的方案實(shí)現(xiàn)。實(shí)踐表明,依據(jù)這一方案設(shè)計(jì)實(shí)現(xiàn)的SFC組態(tài)軟件組態(tài)方式靈活、易于維護(hù)。
一、引言
順序功能圖(SFC)是一種圖形化的組態(tài)語言,主要應(yīng)用于工業(yè)過程控制上位策略組態(tài)程序的編寫,在PLC系統(tǒng)和系統(tǒng)上位組態(tài)軟件中廣泛使用。隨著4C技術(shù)的飛速發(fā)展和工業(yè)過程控制領(lǐng)域自動化程度的日益提高,控制系統(tǒng)上位圖形化的編程模式也越來越受到用戶的青睞。開發(fā)SFC組態(tài)軟件具有非?,F(xiàn)實(shí)的意義[1,2]。
二、SFC的功能和組成
SFC是采用圖形化的方法來描述一個控制程序的順序行為,基于Petri網(wǎng)和IEC848標(biāo)準(zhǔn)Grafce,但又做了必要的修改。將一個程序內(nèi)部組織加以結(jié)構(gòu)化,在保持其總貌的前提下將一個控制問題分解為若干個可管理的部分,由“步”(ste [table][tr][td][/td][/tr][/table]p)和“轉(zhuǎn)換點(diǎn)”(transition)所組成,每個轉(zhuǎn)換點(diǎn)具有一定的邏輯條件。每一個步中所實(shí)現(xiàn)的功能可以用其他幾種語言,如FBD、LD、ST和IL來描述。
三、SFC組態(tài)軟件圖形系統(tǒng)的構(gòu)成
SFC為用戶提供了方便、快捷和直觀的圖形化編程模式,其圖形系統(tǒng)是整個組態(tài)軟件的核心所在筆者所開發(fā)的SFC組態(tài)軟件圖形系統(tǒng)具備下面組成部分,如圖1所示。
[align=center][img=286,207]http://www.cechinamag.com/images/Article/0e5ad53a-ebc9-4e28-8b81-cc7024918685/s6.jpg[/img]
圖1 組態(tài)軟件圖形系統(tǒng)的構(gòu)成[/align]
(1)視覺效果良好的編輯窗口。為了給用戶一個清新直觀的程序編寫環(huán)境,編輯窗口應(yīng)當(dāng)給用戶一個良好的視覺效果。
(2)用戶工具欄。
(3)用戶右鍵快捷菜單。
(4)水平、垂直標(biāo)尺。水平及垂直標(biāo)尺的設(shè)置便于用戶在編輯器內(nèi)導(dǎo)航,同時具有整行選擇和整列選擇的功能。
四、SFC圖形系統(tǒng)設(shè)計(jì)方案
(一)語言元素管理模式的確定
SFC圖形系統(tǒng)的管理,主要是解決語言元素單體及宏體的添加、刪除、移動等操作所帶來的對象管理問題。有兩種模式可供選擇:一維線性模式和二維平面模式。在存儲管理上,都是使用鏈表和數(shù)組,區(qū)別在于根對語言元素對象的查找、定位的機(jī)制上。
1.一維線性模式
該管理模式下,全部的語言元素對象分布到幾個不同類型的鏈表和數(shù)組中存儲,查找、定位某個類型的語言元素對象時,直接使用鏈表本身和數(shù)組本身進(jìn)行操作:使用查找或遍歷的方法得到滿足條件的語言元素對象。這種模式節(jié)省內(nèi)存占用,程序?qū)崿F(xiàn)簡便。但語言元素對象較多時運(yùn)行的效率不高。
2.二維平面模式
在這種管理模式下,除了將全部的語言元素對象分布到幾個不同類型的鏈表和數(shù)組中存儲以外,還在內(nèi)存中建立一個“網(wǎng)格地圖”(GridMap)用以形成從各元素在編輯區(qū)域的顯示位置到其內(nèi)存分布的邏輯地址的映射。使用查找、定位某個類型的語言元素對象時使用網(wǎng)格地圖在內(nèi)存中快速定位相應(yīng)的語言元素對象。這種模式占用較多的內(nèi)存;但當(dāng)語言元素對象較多時可大大提高了軟件運(yùn)行的效率,方便了對語言元素對象的管理。
考慮到軟件運(yùn)行中經(jīng)常出現(xiàn)用戶對語言元素的各種操作,對語言元素的內(nèi)存定位運(yùn)算非常頻繁,由此決定的軟件運(yùn)行的效率是一個很重要的指標(biāo),而一般的SFC程序規(guī)模通常不是很大,所以在本軟件中選擇和確定了使用二維平面式的語言元素管理模式。網(wǎng)格信息的圖形表征如圖2所示。
[align=center] [img=265,54]http://www.cechinamag.com/images/Article/0e5ad53a-ebc9-4e28-8b81-cc7024918685/s7.jpg[/img]
圖2 網(wǎng)格信息的圖形表征 [/align]
根據(jù)SFC的編程規(guī)則,每個網(wǎng)格最多只能存放3個語言元素。因此,將網(wǎng)格劃分為上、中、下3個部分,每個部分都存儲有關(guān)該處語言元素的2個重要的描述信息:該處語言元素的類型及該處語言元素在相應(yīng)鏈表和數(shù)組中的索引值。
(二)基本語言元素的操作
1.語言元素對象的選擇、添加、刪除、屬性修改、單體及宏塊的移動
• 選擇操作:包括單擊、“橡皮筋”拖動、通水平或垂直標(biāo)尺、編輯區(qū)域左上角的快捷按鈕等途徑實(shí)現(xiàn)。
• 添加操作:從語言工具箱中選擇某個語言元素,在客戶編輯區(qū)域內(nèi)單擊,即可在相應(yīng)的語言元素對象數(shù)組中添加一個新個體,自動配置對象的某些數(shù)據(jù)(如網(wǎng)格位置坐標(biāo)、選擇狀態(tài)等)。
• 刪除操作:使用鍵盤、“編輯”菜單或右鍵快捷菜單可以實(shí)現(xiàn)選中對象的刪除。
• 屬性配置和修改:通過“屬性配置”修改“對話框完成語言元素的屬性配置和修改。
• 移動操作:包括語言元素對象單體的移動和多個對象構(gòu)成的宏體的移動。由于SFC編程有著一定的規(guī)則,因此各語言元素之間的相對位置要遵守一套相當(dāng)復(fù)雜的規(guī)則(如兩個步不能直接相連等),不能夠隨意放置。因此,在設(shè)計(jì)上不但要對規(guī)則作全面的考慮,而且要以方便用戶操作為準(zhǔn)則。
2.“分支”及“匯合”元素的動態(tài)伸縮
SFC語言元素中的“分支”( [table][tr][td][/td][/tr][/table]branch)及“匯合”(joint)元素具有不同于其他語言元素的特性。因?yàn)檫@兩種元素可以具有多個引出點(diǎn)(“分支”可以有多個分支點(diǎn),“匯合”可以有多個匯合點(diǎn)),所以在設(shè)計(jì)實(shí)現(xiàn)時應(yīng)當(dāng)使其具有動態(tài)伸縮的功能。
(三)語言元素之間的自動連接功能
SFC語言元素中的某些元素之間是可以直接連接的,即:設(shè)有任意兩個語言元素A、B,元素A在編輯區(qū)內(nèi)的網(wǎng)格坐標(biāo)位置為(x,y,z1),元素B在編輯區(qū)內(nèi)的網(wǎng)格坐標(biāo)位置為(x,y+1,z2)。其中z1、z2為網(wǎng)格內(nèi)的層次值(0,1,2分別表征上、中、下三個層次),z1、z2的取值使得A和B在網(wǎng)格圖上不直接相鄰。當(dāng)A、B滿足一定的條件時,在A和B之間可以進(jìn)行直接連接。
SFC的多種語言元素之間都具有直接連接的性質(zhì)。本設(shè)計(jì)中采用規(guī)則庫算法,當(dāng)添加、移動某個語言元素后,檢測該元素的上、下網(wǎng)格內(nèi)是否存在可以直接連接的元素;如果有則在兩個元素之間自動形成。
(四)語言元素功能組
為提高用戶使用編程的效率,將若干個語言元素組合,構(gòu)成語言元素功能組,以宏塊的形式提供給用戶使用,如步—轉(zhuǎn)換功能組、分支—匯合功能組。通過設(shè)置組的規(guī)模得到包含有不同數(shù)量語言元素的功能組。
(五)長連接功能
在用戶編程過程中,SFC語言元素的分布并非都是網(wǎng)格間直接相鄰的。例如,任意兩個語言元素A、B,A在編輯區(qū)內(nèi)的網(wǎng)格坐標(biāo)位置為(x,y,z1),B在編輯區(qū)內(nèi)的網(wǎng)格坐標(biāo)位置為(x,y+n,z2)(n≥2)。當(dāng)A、B之間滿足可連接條件時,則在A、B之間可以構(gòu)成一個長連接。
1.連接方向的判斷。根據(jù)用戶在連線起點(diǎn)元素的鼠標(biāo)輸入位置來判斷用戶要實(shí)現(xiàn)的連線的方向。無須將鼠標(biāo)輸入位置精確定位到元素的連接端子上,只需處于元素塊的上、下區(qū)域內(nèi)就可以由軟件自動判斷用戶要實(shí)現(xiàn)的連線方向。
2.自動判斷是否可以連接終點(diǎn)元素。當(dāng)確定了連接起點(diǎn)后,使用智能算法自動判斷鼠標(biāo)當(dāng)前位置元素是否可為連接終點(diǎn)元素,并通過鼠標(biāo)光標(biāo)變形提示用戶。
3.可視化的連線設(shè)計(jì)。
4.用戶模糊輸入支持。
用戶無須將鼠標(biāo)輸入位置精確定位到元素的連接端子上,只需處于元素塊的上、下區(qū)域內(nèi)并確定后,就可以由軟件將連線精確連接到元素的上或下連接端子上。
(六)剪貼板功能和OLE拖放
為便于用戶的操作,提供了對SFC各語言元素的剪貼板和拖放功能支持,使用戶可以在多個SFC組態(tài)子窗口中方便快捷地實(shí)現(xiàn)數(shù)據(jù)傳輸和共享。
(七)文字注釋功能
在設(shè)計(jì)實(shí)現(xiàn)上將文字注釋功能與SFC語言元素功能分開并分別管理。在顯示模式上,采用了兩個圖層:處于頂層的SFC語言元素層和處于底層的用戶注釋層,通過可選的圖層切換功能可以實(shí)現(xiàn)兩個圖層的顯示和隱藏。文字注釋功能包括添加、刪除、移動、注釋等。在編輯區(qū)域內(nèi)對文字注釋進(jìn)行的操作不影響語言元素。
五、SFC[b]圖形系統(tǒng)基于VC++的實(shí)現(xiàn)
[/b] 使用VC++語言實(shí)現(xiàn)組態(tài)方案。VC++所具有的高度友好的集成開發(fā)環(huán)境和功能強(qiáng)大的大大提高了用戶進(jìn)行軟件開發(fā)的效率。限于篇幅,在此只給出功能設(shè)計(jì)中一些較為重要的項(xiàng)目的VC++實(shí)現(xiàn)[3]。
(一)基本語言元素對象的構(gòu)造
使用C++描述,將語言元素抽象成C++類。構(gòu)造1個基類和7個由此基類派生的子類,分別對應(yīng)于SFC中的7種基本語言元素。基類CSFCComponent描述了圖形系統(tǒng)中的SFC語言元素的基本特性:
Class CSFCComponent
{
Public:
BYTE m_Grid Y;//網(wǎng)格坐標(biāo)X
BYTE m_Grid X [table][tr][td][/td][/tr][/table];//網(wǎng)格坐標(biāo)Y
Bool m_bSelected;//選擇狀態(tài)
CSFCComponent();
virtual~CSFCComponent();
};
步、轉(zhuǎn)換和跳轉(zhuǎn)3種語言元素具有較大相似性,除了繼承CSFCComponent的全部屬性外,還各自具有其他特有的屬性,以下以步的構(gòu)造為例。
步對象的構(gòu)造:
Class CSFCSterx putlic CSFCComponent
{
public
…//步對象的其他屬性
Void Draw(CDC* pdc,int index,int grid_width,,int grid_height);
CSFCStep();
vitual~CSFCStep();
};
并行分支、并行匯合、單行分支和單行匯合具有較大相似性。以下以并行分支的構(gòu)造為例。
Class CSFCParallelbranch public CSFCComponnet
{
Public
Void Draw(CDC* pdc,int grid_width,int grid_height);
BYTE m_GridNum;//跨越的格數(shù)
CSFCParallelbranch();
virtual~CSFCParallelbranch();
};
連接對象是一種較為特殊的對象,實(shí)現(xiàn)各語言元素之間的連接。如下構(gòu)造:
Class CSFCLink
{
public
void Draw(CDC* pdc,int grid_width,int grid_height);
BYTE gridx;//所連接的語言元素的位置坐標(biāo);
BYTE gridy_upper,gridy_lower;//所連接的語言元素上、下的位置坐標(biāo)
BYTE layer_upper,layer_lower;//所連接的
語言元素的網(wǎng)格層次值:
CSFCLink();
&nbs [table][tr][td][/td][/tr][/table]p; virtual~CSFCLink();
};
(二)語言元素對象二維平面管理模式的實(shí)現(xiàn)
構(gòu)造如下的數(shù)據(jù)結(jié)構(gòu)表征網(wǎng)格地圖中的網(wǎng)格信息。
Type def strict GRID_INFO
{
Selector component_type[3];//語言元素的類型,3個元素分別表示網(wǎng)格的上、中、下3個層次;
WORD array_index[3];//語言元素在其相應(yīng)類型的鏈表或數(shù)組中的索引值,作為語言元素在內(nèi)存的邏輯地址使用,3個元素分別表示網(wǎng)格的上、中、下3個層次內(nèi)的語言元素在相應(yīng)數(shù)組中的索引值;
};
此網(wǎng)格地圖就構(gòu)成了從各元素在編輯區(qū)域的顯示位置到其內(nèi)存分布的邏輯地址的映射。其中selector為SFC語言元素選擇子,枚舉類型,如下定義。
Typedef enum selector{
null,mouse_select,step,transition,parallel_branch,parallel_joint,alternative_branch,alternative_joint,jump,link,text step_transition_group,transition_step_group,alternative_group,text_move,text_rubberbcandselect,longlink_cut};
當(dāng)用戶在SFC語言元素工具箱中選擇不同的語言元素時,當(dāng)前選擇子變量取不同的值。
網(wǎng)格的集合即構(gòu)成網(wǎng)格地圖,網(wǎng)格地圖如下定義:
GRID_INFO**m_GridMap
其程序?qū)崿F(xiàn)為:
This->m_GridMap=(GRID_INFO**)::malloc(size of(void*)*this->m_gridy_num);
for(int y=0;y<=this->m_gridy_num-1;y++)
{
this->m_GridMap[y]=(GRID_INFO*)::malloc(size of(GRID_INFO)*this->m_gridx_num);
}
//初始化格圖:
for(y=0;y<=this->m_gridy_num-1;y++)
{
::memset(this->m_GridMap[y],0,size of(GRID_INFO)*this->m_gridx_num);
}
(三)剪貼板功能和OLE拖放的實(shí)現(xiàn)
在SFC組態(tài)器工程中,實(shí)現(xiàn)了對SFC基本語言元素和文本注釋對象的剪貼板功能和OLE拖放,鑒于SFC基本語言元素和文本屬于兩種不同的范疇,因此對于其剪貼板及的操作采用了兩種不同的設(shè)計(jì)實(shí)現(xiàn)模式。文本的剪貼板及OLE操作采用Windows系統(tǒng)級定義的剪貼板格式實(shí)現(xiàn)進(jìn)程內(nèi)以及進(jìn)程之間的數(shù)據(jù)傳輸和共享,該技術(shù)已經(jīng)比較成熟,實(shí)現(xiàn)起來也較為簡單;而對于基本語言元素所構(gòu)成的數(shù)據(jù)對象而言,其數(shù)據(jù)格式是自定義的,不在系統(tǒng)級剪貼板格式范疇內(nèi),需要使用自定義的數(shù)據(jù)傳輸格式[4]。
經(jīng)研究分析和實(shí)驗(yàn)得出結(jié)論:實(shí)現(xiàn)系統(tǒng)級剪貼板格式以外的數(shù)據(jù)共享,應(yīng)當(dāng)實(shí)現(xiàn)以下兩個關(guān)鍵環(huán)節(jié):
(1)自定義一種剪貼板格式,用以標(biāo)識用戶要進(jìn)行的剪貼操作和存儲用戶數(shù)據(jù)區(qū)域在系統(tǒng)中的地址。
(2)實(shí)現(xiàn)共享數(shù)據(jù)生成者與使用者間的數(shù)據(jù)共享協(xié)議,對放入到剪貼板上的實(shí)體數(shù)據(jù)的格式進(jìn)行了自定義。
SFC組態(tài)器中的數(shù)據(jù)類型多且內(nèi)容比較復(fù)雜,各元素之間要遵守嚴(yán)格的邏輯排序規(guī)則,在設(shè)計(jì)實(shí)現(xiàn)剪貼板和OLE拖放功能時要作全面的考慮。除了要將用戶當(dāng)前選中的SFC組件拷貝和剪切到剪貼板上外,還應(yīng)將拷貝和剪切前的元素連接及排序位置一同記錄到剪貼板上。以此為出發(fā)點(diǎn),在本工程中,自定義了一種名為“sfc_selected_components”的剪貼板格式。
在拷貝/剪切操作時,按照下面步驟實(shí)施:①注冊剪貼板格式;②打開剪貼板;③清空剪貼板;④根據(jù)要操作的對象數(shù)據(jù)計(jì)算要使用的全局內(nèi)存量;⑤釋放上次分配的內(nèi)存,分配本次操作所需的內(nèi)存;⑥存儲數(shù)據(jù);⑦關(guān)閉剪貼板。
OLE拖放技術(shù)的實(shí)現(xiàn)較剪貼板而言,其數(shù)據(jù)存取的原理基本相同,但形式更加簡潔,主要體現(xiàn)在數(shù)據(jù)存儲的系統(tǒng)全局地址的傳遞的表達(dá)方式上有所不同。另外,OLE拖放協(xié)議相對簡單,不涉及與其他數(shù)據(jù)類型的兼容性問題[5]。
(四)文字注釋功能
文字注釋對象如下構(gòu)造:
Class CText
{
Public:
CRect m_rec;//以滾動大坐標(biāo)系為準(zhǔn),不以局部小坐標(biāo)系為準(zhǔn)
DWORD text_color;
LOGFONT if;//記錄文字顯示所使用的字體數(shù)據(jù)
Bool m_bSelected;//是否選中:缺省false
CPoint top_left;//記錄文字的左上角位置
CString text;//文字內(nèi)容,缺省為空
CRect jisuan_rect(CPoint,point,int hangshu,CString longest_str,CDC* pdc);
Void draw(CDC* pdc);
CText();
virtual~CText();
};
Class CSFCText public CText
{
public:
void draw(CDC* pdc);
CSFCText();
virtual~CSFCText();
}
文字注釋對象的復(fù)制、剪切和粘貼操作在CSF-CView的CopyText、CutText和PasteText函數(shù)中實(shí)現(xiàn)。
六、結(jié)束語
以上所述SFC組態(tài)軟件圖形系統(tǒng)的設(shè)計(jì)方案和基于VC++的實(shí)現(xiàn)都已在筆者開發(fā)的“WorldFIP現(xiàn)場總線控制系統(tǒng)上位策略組態(tài)軟件”的SFC子系統(tǒng)中全部實(shí)現(xiàn),并已應(yīng)用于對WorldFIP現(xiàn)場總線控制系統(tǒng)的工程組態(tài)。實(shí)踐表明,依據(jù)這一方案設(shè)計(jì)實(shí)現(xiàn)的SFC組態(tài)軟件組態(tài)方式靈活、易于維護(hù),在人機(jī)界面上面向用戶、高度友好、簡便直觀,大大提高了用戶組態(tài)編程的效率,具有較大的推廣和應(yīng)用價值。
參考文獻(xiàn)
[1] 王錦標(biāo).現(xiàn)場總線和現(xiàn)場總線控制系統(tǒng)[J].化工自動化及儀表,1997,(2).
[2] 方來華,吳愛國,何熠.組態(tài)軟件核心技術(shù)研究[J].化工自動化及儀表,2004,(1).
[3] 齊舒創(chuàng)作室.VC++6.0開發(fā)技巧與實(shí)例剖析[M].北京:清華大學(xué)出版社,1999.
[4] 新編WINDOWS API參考大全編寫組.新編WINDOWS API參考大全[M].北京:電子工業(yè)出版社,2000.
[5] 潘愛民.COM原理與應(yīng)用[M].北京:清華大學(xué)出版社,1999.
標(biāo)簽:
中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(m.u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。