首页 > 范文大全 > 正文

基于二叉树的PLC梯形图转化为指令表的算法

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于二叉树的PLC梯形图转化为指令表的算法范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:针对PLC梯形图利于编程,但不利于被执行的特点,利用二叉树这个中间工具,提出了一种将梯形图转化为指令表的转化算法,转化以梯级为单位,采取“从左至右,从上至下”的扫描顺序构造二叉树结构,然后对树进行后序遍历得到指令表。并简要介绍了梯形图编辑软件的各个组成部分,以及梯形图的编辑环境;描述了算法的主要数据结构。

关键词:梯形图;指令表;二叉树;后序遍历

中图分类号:TP311文献标识码:A

文章编号:1004-373X(2010)04-125-03

Algorithm from PLC Ladder Diagram to Instruction Table Based on Binary-Tree

HUANG Jingjing,CHEN Wenxiang,YE Junjun,LIN Zhimin

(School of Physics and Mechanical & Electrical Engineering,Xiamen University,Xiamen,361005,China)

Abstract:Owing to PLC ladder diagram′s traits of being programmed easily and processed inconveniently,an algorithm of transformation from PLC ladder diagram to instruction table are presented using the tool of binary tree.Based on a single rung as a conversion unit,the binary-tree data structure are created following the scanning order of from left to right,from top to bottom through the conversion process.Then the instruction table are obtained through the post-order traversal of the binary-tree.In addition,various components of PLC ladder diagram software and the editing environment of PLC ladder diagram are introduced,and main data structure of the algorithm are described simply.

Keywords:ladder diagram;instruction table;binary-tree;post-order traversal

0 引 言

国际电工委员会制定的工业控制编程语言标准[1]规定了五种PLC的编程语言:梯形图(LD),指令表(IL),功能模块图语言(FBD),顺序功能流程图语言(SFC)以及结构化文本语言(ST)。其中,以梯形图最为常用[2],因为它与继电器线路类似,与电气操作原理图相对应,而电气设计人员对继电器控制较为熟悉。即使是PLC编程的初学者,也因为PLC梯形图的直观和易于掌握而选择用梯形图来编程,但是梯形图不能被PLC的CPU识别。指令表编程语言是与汇编语言类似的一种助记符编程语言,和汇编语言一样有操作码和操作数组成。汇编语言是与计算机硬件联系非常紧密的低级语言,易于被通用PC的CPU执行,指令表也有类似特点,它也是比较接近机器码的语言,但是使用者要学习和记忆PLC的编程指令。如果把梯形图的逻辑通过人工翻译的模式转化成为指令表,这大大加大了开发人员的工作量(事实上这已经是用指令表编程了),而且较为复杂。基于此,为了方便PLC应用程序开发人员,研究PLC梯形图转化成为指令表的算法,开发出一种指令表自动生成模块,也就是梯形图转换成指令表的编译模块,是非常有意义的。

1 梯形图与指令表

1.1 梯形图

梯形图与继电器控制线路图非常类似,不过梯形图本身也有自己的设计规则[3]:梯形图程序应按自下而上,从左至右的方式进行编制;触点一般不画在垂直分支线上;合理的组织串联电路块的并联和并联电路块的串联,比如,在有几个串联回路相并联时应将触点最多的那个串联回路放在该梯级的最上面,而在有几个并联回路相串联时应将触点最多的并联回路放在梯形图的最左面(靠近左母线的一端);输入触点只允许画在输出线圈的左边等。

1.2 指令表

指令表其实就是有逻辑的指令序列,类似于汇编语言。各个大厂商的PLC有其自己的指令集,不过大同小异,只是命名方式和各厂提供的功能指令不同。梯形图转化成指令表后指令的排列顺序都保持一致,正是基于此,梯形图与指令表之间一一对应,可以相互转化。

梯形图的编辑要有一个平台,采用VC++作为开发工具,搭建一个梯形图的编辑环境[4],也就是开发出一个PLC编程软件,这个软件平台的搭建必须界面友好,还要利于编译。

整个软件系统分为三个子窗口,有梯形图编辑窗口,指令表生成窗口,编译信息提示窗口;整个软件分为四个模块,分别是梯形图编辑模块,编译模块,文件管理模块,仿真模块,其中,文件管理模块主要用于用户编制的梯形图的保存和读取[5]。

为了方便绘制梯形图,将梯形图的绘制窗口设计成为一个网格区,每个网格可以画一个元件,水平连接线是一个特殊元件,它也属于元件的范畴,但是它不是图符,也就是不属于后面所说的节点类的对象。梯形图的绘制主要是元件的选择和连接。

梯形图的编辑环境和梯形图的编译是联系非常紧密的,好的编辑环境非常利于编译和排查语法错误,将梯形图的绘制窗口设计成网格区就是利于编译的一种做法,因为在扫描过程中分成一个个单元进行扫描,这样做利于设计扫描算法。

3 梯形图的数据结构

3.1 二叉树的构造

通过对plc梯形图程序设计规则的研究可知,用梯形图编制程序的过程实际上就是用梯形图图符来表示操作指令,用图符的串并联关系以及位置顺序来表示操作指令之间逻辑关系的过程[6]。

既然梯形图与指令表之间是一一对应的,那么在将PLC梯形图转化为指令表的过程中势必有规律可循。通过手工翻译大量的梯形图后(可以对照梯形图1以及它的指令表1,指令表命名方式基于三菱PLC系统[7])发现,梯形图中每个梯级的图符的逻辑关系是一种层次结构,而这种层次结构容易用数据结构中的树来表达,把每个梯级用二叉树这种结构表达出来后,那么整个梯形图就是多个二叉树的集合,也就是森林。现在的问题是如何来构造这棵二叉树。

利用面向对象的编程思想,由于图符是梯形图的基本构成元素,先把图符抽象成一个类,也就是一个节点对象的类(这里的节点就是指图符)。这个对象的类包含数据和一些函数,数据代表要存储的节点的内容,下面是这个类的数据成员的描述:

class Node

{private:

int x,y;//节点所在窗格在绘图区域的位置

bool BehindBranch;//节点后面是否有向下线

bool FrontBranch;//节点前面是否有向上线

char name[10];//与该图符对应的指令

int index;//图符的索引号

}

除了节点类以外,还需要一个表示梯级的类,由这个类实例化的对象含有一个梯级所有的节点,由于梯级是二叉树结构,这个类取名BinaryTree类。这个类中提供了一些函数,它们用来扫描节点,合并树和构造树结构。

class BinaryTree

{

public:

int ScanNode();//从左至右,从上至下扫描图符

bool IsBehindBranch();//判断是否扫描到向下线

bool IsFrontBranch();//判断是否找到节点向上线

}

图1 复杂串并联关系的梯形图

表1 梯形图1的指令表

地址指令操作数地址指令操作数

00LDX008ORX5

01ORX109ANB

02ANIX210LDIX8

03LDX611ANIX9

04ANIX712ORB

05ORB13OUTY1

06LDX314END

07ANDX4

构造二叉树的主要步骤是:

(1) 从左至右,从上至下扫描梯级,若未发现节点后面有向下线就一直向右扫描,直到发现向下线时停止,记下向下线的位置和扫描过的节点,若扫描过的节点有多个,每扫描到两个就新建一个AND节点,它是这两个节点的父节点;新建的这个AND节点继续参与构造二叉树,作为后序AND节点(如果有的话)的子节点。比如有三个节点,解决方法是,前两个节点新建一个AND节点,再建一个AND节点,它是刚才AND节点和第三个节点的父节点,如图2所示。

图2 构造二叉树结构

(2) 从当前行的下一行,向下线的位置开始向左扫描,是否有节点存在,若有则新建一个OR节点,继续向左扫描,直到发现节点之前有向上线存在,如果有,这一层扫描结束,扫描过的节点如果有两个或是多于两个,仍然按照第1步的方法建立AND节点,OR节点是上一行已构造好的子树的根节点和新建立起来的AND节点的父节点。

(3) 若当前行的下一行还有向下线,以当前行的下一行作为当前行,递归进行第(2)步。

(4) 第(2)步中,从当前行的下一行,向下线的位置开始向左扫描时,若左边没有元件存在,说明向下线连接的是右边的元件,此时也建立一个AND节点,它是右边并联块和已扫描过的节点建立起来的子树的跟节点的父节点,如图3所示二叉树中的第三层左边的AND节点。

(5) 节点排列的顺序需要注意,最先扫描到的节点作为新建的AND节点或是OR节点的左子节点。

这样就建立起梯形图的二叉树结构,二叉树只是表示了图符间的逻辑关系,不表示具体的指令含义。

所有图符节点都是所构成的二叉树的叶子节点,而AND节点或OR节点都是非叶节点,AND节点和OR节点分别表示左右子树的串联和并联关系[8]。

图3 梯形图1的二叉树结构

3.2 二叉树转化为指令表

经过扫描和错误检查后,建立起类似图3所示的梯级的二叉树结构后,对二叉树的遍历即可转化为指令表。根据先前构造二叉树时所建立起来的顺序可知,树的遍历顺序是后序遍历[9],也就是先访问左子节点,然后访问右子节点,最后是根节点。对图3的二叉树结构进行遍历所得到的原始指令表如表2所示,对比表1可知,它还有一些需要修改的地方。比如,由于二叉树只是表示了图符间的逻辑关系,不表示具体的指令含义[10],指令的含义存储在指令所属的Node对象中的name成员数据中,对于指令LD X1,若其后面的指令是AND或OR,将指令合并成一条指令AND X1或OR X1,表2中地址为01和02的指令就需要合并成一条OR X1的指令;对于两个并联块的串联或是两个串联块的并联需要将指令改为ORB或是ANB,如表2所示中地址为08,14,18的指令;对于最后一条指令,如表2中的AND节点,也就是二叉树的根节点,它没有实际意义,将其舍去。

表2 遍历图3所得的原始指令表

地址指令操作数地址指令操作数

00LDX011AND

01LDX112LDX5

02OR13OR

03LDIX214AND

04AND15LDIX8

05LDX616LDIX9

06LDIX717AND

07AND18OR

08OR19OUTY1

09LDX320AND

10LDX4

4 编译模块的流程图

对于每一个梯级,首先经过扫描,在进行编译,看其是否有语法错误;如果有,在编译信息提示窗口输出提示信息,如果没有错误,说明通过了编译,利用所设计的算法建立起用户梯形图的二叉树森林并保存,然后对二叉树森林进行遍历,得出原始的指令表,最后对指令表做相应的修改及优化得出最终指令表,并在指令表生成窗口显示出来。如图4所示。

图4 编译算法的流程图

5 结 语

这里主要探讨梯形图转化为指令表的算法,借助二叉树这个中间工具,从图1,表1及表2给出的指令表实例可以看出,该算法能够正确的将梯形图转化为指令表,方便了PLC编程人员的应用程序开发过程。但是编译的效率方面有待提高,因为如果梯形图串并联关系复杂,二叉树的层次将较多且不平衡(多为左子树层次远大于右子树),遍历花费的时间较多,现在的CPU运算能力强大,主频一般都能达到1 GHz,所以编译的时间不是问题。除了正确性,编译模块还给出了错误信息报告,而错误报告和调试等的可用性方面也是很重要的。

参考文献

[1]Karl-Heinz J,Tiegelkamp M.IEC61131-3:Programming Industrial Automation Systems[M].Berlin:Springer-Verlag Company,2001.

[2]白艳艳,陈卫福,于春娜.开放式数控系统中软PLC的研究开发[J].机械管理开发,2005(3):24-27.

[3]钟肇新,范建东.可编程控制器原理及应用[M].广州:华南理工大学出版社,2008.

[4]章德平.软件PLC开发平台的设计和实现[D].武汉:武汉理工大学,2007.

[5]潘勇.数控系统中梯形图编程软件的研究及实现[D].武汉:武汉理工大学,2005.

[6]莫易敏,章德平,周哲.PLC梯形图转化为指令表算法及实现[J].控制工程,2006,13(6):573-576.

[7]龚仲华,史建成,孙毅.三菱FX/Q系列PLC应用技术[M].北京:人民邮电出版社,2006.

[8]葛芬,吴宁.基于AOV图及二叉树的梯形图与指令表互换算法[J].南京航空航天大学学报,2006,38(6):754-758.

[9]Robert Lafore.Java数据结构和算法[M].2版.北京:中国电力出版社,2004.

[10]Lee G B,Han Z D,Lee J S.Automatic Generation of Ladder Diagram with Control Petri Net[J].Journal of Intelligent Manufacturing,2004,15(2):245-252.