软PLC梯形图编辑与指令表生成方法研究

2015-03-11 03:49吴亚山
关键词:二叉树链表梯形图

吴亚山, 陆 阳, 徐 谦

(1.合肥工业大学 计算机与信息学院,安徽 合肥 230009;2.潞安新疆煤化工(集团)有限公司,新疆 哈密 839003)

传统可编程逻辑控制器(programmable logic controller,PLC)是20世纪发展起来并被广泛采用的一种自动化控制装置,具有良好的功能性、高可靠性和强大的工业环境适应能力。实际应用中,不同厂家的PLC硬件结构、编程方法均有差异,PLC体系不具备很好的开放性和兼容性[1],大大限制了传统PLC的发展。国际电工委员会(International Electrotechnical Commission,IEC)颁布的IEC 61131标准[2-3],对 PLC软硬件平台作了统一规范,符合此标准的软PLC技术应运而生。

软PLC不但具备传统PLC的各方面优点,而且克服了兼容性缺陷,程序仅需作少量修改即可在其他符合IEC 61131-3语言标准的硬件平台上运行,同时成本低廉。

IEC 61131-3部分共定义了5种编程语言,包括指令表、结构化文本、梯形图、功能块图和顺序功能图[4],其中指令表和梯形图使用频率最高。梯形图与电气逻辑控制图相似,形象直观,对编程人员友好;指令表则类似汇编语言,可作为软PLC解释执行的目标语言,对硬件平台友好。2种语言元素间存在一一对应的关系。因此实现梯形图编辑和将梯形图转换为指令表,对于推动PLC标准化、通用化,提高控制系统编程效率尤为重要。

本文提出一种基于双向循环链表和十字链表的梯形图编辑和指令表生成算法,实现了一个软PLC开发系统,并分析了软PLC运行系统实现思想。

1 梯形图与指令表简介

梯形图(ladder diagram,LD)是一种图形化编程语言,引入了电气系统中电源轨线、继电器、触点、线圈等概念,以“能量流动”描述数据传递过程,直观性强,易于学习。一个电动机启保停控制逻辑梯形图示例如图1所示。

按动START触点对应的按钮,线圈 MOTOR对应的电动机将持续运转,直到按动STOP触点对应的按钮,电动机停止运转。

由图1梯形图生成的指令表如图2所示。

图1 梯形图

图2 指令表

指令表(IL,instruction list)以一系列指令作为编程语言,由操作符、修正符和操作数等组成。LD指令读取相应触点状态,ST指令将运算后的结果输出到线圈MOTOR对应的输出点,从而控制电动机启停。

2 双向循环链表与十字链表

双向循环链表每个节点中有2个指针,*next指向后继节点,*previous指向前驱节点,因此在查找前驱节点和后继节点时非常高效,如图3所示。

图3 双向循环链表

十字链表是表示正交关系的一种链式存储结构,可用于存储有向图和稀疏矩阵等,如图4所示。

图4 十字链表

3 梯形图的数据结构

3.1 梯形图基本元素定义

梯形图的基本元素包括电源轨线、连接线、触点、线圈等,具体分类见表1所列。

表1 梯形图基本元素及图例

为便于扩展梯形图基本元素,提高程序模块化程度,降低不同基本元素处理复杂度,可将所有梯形图基本元素的共同特征抽象为一个公共基类[5]。LD-BaseElem基类的定义描述如下:

class LD-BaseElem

{CString Caption;//标签名、变量名,如I0.0,X0,Y1

CString s[4];//参数名

CString v[4];//参数值

int LD-Type;//元素类型

int mRow,mCol;//行列坐标

LD-BaseElem*next;//指向后继梯形图元素

LD-BaseElem*previous;//指向前驱梯形图元素

LD-BaseElem*up;//指向上方梯形图元素

LD-BaseElem*down;//指向下方梯形图元素

BOOL visited;//元素是否被遍历

BOOL outputed;//元素IL是否已输出

LD-BaseElem(int LD-Type,int tRow,int tCol){}

virtual void setValue(){}//赋值函数

virtual void Draw(CDC*pDC){}//绘图函数

virtual CString toIL(){}//IL指令转换函数

};

基类中定义了基本元素的类型、输入输出参数、对应的变量名、在梯形图中的坐标等信息。同时以虚函数的方式定义了赋值函数、绘图函数和IL指令转换函数。每个基本元素继承自基类,并按照各自特点重新实现虚函数。如竖直连接线元素,不需要赋值,也不用输出IL指令,只需重写Draw()函数,在指定行列坐标画出该连接线即可。

3.2 梯形图的存储方式

梯形图的存储,可采用数组、链表、二叉树以及AOV网等方式实现[6-8]。一些研究中,基于二叉树、有向图等存储方式,需要二次构造数据结构,建立过程复杂。

求解梯形图的输出值时,应遵从PLC“循环扫描,顺序执行”的工作方式,从左电源轨线开始,各基本元素依次按照从左向右、从上到下的顺序求值,遇到并联块时,优先求解并联块,最后通过线圈输出求值结果;一轮求值结束后,又从左电源轨线开始新一轮求值。

根据梯形图求值特点,可将梯形图中的基本元素作为链表节点,按行建立双向循环链表,在此基础上,为行之间的连接线元素建立十字链接。这种双向循环十字链表数据结构,前后查找效率高,增删、遍历节点方便,同时链式指针逻辑结构符合梯形图求值规则,便于绘制梯形图和生成指令表。图1对应的双向循环十字链表如图5所示。

图5 梯形图的双向循环十字链表示例

双向循环十字链表定义描述如下:

typedef LD-BaseElem Node;

class LinkList

{Node*header;//头节点

int maxRow;//绘图网格行数

int maxCol;//绘图网格列数

LinkList(){}//构造函数

//指定位置插入新节点

void addNode(int LD-Type,int tRow,int tCol)

{//建立左右指针关联

//建立上指针关联

//建立下指针关联}

Node* getNode(int tRow,int tCol){}//查找节点

void removeNode(int tRow,int tCol){}//删除节点

void Draw(CDC*pDC){}//遍历绘制整个梯形图

CString outPutIL(){}//整个梯形图生成指令表

};

定义中,addNode()方法最为重要,其根据不同基本元素类型,动态创建新元素节点,并建立*next、*previous、*up、*down双向十字指针。需要注意的是,触点和线圈节点与不在同一行的其他节点没有直接关系,故其*up和*down指针均保持为NULL;而具有竖直导向作用的连接线(包括左电源轨线、竖电源轨线、右电源轨线、竖直连接线、中层右接线、中层左接线、向下连接线、左下承接线和右下承接线),起到行间连接和控制程序走向的作用,在梯形图编辑过程中其*up和*down指针需按实际情况指向对应的节点。

3.3 梯形图编辑

笔者自主开发了软PLC编程环境,梯形图编辑器如图6所示。

图6 梯形图编辑界面

该编辑器采用多文档窗口开发,可同时编辑多个梯形图程序。主界面分为3部分,左侧用树状结构显示了梯形图基本元素,中间部分为梯形图编辑区,右侧输出梯形图生成的指令表程序。梯形图编辑过程中,调用addNode()函数不断维护节点和指针,Draw()函数可动态更新编辑区的梯形图,outPutIL()函数则实时将当前梯形图转换为指令表。

梯形图的编辑,也就是插入和删除基本元素节点的过程。如图7所示,以删除常闭触点为例,断开其与前驱和后继之间的指针,并且在前驱和后继之间建立链接,再将常闭触点释放即可;插入节点亦然。可见双向循环十字链表在梯形图编辑中的便捷性。

图7 删除梯形图元素

4 梯形图生成指令表

4.1 梯形图元素与指令的关系

梯形图按照从左向右、从上到下的顺序求解输出值。从左向右,各元素执行“AND”运算指令;遇到并联块时,从上到下,并联的部分之间执行“OR”运算指令;连接线控制程序走向;触点用于读取数据,对应“LD”运算指令;线圈用于输出数据,对应“ST”运算指令。

4.2 梯形图生成指令表实例

为便于描述,将图5梯形图双向循环十字链表各节点命名如下:v[i]表示电源轨线和连接线,X[i],Y0表示触点和线圈,如图8所示。

图8 梯形图生成指令表过程

借助栈记录遍历过的电源轨线和连接线节点,编写梯形图outPutIL()遍历算法,按图8所示中箭头及标号顺序表示的路径依次访问节点。分别调用各基本元素节点的toIL()方法输出该元素代表的具体IL指令,最终组成完整的指令表语言程序。

5 相关算法对比

梯形图的编辑和指令表转换,已有算法主要采用链表、二叉树、AOV网相结合的方式实现。

5.1 链表与二叉树结合算法

文献[9]以AOV网的节点表示梯形图元素,AOV网的弧表示梯形图元素间的连接关系,对梯形图进行存储;再将AOV网转换为二叉树,以二叉树的非叶节点表示梯形图串联、并联逻辑关系,对转换后的二叉树进行一定的裁剪,通过中序遍历输出指令表语句。以图1所示梯形图为例,该算法对应的存储结构和转换示意如9所示。

图9 AOV网及二叉树示例

此算法的AOV网将连接线元素统一作为虚节点,梯形图元素间的串联、并联逻辑关系隐含在节点的出度、入度信息中,需要对AOV网进行一次遍历,构建出二叉树,裁剪虚节点,才能进行指令表的转换。AOV网发生变化后,二叉树需要重建。

5.2 双向链表与AOV网结合算法

文献[10]以行双向链表作为梯形图数据结构,用于存储和显示数据;根据行双向链表生成AOV网,对梯形图节点进行拓扑排序,再转换为指令表语句。以图1所示梯形图为例,该算法对应的存储结构和转换示意如图10所示。

此算法的行双向链表仅保留了行内元素之间和行与行之间的逻辑关系,却丢失了处于不同行的元素之间的逻辑关系。因此在将梯形图转换为指令表前,需要对整个链表进行一次扫描,在适当位置添加虚节点(图10中的vp1节点),构建AOV网,再进行拓扑排序和输出。一旦对梯形图进行编辑,建立AOV网的过程需要重新进行。

5.3 本文算法优势

本文提出的双向循环十字链表有以下优势:(1)动态存储。编辑过程中,动态将梯形图按双向循环十字链表存储。梯形图编辑只需针对链表中的部分节点(4个以内)进行增删和指针重定向操作,而不需要二次构造数据结构。

(2)绘图简单。绘制梯形图元素时,无需考虑各元素间的逻辑关系,只需按照网格坐标将各节点绘制在编辑区。忽略行间十字链接的情况下,双向循环十字链表就是一个简单的双向循环链表,通过调用Draw()函数对其进行一次单向顺序遍历即可完成梯形图绘制刷新。

(3)实时转换。双向循环十字链表数据结构保留了梯形图元素间的逻辑关系和层次关系,按outPutIL()指定的遍历算法直接遍历双向循环十字链表,即可按路径顺序输出对应的指令表。

图10 行双向链表及AOV网示例

由于绘图和生成指令表时无需将双向循环十字链表数据结构转换为另一种数据结构,在处理复杂梯形图时,能有效节约系统资源,提高处理效率。

6 软PLC运行系统实现思想

6.1 PLC执行方式

传统PLC按周期运行,每周期分为输入采样、执行程序、输出刷新3个阶段,遵循“循环扫描,顺序执行”的工作方式。① 输入采样,从I/O口读取输入信号,并在整个周期内保持读取的数据不变,直至下次采样;②执行程序,根据输入采样得到的数据,执行控制程序,并将执行结果写到输出映像区;③输出刷新,第2阶段执行结束后,将输出映像区的执行结果反馈到I/O口,实现目标控制。

6.2 软PLC运行系统实现方式

PLC执行程序阶段的实现,有编译执行和解释执行2种方式[11-12]。编译执行需将PLC程序转换为具体硬件平台可直接识别的二进制指令。考虑到PLC程序的兼容性和可移植性,可采用解释执行方式,为硬件平台编写以IEC 61131-3标准规定的指令表语言为目标语言的虚拟机程序。该虚拟机模拟一台PLC设备,从硬件I/O口读取输入信号,并分步解释执行用户指令表程序,执行完成后,将结果输出到硬件I/O口,从而实现指令表语言的“顺序执行”;虚拟机不断重复读取数据、解释指令、输出数据的过程,即可模拟传统PLC“循环扫描”工作方式。这种解释执行的方案,仅需对虚拟机程序进行少量修改,就可使已编写的PLC代码在不同硬件平台上运行,且扩展方便。

7 结束语

本文提出一种基于双向循环链表和十字链表的梯形图数据结构,正确实现了梯形图编辑和梯形图生成指令表算法。该数据结构能直观地表现梯形图各元素间逻辑关系,对实现完整的软PLC控制系统具有一定意义。

[1] 任继锋.基于IEC61131标准的PLC设计与实现[D].沈阳:沈阳理工大学,2012.

[2] 杉布,王蔚庭.IEC 61131-3国际标准简介[J].国内外机电一体化技术,2001(1):54-57.

[3] IEC 61131-3,Programmable controllers,part 3:programming language[S].

[4] 彭 瑜,何衍庆.IEC 61131-3编程语言及应用基础[M].北京:机械工业出版社,2009:6-10.

[5] 郭书杰.软件PLC梯形图编程系统的研究与实现[D].沈阳:中国科学院研究生院沈阳计算技术研究所,2010.

[6] 雷云飞,童 怀,伍世元.基于“逻辑二叉树”的PLC梯形图与指令表互换算法[J].数字技术与应用,2011(4):9-10.

[7] 潘庭龙,沈学芹,纪志成.基于AOV图及因果图的梯形图与语句表互换算法[J].测控技术,2008(11):64-66.

[8] 毕 翔,韩江洪,王跃飞,等.面向PLC的离散事件控制系统设计方法研究[J].合肥工业大学学报:自然科学版,2010,33(9):1333-1337.

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

[10] 毕 辉,程良鸿.关于软PLC梯形图向语句表转换方法的研究[J].微计算机信息,2007(25):63-65.

[11] 卓保特,栾 勇,刘 伟,等.PLC源程序编码方法与解释执行算法设计[J].计算机工程与应用,2012(14):68-73.

[12] 李慧强.编译型PLC编译系统的研究与实现[D].山东:山东轻工业学院,2010.

猜你喜欢
二叉树链表梯形图
二叉树创建方法
基于二进制链表的粗糙集属性约简
数据结构与虚拟仪器结合教学案例
——基于二叉树的图像加密
跟麦咭学编程
一种由层次遍历和其它遍历构造二叉树的新算法
一种由遍历序列构造二叉树的改进算法
PLC编译功能的实现
数控机床梯形图故障设置方法研究
一种可编程逻辑控制程序的竞态检测方法
一种基于有序双端链表的高效排序算法