siemens x
傳感器

順序功能圖圖形化組態(tài)軟件的設(shè)計(jì)開發(fā)

2025China.cn   2007年07月06日

  一、引言

  順序功能圖(SFC)是一種圖形化的組態(tài)語言,主要應(yīng)用于工業(yè)過程控制上位策略組態(tài)程序的編寫,在PLC系統(tǒng)和系統(tǒng)上位組態(tài)軟件中廣泛使用。隨著4C技術(shù)的飛速發(fā)展和工業(yè)過程控制領(lǐng)域自動(dòng)化程度的日益提高,控制系統(tǒng)上位圖形化的編程模式也越來越受到用戶的青睞。開發(fā)SFC組態(tài)軟件具有非?,F(xiàn)實(shí)的意義[1,2]。

  二、SFC的功能和組成

  SFC是采用圖形化的方法來描述一個(gè)控制程序的順序行為,基于Petri網(wǎng)和IEC848標(biāo)準(zhǔn)Grafce,但又做了必要的修改。將一個(gè)程序內(nèi)部組織加以結(jié)構(gòu)化,在保持其總貌的前提下將一個(gè)控制問題分解為若干個(gè)可管理的部分,由“步”(step)和“轉(zhuǎn)換點(diǎn)”(transition)所組成,每個(gè)轉(zhuǎn)換點(diǎn)具有一定的邏輯條件。每一個(gè)步中所實(shí)現(xiàn)的功能可以用其他幾種語言,如FBD、LD、ST和IL來描述。

  三、SFC組態(tài)軟件圖形系統(tǒng)的構(gòu)成

  SFC為用戶提供了方便、快捷和直觀的圖形化編程模式,其圖形系統(tǒng)是整個(gè)組態(tài)軟件的核心所在筆者所開發(fā)的SFC組態(tài)軟件圖形系統(tǒng)具備下面組成部分,如圖1所示。

圖1 組態(tài)軟件圖形系統(tǒng)的構(gòu)成

  (1)視覺效果良好的編輯窗口。為了給用戶一個(gè)清新直觀的程序編寫環(huán)境,編輯窗口應(yīng)當(dāng)給用戶一個(gè)良好的視覺效果。

 ?。?)用戶工具欄。

 ?。?)用戶右鍵快捷菜單。

 ?。?)水平、垂直標(biāo)尺。水平及垂直標(biāo)尺的設(shè)置便于用戶在編輯器內(nèi)導(dǎo)航,同時(shí)具有整行選擇和整列選擇的功能。

  四、SFC圖形系統(tǒng)設(shè)計(jì)方案

 ?。ㄒ唬┱Z言元素管理模式的確定

  SFC圖形系統(tǒng)的管理,主要是解決語言元素單體及宏體的添加、刪除、移動(dòng)等操作所帶來的對象管理問題。有兩種模式可供選擇:一維線性模式和二維平面模式。在存儲管理上,都是使用鏈表和數(shù)組,區(qū)別在于根對語言元素對象的查找、定位的機(jī)制上。

  1.一維線性模式

  該管理模式下,全部的語言元素對象分布到幾個(gè)不同類型的鏈表和數(shù)組中存儲,查找、定位某個(gè)類型的語言元素對象時(shí),直接使用鏈表本身和數(shù)組本身進(jìn)行操作:使用查找或遍歷的方法得到滿足條件的語言元素對象。這種模式節(jié)省內(nèi)存占用,程序?qū)崿F(xiàn)簡便。但語言元素對象較多時(shí)運(yùn)行的效率不高。

  2.二維平面模式

  在這種管理模式下,除了將全部的語言元素對象分布到幾個(gè)不同類型的鏈表和數(shù)組中存儲以外,還在內(nèi)存中建立一個(gè)“網(wǎng)格地圖”(GridMap)用以形成從各元素在編輯區(qū)域的顯示位置到其內(nèi)存分布的邏輯地址的映射。使用查找、定位某個(gè)類型的語言元素對象時(shí)使用網(wǎng)格地圖在內(nèi)存中快速定位相應(yīng)的語言元素對象。這種模式占用較多的內(nèi)存;但當(dāng)語言元素對象較多時(shí)可大大提高了軟件運(yùn)行的效率,方便了對語言元素對象的管理。

  考慮到軟件運(yùn)行中經(jīng)常出現(xiàn)用戶對語言元素的各種操作,對語言元素的內(nèi)存定位運(yùn)算非常頻繁,由此決定的軟件運(yùn)行的效率是一個(gè)很重要的指標(biāo),而一般的SFC程序規(guī)模通常不是很大,所以在本軟件中選擇和確定了使用二維平面式的語言元素管理模式。網(wǎng)格信息的圖形表征如圖2所示。

圖2 網(wǎng)格信息的圖形表征

  根據(jù)SFC的編程規(guī)則,每個(gè)網(wǎng)格最多只能存放3個(gè)語言元素。因此,將網(wǎng)格劃分為上、中、下3個(gè)部分,每個(gè)部分都存儲有關(guān)該處語言元素的2個(gè)重要的描述信息:該處語言元素的類型及該處語言元素在相應(yīng)鏈表和數(shù)組中的索引值。

  (二)基本語言元素的操作

  1.語言元素對象的選擇、添加、刪除、屬性修改、單體及宏塊的移動(dòng)

  選擇操作:包括單擊、“橡皮筋”拖動(dòng)、通水平或垂直標(biāo)尺、編輯區(qū)域左上角的快捷按鈕等途徑實(shí)現(xiàn)。

  添加操作:從語言工具箱中選擇某個(gè)語言元素,在客戶編輯區(qū)域內(nèi)單擊,即可在相應(yīng)的語言元素對象數(shù)組中添加一個(gè)新個(gè)體,自動(dòng)配置對象的某些數(shù)據(jù)(如網(wǎng)格位置坐標(biāo)、選擇狀態(tài)等)。

  刪除操作:使用鍵盤、“編輯”菜單或右鍵快捷菜單可以實(shí)現(xiàn)選中對象的刪除。

  屬性配置和修改:通過“屬性配置”修改“對話框完成語言元素的屬性配置和修改。

  移動(dòng)操作:包括語言元素對象單體的移動(dòng)和多個(gè)對象構(gòu)成的宏體的移動(dòng)。由于SFC編程有著一定的規(guī)則,因此各語言元素之間的相對位置要遵守一套相當(dāng)復(fù)雜的規(guī)則(如兩個(gè)步不能直接相連等),不能夠隨意放置。因此,在設(shè)計(jì)上不但要對規(guī)則作全面的考慮,而且要以方便用戶操作為準(zhǔn)則。
   
  2.“分支”及“匯合”元素的動(dòng)態(tài)伸縮

  SFC語言元素中的“分支”(branch)及“匯合”(joint)元素具有不同于其他語言元素的特性。因?yàn)檫@兩種元素可以具有多個(gè)引出點(diǎn)(“分支”可以有多個(gè)分支點(diǎn),“匯合”可以有多個(gè)匯合點(diǎn)),所以在設(shè)計(jì)實(shí)現(xiàn)時(shí)應(yīng)當(dāng)使其具有動(dòng)態(tài)伸縮的功能。

 ?。ㄈ┱Z言元素之間的自動(dòng)連接功能

  SFC語言元素中的某些元素之間是可以直接連接的,即:設(shè)有任意兩個(gè)語言元素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分別表征上、中、下三個(gè)層次),z1、z2的取值使得A和B在網(wǎng)格圖上不直接相鄰。當(dāng)A、B滿足一定的條件時(shí),在A和B之間可以進(jìn)行直接連接。

  SFC的多種語言元素之間都具有直接連接的性質(zhì)。本設(shè)計(jì)中采用規(guī)則庫算法,當(dāng)添加、移動(dòng)某個(gè)語言元素后,檢測該元素的上、下網(wǎng)格內(nèi)是否存在可以直接連接的元素;如果有則在兩個(gè)元素之間自動(dòng)形成。

 ?。ㄋ模┱Z言元素功能組

  為提高用戶使用編程的效率,將若干個(gè)語言元素組合,構(gòu)成語言元素功能組,以宏塊的形式提供給用戶使用,如步―轉(zhuǎn)換功能組、分支―匯合功能組。通過設(shè)置組的規(guī)模得到包含有不同數(shù)量語言元素的功能組。

 ?。ㄎ澹╅L連接功能

  在用戶編程過程中,SFC語言元素的分布并非都是網(wǎng)格間直接相鄰的。例如,任意兩個(gè)語言元素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之間滿足可連接條件時(shí),則在A、B之間可以構(gòu)成一個(gè)長連接。

  1.連接方向的判斷。根據(jù)用戶在連線起點(diǎn)元素的鼠標(biāo)輸入位置來判斷用戶要實(shí)現(xiàn)的連線的方向。無須將鼠標(biāo)輸入位置精確定位到元素的連接端子上,只需處于元素塊的上、下區(qū)域內(nèi)就可以由軟件自動(dòng)判斷用戶要實(shí)現(xiàn)的連線方向。

  2.自動(dòng)判斷是否可以連接終點(diǎn)元素。當(dāng)確定了連接起點(diǎn)后,使用智能算法自動(dòng)判斷鼠標(biāo)當(dāng)前位置元素是否可為連接終點(diǎn)元素,并通過鼠標(biāo)光標(biāo)變形提示用戶。

  3.可視化的連線設(shè)計(jì)。

  4.用戶模糊輸入支持。

  用戶無須將鼠標(biāo)輸入位置精確定位到元素的連接端子上,只需處于元素塊的上、下區(qū)域內(nèi)并確定后,就可以由軟件將連線精確連接到元素的上或下連接端子上。

 ?。┘糍N板功能和OLE拖放

  為便于用戶的操作,提供了對SFC各語言元素的剪貼板和拖放功能支持,使用戶可以在多個(gè)SFC組態(tài)子窗口中方便快捷地實(shí)現(xiàn)數(shù)據(jù)傳輸和共享。

 ?。ㄆ撸┪淖肿⑨尮δ?/FONT>

  在設(shè)計(jì)實(shí)現(xiàn)上將文字注釋功能與SFC語言元素功能分開并分別管理。在顯示模式上,采用了兩個(gè)圖層:處于頂層的SFC語言元素層和處于底層的用戶注釋層,通過可選的圖層切換功能可以實(shí)現(xiàn)兩個(gè)圖層的顯示和隱藏。文字注釋功能包括添加、刪除、移動(dòng)、注釋等。在編輯區(qū)域內(nèi)對文字注釋進(jìn)行的操作不影響語言元素。

  五、SFC圖形系統(tǒng)基于VC++的實(shí)現(xiàn)

  使用VC++語言實(shí)現(xiàn)組態(tài)方案。VC++所具有的高度友好的集成開發(fā)環(huán)境和功能強(qiáng)大的大大提高了用戶進(jìn)行軟件開發(fā)的效率。限于篇幅,在此只給出功能設(shè)計(jì)中一些較為重要的項(xiàng)目的VC++實(shí)現(xiàn)[3]。

 ?。ㄒ唬┗菊Z言元素對象的構(gòu)造

  使用C++描述,將語言元素抽象成C++類。構(gòu)造1個(gè)基類和7個(gè)由此基類派生的子類,分別對應(yīng)于SFC中的7種基本語言元素?;怌SFCComponent描述了圖形系統(tǒng)中的SFC語言元素的基本特性:

  Class CSFCComponent
  {
  Public:
        BYTE m_Grid Y;//網(wǎng)格坐標(biāo)X
    BYTE m_Grid X;//網(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();
        virtual~CSFCLink();
  };

 ?。ǘ┱Z言元素對象二維平面管理模式的實(shí)現(xiàn)

  構(gòu)造如下的數(shù)據(jù)結(jié)構(gòu)表征網(wǎng)格地圖中的網(wǎng)格信息。

  Type def strict GRID_INFO
  {
      Selector component_type[3];//語言元素的類型,3個(gè)元素分別表示網(wǎng)格的上、中、下3個(gè)層次;
  WORD array_index[3];//語言元素在其相應(yīng)類型的鏈表或數(shù)組中的索引值,作為語言元素在內(nèi)存的邏輯地址使用,3個(gè)元素分別表示網(wǎng)格的上、中、下3個(gè)層次內(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語言元素工具箱中選擇不同的語言元素時(shí),當(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)以下兩個(gè)關(guān)鍵環(huán)節(jié):

  (1)自定義一種剪貼板格式,用以標(biāo)識用戶要進(jìn)行的剪貼操作和存儲用戶數(shù)據(jù)區(qū)域在系統(tǒng)中的地址。

 ?。?)實(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拖放功能時(shí)要作全面的考慮。除了要將用戶當(dāng)前選中的SFC組件拷貝和剪切到剪貼板上外,還應(yīng)將拷貝和剪切前的元素連接及排序位置一同記錄到剪貼板上。以此為出發(fā)點(diǎn),在本工程中,自定義了一種名為“sfc_selected_components”的剪貼板格式。

  在拷貝/剪切操作時(shí),按照下面步驟實(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]。

 ?。ㄋ模┪淖肿⑨尮δ?/FONT>

  文字注釋對象如下構(gòu)造:

  Class CText
  {
  Public:
          CRect m_rec;//以滾動(dòng)大坐標(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)用價(jià)值。

  參考文獻(xiàn)

  [1] 王錦標(biāo).現(xiàn)場總線和現(xiàn)場總線控制系統(tǒng)[J].化工自動(dòng)化及儀表,1997,(2).
   
  [2] 方來華,吳愛國,何熠.組態(tài)軟件核心技術(shù)研究[J].化工自動(dòng)化及儀表,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.


(轉(zhuǎn)載)

標(biāo)簽:組態(tài)軟件 我要反饋