3转换算法的基本思想
3.1梯形图向二叉树的转换算法
依据二叉树的定义,结合PLC梯形图的特点:以图符表示操作指令,用图符的位置表示串并联的逻辑关系。由于我们采用的梯形同编辑环境是用每一个固定大小的单元格表示一个图符,因而每一个蹦符抽象为二叉树中的每一个结点。
具体的转换思想描述如下:对梯形图巾程序进行从左向右、从上到下的扫描,扫描过程中,识别每个图符所代表的单元类型(功能单元或者连接单兀),空单元不需处理,用每个起点表示二义树的根结点(Root),以左子树表示串联连接,右子树表示并联连接。
3.2二叉树转换成二叉树双向链表
梯形图中图元的执行足有同定执行顺序的。通常,一棵二叉树能够表示一个子过程,一个大型的控制系统南多个子过程按一定的先后顺序组织丽成。在梯形图向二叉树转化后得到的足一个二义树森林,它是一个松散的结构,并不能体现一个系统完整的功能,必须采用一种数据结构将这些二叉树按照一定的次序组织起来,这里采用二叉树双向链表。
二叉树双向链表按照程序的执行顺序将一棵棵二叉树连接起来,每个链表结点代表一棵二叉树。通常,我们的链表结点中存放了每个二叉树根结点的信息,这样通过对链表中的二义树按照顺序进行简化和一次遍历就可以实现梯形图向指令表序列的转化。
3.3二叉树的简化处理过程
由梯形图得到的二叉树双向链表含有大最的连接结点的信息,在由二叉树双向链表向语句表转化的时候,需l要过滤掉这些结点而形成只含有功能单元的.:义树双向链表,并儿能完整地描述梯形图的逻辑功能信息。采用先序递归遍历舣向链表中:叉树结点的方法来完成功能一:义树链表的牛成,在遍历每一棵二义树中图元对象结点的时候,需要进行一系列判断和处理,由此,我们需要设计一个简化算法。具体的简化算法实现见4.2节。
4转换算法的实现
4.1主要的数据结构
4.1.1基本图元数据结构
在整个算法的没汁过程中,采用了面向对象的设计思想,首先将梯形图中的每一个图符抽象为一个图兀对象,对于这些图兀定义了一个基本图元类:
class bascElcment
{public:
int type;//图符单元的类型值
char name[20];//嘲符单,i的变譬名
char dec[20];//图符单元的说明
int row;//图符单元所在的行u|
int f01umn;//I刳符单元所在的列号
bascElcmcnt*lPft;///I:指针
bascElcmcnt*r|ght;//右指针
baseElcment’parent;//父指针
};
在梯形图设计中涉及到的基本指令单元、计时指令单元、计数指令单元、读写指令单元、操作指令单了亡、比较指令单元、转换指令单元等都由慕奉罔元类baseElement派生出来。
4.1.2二叉树的数据结构
在梯形图中,用每一个图符来表示二叉树巾的结点,以每个起始图元对象作为单棵二叉树的根(Root)。以左子树表爪串联连接,右子树表示并联连接。定义二叉树链结类bTrecLink如下:
Class bTrccLink
{pubIic:
base卜1lement root;//根节点图符
bTreeLink*next;//指向下一二叉树
bTrccLink。prior;//指向lii『一二叉树
public:
Insc九l,ef“);//左子树插入
InsertRight();//右了.树插入
DeleteEl咖ent();//删除结点
}
4.1.3二叉树双向链袁的数据结构
梯形图程序的完整信息采用二叉树双向链表来存储,二叉树舣向链表类的数据结构抽象如下:
class treeI.ist
{public:
bTrccLink*head;//双向链表头指针
bTreeLink*currcnt;//当前结点指针
bTrceLink*tail;//双向链表尾指针
public:
InertbTrcc(bTreeI。ink*node,bTreeLink*current);//插入_二义树链结
DIeletebTree(bTreeL.nk*node);//删除二叉树链结}