一、引言
順序功能圖(SFC)是一種圖形化的組態語言,主要應用于工業過程控制上位策略組態程序的編寫,在PLC系統和系統上位組態軟件中廣泛使用。隨著4C技術的飛速發展和工業過程控制領域自動化程度的日益提高,控制系統上位圖形化的編程模式也越來越受到用戶的青睞。開發SFC組態軟件具有非常現實的意義[1,2]。
二、SFC的功能和組成
SFC是采用圖形化的方法來描述一個控制程序的順序行為,基于Petri網和IEC848標準Grafce,但又做了必要的修改。將一個程序內部組織加以結構化,在保持其總貌的前提下將一個控制問題分解為若干個可管理的部分,由“步”(step)和“轉換點”(transition)所組成,每個轉換點具有一定的邏輯條件。每一個步中所實現的功能可以用其他幾種語言,如FBD、LD、ST和IL來描述。
三、SFC組態軟件圖形系統的構成
SFC為用戶提供了方便、快捷和直觀的圖形化編程模式,其圖形系統是整個組態軟件的核心所在筆者所開發的SFC組態軟件圖形系統具備下面組成部分,如圖1所示。
圖1 組態軟件圖形系統的構成
(1)視覺效果良好的編輯窗口。為了給用戶一個清新直觀的程序編寫環境,編輯窗口應當給用戶一個良好的視覺效果。
(2)用戶工具欄。
(3)用戶右鍵快捷菜單。
(4)水平、垂直標尺。水平及垂直標尺的設置便于用戶在編輯器內導航,同時具有整行選擇和整列選擇的功能。
四、SFC圖形系統設計方案
(一)語言元素管理模式的確定
SFC圖形系統的管理,主要是解決語言元素單體及宏體的添加、刪除、移動等操作所帶來的對象管理問題。有兩種模式可供選擇:一維線性模式和二維平面模式。在存儲管理上,都是使用鏈表和數組,區別在于根對語言元素對象的查找、定位的機制上。
1.一維線性模式
該管理模式下,全部的語言元素對象分布到幾個不同類型的鏈表和數組中存儲,查找、定位某個類型的語言元素對象時,直接使用鏈表本身和數組本身進行操作:使用查找或遍歷的方法得到滿足條件的語言元素對象。這種模式節省內存占用,程序實現簡便。但語言元素對象較多時運行的效率不高。
2.二維平面模式
在這種管理模式下,除了將全部的語言元素對象分布到幾個不同類型的鏈表和數組中存儲以外,還在內存中建立一個“網格地圖”(GridMap)用以形成從各元素在編輯區域的顯示位置到其內存分布的邏輯地址的映射。使用查找、定位某個類型的語言元素對象時使用網格地圖在內存中快速定位相應的語言元素對象。這種模式占用較多的內存;但當語言元素對象較多時可大大提高了軟件運行的效率,方便了對語言元素對象的管理。
考慮到軟件運行中經常出現用戶對語言元素的各種操作,對語言元素的內存定位運算非常頻繁,由此決定的軟件運行的效率是一個很重要的指標,而一般的SFC程序規模通常不是很大,所以在本軟件中選擇和確定了使用二維平面式的語言元素管理模式。網格信息的圖形表征如圖2所示。
圖2 網格信息的圖形表征
根據SFC的編程規則,每個網格最多只能存放3個語言元素。因此,將網格劃分為上、中、下3個部分,每個部分都存儲有關該處語言元素的2個重要的描述信息:該處語言元素的類型及該處語言元素在相應鏈表和數組中的索引值。
(二)基本語言元素的操作
1.語言元素對象的選擇、添加、刪除、屬性修改、單體及宏塊的移動
選擇操作:包括單擊、“橡皮筋”拖動、通水平或垂直標尺、編輯區域左上角的快捷按鈕等途徑實現。
添加操作:從語言工具箱中選擇某個語言元素,在客戶編輯區域內單擊,即可在相應的語言元素對象數組中添加一個新個體,自動配置對象的某些數據(如網格位置坐標、選擇狀態等)。
刪除操作:使用鍵盤、“編輯”菜單或右鍵快捷菜單可以實現選中對象的刪除。
屬性配置和修改:通過“屬性配置”修改“對話框完成語言元素的屬性配置和修改。
移動操作:包括語言元素對象單體的移動和多個對象構成的宏體的移動。由于SFC編程有著一定的規則,因此各語言元素之間的相對位置要遵守一套相當復雜的規則(如兩個步不能直接相連等),不能夠隨意放置。因此,在設計上不但要對規則作全面的考慮,而且要以方便用戶操作為準則。
2.“分支”及“匯合”元素的動態伸縮
SFC語言元素中的“分支”(branch)及“匯合”(joint)元素具有不同于其他語言元素的特性。因為這兩種元素可以具有多個引出點(“分支”可以有多個分支點,“匯合”可以有多個匯合點),所以在設計實現時應當使其具有動態伸縮的功能。
(三)語言元素之間的自動連接功能
SFC語言元素中的某些元素之間是可以直接連接的,即:設有任意兩個語言元素A、B,元素A在編輯區內的網格坐標位置為(x,y,z1),元素B在編輯區內的網格坐標位置為(x,y+1,z2)。其中z1、z2為網格內的層次值(0,1,2分別表征上、中、下三個層次),z1、z2的取值使得A和B在網格圖上不直接相鄰。當A、B滿足一定的條件時,在A和B之間可以進行直接連接。
SFC的多種語言元素之間都具有直接連接的性質。本設計中采用規則庫算法,當添加、移動某個語言元素后,檢測該元素的上、下網格內是否存在可以直接連接的元素;如果有則在兩個元素之間自動形成。
(四)語言元素功能組
為提高用戶使用編程的效率,將若干個語言元素組合,構成語言元素功能組,以宏塊的形式提供給用戶使用,如步―轉換功能組、分支―匯合功能組。通過設置組的規模得到包含有不同數量語言元素的功能組。
(五)長連接功能
在用戶編程過程中,SFC語言元素的分布并非都是網格間直接相鄰的。例如,任意兩個語言元素A、B,A在編輯區內的網格坐標位置為(x,y,z1),B在編輯區內的網格坐標位置為(x,y+n,z2)(n≥2)。當A、B之間滿足可連接條件時,則在A、B之間可以構成一個長連接。
1.連接方向的判斷。根據用戶在連線起點元素的鼠標輸入位置來判斷用戶要實現的連線的方向。無須將鼠標輸入位置精確定位到元素的連接端子上,只需處于元素塊的上、下區域內就可以由軟件自動判斷用戶要實現的連線方向。
2.自動判斷是否可以連接終點元素。當確定了連接起點后,使用智能算法自動判斷鼠標當前位置元素是否可為連接終點元素,并通過鼠標光標變形提示用戶。
3.可視化的連線設計。
4.用戶模糊輸入支持。
用戶無須將鼠標輸入位置精確定位到元素的連接端子上,只需處于元素塊的上、下區域內并確定后,就可以由軟件將連線精確連接到元素的上或下連接端子上。
(六)剪貼板功能和OLE拖放
為便于用戶的操作,提供了對SFC各語言元素的剪貼板和拖放功能支持,使用戶可以在多個SFC組態子窗口中方便快捷地實現數據傳輸和共享。
(七)文字注釋功能
在設計實現上將文字注釋功能與SFC語言元素功能分開并分別管理。在顯示模式上,采用了兩個圖層:處于頂層的SFC語言元素層和處于底層的用戶注釋層,通過可選的圖層切換功能可以實現兩個圖層的顯示和隱藏。文字注釋功能包括添加、刪除、移動、注釋等。在編輯區域內對文字注釋進行的操作不影響語言元素。
五、SFC圖形系統基于VC++的實現
使用VC++語言實現組態方案。VC++所具有的高度友好的集成開發環境和功能強大的大大提高了用戶進行軟件開發的效率。限于篇幅,在此只給出功能設計中一些較為重要的項目的VC++實現[3]。
(一)基本語言元素對象的構造
使用C++描述,將語言元素抽象成C++類。構造1個基類和7個由此基類派生的子類,分別對應于SFC中的7種基本語言元素。基類CSFCComponent描述了圖形系統中的SFC語言元素的基本特性:
Class CSFCComponent
{
Public:
BYTE m_Grid Y;//網格坐標X
BYTE m_Grid X;//網格坐標Y
Bool m_bSelected;//選擇狀態
CSFCComponent();
virtual~CSFCComponent();
};
步、轉換和跳轉3種語言元素具有較大相似性,除了繼承CSFCComponent的全部屬性外,還各自具有其他特有的屬性,以下以步的構造為例。
步對象的構造:
Class CSFCSterx putlic CSFCComponent
{
public
…//步對象的其他屬性
Void Draw(CDC* pdc,int index,int grid_width,,int grid_height);
CSFCStep();
vitual~CSFCStep();
};
并行分支、并行匯合、單行分支和單行匯合具有較大相似性。以下以并行分支的構造為例。
Class CSFCParallelbranch public CSFCComponnet
{
Public
Void Draw(CDC* pdc,int grid_width,int grid_height);
BYTE m_GridNum;//跨越的格數
CSFCParallelbranch();
virtual~CSFCParallelbranch();
};
連接對象是一種較為特殊的對象,實現各語言元素之間的連接。如下構造:
Class CSFCLink
{
public
void Draw(CDC* pdc,int grid_width,int grid_height);
BYTE gridx;//所連接的語言元素的位置坐標;
BYTE gridy_upper,gridy_lower;//所連接的語言元素上、下的位置坐標
BYTE layer_upper,layer_lower;//所連接的
語言元素的網格層次值:
CSFCLink();
virtual~CSFCLink();
};
(二)語言元素對象二維平面管理模式的實現
構造如下的數據結構表征網格地圖中的網格信息。
Type def strict GRID_INFO
{
Selector component_type[3];//語言元素的類型,3個元素分別表示網格的上、中、下3個層次;
WORD array_index[3];//語言元素在其相應類型的鏈表或數組中的索引值,作為語言元素在內存的邏輯地址使用,3個元素分別表示網格的上、中、下3個層次內的語言元素在相應數組中的索引值;
};
此網格地圖就構成了從各元素在編輯區域的顯示位置到其內存分布的邏輯地址的映射。其中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};
當用戶在SFC語言元素工具箱中選擇不同的語言元素時,當前選擇子變量取不同的值。
網格的集合即構成網格地圖,網格地圖如下定義:
GRID_INFO**m_GridMap
其程序實現為:
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拖放的實現
在SFC組態器工程中,實現了對SFC基本語言元素和文本注釋對象的剪貼板功能和OLE拖放,鑒于SFC基本語言元素和文本屬于兩種不同的范疇,因此對于其剪貼板及的操作采用了兩種不同的設計實現模式。文本的剪貼板及OLE操作采用Windows系統級定義的剪貼板格式實現進程內以及進程之間的數據傳輸和共享,該技術已經比較成熟,實現起來也較為簡單;而對于基本語言元素所構成的數據對象而言,其數據格式是自定義的,不在系統級剪貼板格式范疇內,需要使用自定義的數據傳輸格式[4]。
經研究分析和實驗得出結論:實現系統級剪貼板格式以外的數據共享,應當實現以下兩個關鍵環節:
(1)自定義一種剪貼板格式,用以標識用戶要進行的剪貼操作和存儲用戶數據區域在系統中的地址。
(2)實現共享數據生成者與使用者間的數據共享協議,對放入到剪貼板上的實體數據的格式進行了自定義。
SFC組態器中的數據類型多且內容比較復雜,各元素之間要遵守嚴格的邏輯排序規則,在設計實現剪貼板和OLE拖放功能時要作全面的考慮。除了要將用戶當前選中的SFC組件拷貝和剪切到剪貼板上外,還應將拷貝和剪切前的元素連接及排序位置一同記錄到剪貼板上。以此為出發點,在本工程中,自定義了一種名為“sfc_selected_components”的剪貼板格式。
在拷貝/剪切操作時,按照下面步驟實施:①注冊剪貼板格式;②打開剪貼板;③清空剪貼板;④根據要操作的對象數據計算要使用的全局內存量;⑤釋放上次分配的內存,分配本次操作所需的內存;⑥存儲數據;⑦關閉剪貼板。
OLE拖放技術的實現較剪貼板而言,其數據存取的原理基本相同,但形式更加簡潔,主要體現在數據存儲的系統全局地址的傳遞的表達方式上有所不同。另外,OLE拖放協議相對簡單,不涉及與其他數據類型的兼容性問題[5]。
(四)文字注釋功能
文字注釋對象如下構造:
Class CText
{
Public:
CRect m_rec;//以滾動大坐標系為準,不以局部小坐標系為準
DWORD text_color;
LOGFONT if;//記錄文字顯示所使用的字體數據
Bool m_bSelected;//是否選中:缺省false
CPoint top_left;//記錄文字的左上角位置
CString text;//文字內容,缺省為空
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();
}
文字注釋對象的復制、剪切和粘貼操作在CSF-CView的CopyText、CutText和PasteText函數中實現。
六、結束語
以上所述SFC組態軟件圖形系統的設計方案和基于VC++的實現都已在筆者開發的“WorldFIP現場總線控制系統上位策略組態軟件”的SFC子系統中全部實現,并已應用于對WorldFIP現場總線控制系統的工程組態。實踐表明,依據這一方案設計實現的SFC組態軟件組態方式靈活、易于維護,在人機界面上面向用戶、高度友好、簡便直觀,大大提高了用戶組態編程的效率,具有較大的推廣和應用價值。
參考文獻
[1] 王錦標.現場總線和現場總線控制系統[J].化工自動化及儀表,1997,(2).
[2] 方來華,吳愛國,何熠.組態軟件核心技術研究[J].化工自動化及儀表,2004,(1).
[3] 齊舒創作室.VC++6.0開發技巧與實例剖析[M].北京:清華大學出版社,1999.
[4] 新編WINDOWS API參考大全編寫組.新編WINDOWS API參考大全[M].北京:電子工業出版社,2000.
[5] 潘愛民.COM原理與應用[M].北京:清華大學出版社,1999.