大连理工大学本科论文 下载本文

现场总线控制系统功能块组态软件设计

在CFBClass中,采用了两个链表m_FBInParam,m_FBOutParam分别来保存输入参数和输出参数,保存参数的顺序都是从上到下(顺序的规定是由下位机的软件决定的,因为下位机决定了功能块的逻辑运行的代码,它确定了读取功能块参数的顺序)。

功能块种类很多,功能块的主键就是功能块名称,这里采用CString类来保存,如”And”,”OR”,等等。在下位机软件也要明确功能块的种类,采用的是一个int型的数据。这样需要设计一个MAP一一影射功能块名称和功能块号。

(2)主要成员函数的定义:

初始化函数:

DCCE系列PLC支持多种功能块,每种功能块的参数属性,所占网络大小等等属性都是不同的,针对不同的功能块有不同的初始化方法。但是大概的程序流程都是相同的,如图:

初始化功能块体 InitFB 依次初始化功能块参数InitParam

图3-6 功能块初始化 代码说明:

InitFB()函数初始化了功能块的名称,大小,输入数量和输出数量

InitParam函数中声明了一个CFBParamClass类型的变量,并且根据参数初始化了CFBParamClass的实例的成员变量,例如:参数类型(位变量,字变量等),参数左上点的坐标,参数名称等。最后根据参数的形式(输入参数或者输出参数)添加到 CFBClass的成员变量m_FBInParam ,m_FBOutParam两个链表中去。 m_FBOutParam.AddTail(pFBParamClass); m_FBOutParam.AddTail(pFBParamClass);

绘制函数:DrawFunBlock

绘制函数采用MFC绘图函数,函数的接口是一个设备环境CDC类的指针。流程如程序图:

–24–

现场总线控制系统功能块组态软件设计

绘制功能块身体 绘制输入参数链表中的每个参数 调用 功能块参数类中的绘图函数DrawFBParam 绘制输出参数链表中的每个参数 调用

图3-7 功能块的绘制流程

功能块在网格内是可以拖动的,这就需要一个鼠标定位的程序,来判断当前的鼠标是否在功能块的内部。程序的实现流程:首先通过功能块所在的网络,在网络中所在的行和列计算出功能块在整个视图中的左上点坐标,然后创建一个矩形,坐标是相对于视图的,使用LPtoDP(),函数将矩形和当前的鼠标逻辑坐标转化为设备坐标。最后用PtInRect函数判断鼠标是否在矩形中。

其中LPtoDP()函数是CDC中的成员函数,是将逻辑坐标转换为设备坐标,这里涉及到MFC绘图的映射模式,在设备坐标中进行所有的键击操作测试,在设备坐标中定义区域,像 :CRect::ptInRect这样的函数,只有在使用设备坐标时,才能保证结果的正确性。[9]

功能块的参数的输入的实现方法是用户可双击参数区域从而直接配置功能块参数,也可以在参数区域上点右键,选择一个现存的符号表参数,将其配置到功能块参数中。用户双击参数区域时,系统会动态生成一个CEdit控件,然后根据参数所在的位置来初始化CEdit控件的位置,并调用CEdit控件的Create 函数,并将输入焦点设置于Edit控件上。实现了对参数的编辑,其实现的方法是:创建一个CEdit控件,根据功能块参数位置得到一个矩形,矩形的坐标就是输入参数变量的位置,然后将CEdit控件Create在这个矩形的位置上,当用户输入变量名后,CEdit控件把所得的字符传递给成员变量m_strParamVarName,同时在界面功能块参数名称的位置上输出字符串。

此外还有用来设置私有成员变量的Set ,Get函数,刷新功能块函数等,这里不一一列出。

–25–

现场总线控制系统功能块组态软件设计

3.1.7功能块参数类的设计

(1)成员变量

在功能块类的设计中用到了功能块参数类,设计一个独立的类CFBParamClass,如同功能块类的设计思路,功能块参数类的成员变量同样从图形信息数据和逻辑信息数据两个角度去定义。

CFBParamClass 图形信息成员变量 相对功能块位置的行偏移 int m_OffsetRow 相对功能块位置的列偏移 int m_OffsetCol 参数引脚左上点坐标 CPoint m_ptLTLeg 参数引脚大小 CSize m_szLeg …. 参数变量 CString m_strParamVarName 位变量参数是否取反bool m_bInvput 输入参数还是输出参数 int m_nParamOutIn 参数类型 int m_nParamType 参数变量类型 int m_nParamVarType 下位机参数结构体 Oprand m_Oprand ….. 逻辑信息成员变量

图3-8 CFBParamClass类成员变量

说明:

m_nParamType是此功能块参数要求的类型,包括3种,能流或位变量(不允许悬空),变量或立即数,能流或位变量(允许悬空)[11]

m_nParamVarType是用户输入的参数类型,例如,SM0.0是位变量类型,VW0是字变量类型等。

m_Oprand 是一个Oprand类型的结构体,Oprand结构体是功能块参数在下位机的存储形式,通过编译程序后每个功能块参数都生成一个Oprand结构体,保存在m_Oprand中。 2.成员函数

由于参数所在的位置不同,采用的绘制方法也不同,输入参数在功能块的左侧,而输出参数在功能块的右侧,在绘图细节上有代码上的差异,解决办法可以在一个函数中

–26–

现场总线控制系统功能块组态软件设计

添加判断语句,但是这降低了代码的可读性和可维护性,这里采用的办法是设计两个继承类,继承CFBParamClass ,重载了基类中的虚函数DrawFBParam()。

3.1.8链接关系的设计

在功能块组态程序中,功能块是由连线组织在一起的,这里需要设计一个物件类来表示连线, 类名称定义为ClinkObj。

连接线物件的功能就是将两个功能块的参数从逻辑上和图形上联系在一起,设计时同样从两个角度去定义成员变量,连接线是个矢量,它代表了能量流的方向,在组态编辑时定义了默认的方向,是从左到右,从上到下的。所以不用一个成员变量来标志矢量。

连接线基本包括两种线型,如图:

X C 1 A B 2 C 3 D A 2 1 B 线型二 3 D 线型一 Y 图3-9 连接对象的两种基本线型

以线型二为例,链接对象有三条线段组成,可通过A、B、C、D四个点来确定,假定这四个点的坐标依次存放于CPoint m_point[4]数组中,A点的坐标为out_x、out_y,D点的坐标为in_x、in_y,中间的竖线取两个端点的中间位置。由于在程序中采用MM_TEXT的坐标映射方式,即水平增量方向为从左到右,垂直增量方向为从上到下.

由图可知只需要知道out_x、out_y、in_x、in_y、的值就可以完全确定四个点的坐标,从而确定链接对象的图形表示。out_x、out_y、in_x、in_y的值取决于功能块的位置,因此当功能块的位置发生变化的时候应同时计算出这四个值。这样就实现了线型一的可视化操作,同理亦可实现线型二的可视化操作。

从链接的逻辑角度看,包括了能量流的源功能块和参数(CFBClass *m_pSoureFB ,CFBParamClass *m_pSourceParam),能量流的目的功能块和参数

–27–