技术中心
 
 

顺序功能图图形化组态软件的设计开发

   日期:2006-03-06     作者:管理员    

     概述SFC的功能、组成和编程规则。介绍所开发的SFC组态软件的图形系统的构成。详尽给出了SFC图形系统的设计方案及其基于VC++的方案实现。实践表明,依据这一方案设计实现的SFC组态软件组态方式灵活、易于维护。

    一、引言
    顺序功能图(SFC)是一种图形化的组态语言,主要应用于工业过程控制上位策略组态程序的编写,在PLC系统和系统上位组态软件中广泛使用。随着4C技术的飞速发展和工业过程控制领域自动化程度的日益提高,控制系统上位图形化的编程模式也越来越受到用户的青睐。开发SFC组态软件具有非常现实的意义[1,2]。


    二、SFC的功能和组成
    SFC是采用图形化的方法来描述一个控制程序的顺序行为,基于Petri网和IEC848标准Grafce,但又做了必要的修改。将一个程序内部组织加以结构化,在保持其总貌的前提下将一个控制问题分解为若干个可管理的部分,由“步”(ste

p)和“转换点”(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语言元素层和处于底层的用户注释层,通过可选的图层切换功能可以实现两个图层的显示和隐藏。文字注释功能包括添加、删除、移动、注释等。在编辑区域内对文字注释进行的操作不影响语言元素。


&nb























sp;   五、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();
    &nbs
p;     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)自定义一种剪贴板格式,用以标识用户要进行的剪贴操作和存储用户数据区域在系统中的地址。


&

nbsp;   (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);
         &n






















bsp;  CText();
            virtual~CText();
    };
        Class CSFCText public CText
    {
    public:
            void draw(CDC* pdc);
            CSFCText();
            virtual~CSFCText();
 &nb
sp;  }
    文字注释对象的复制、剪切和粘贴操作在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.

 



















 
  
  
  
  
 
更多>同类技术
 
全年征稿 / 资讯合作
 
推荐图文
推荐技术
可能喜欢