e-works数字化企业网  »  文章频道  »  工业自动化控制  »  PLC/DCS

基于QT的软PLC梯形图编辑软件的设计与实现

2019/1/8    来源:互联网    作者:陈雪  刘荫忠  徐恩松      
关键字:梯形图  指令表  类层次  存储结构  
本文重点是软PLC梯形图编辑软件的设计与实现。采用跨平台能力很强的Qt作为开发工具,能够将系统应用于多种操作平台,使系统具有更强的开放性。

1 引言

    可编程逻辑控制器PLC,是利用来自输入输出装置的信号及存储的程序,来控制机械或程序的动作。随着计算机技术的快速发展和广泛应用,传统PLC逐渐表现出其弊端,这严重制约了传统PLC的发展,随着计算机技术的快速发展及工业自动化领域IEC61131-3国际标准的推出和实施,用软件实现传统PLC功能的软PLC技术应运而生,并得到广泛发展。

    梯形图被称为PLC的第一编程语言,凭借其直观易学的优点,成为了最广泛的编程语言。梯形图采用图形语言,沿用了继电器的触点、线圈、串并联等术语和图形符号,在计算机上和控制技术上称为“面向生产过程的语言”。

    目前,已开发出很多软PLC梯形图编辑软件,大部分编辑软件在Windows操作系统下,采用MFC开发工具进行开发设计。在此平台下开发的软件只能应用于单一的Windows操作系统。针对此问题,本文采用跨平台能力很强的QT作为开发工具,从而使开发软件能够应用于大部分操作平台。

    将编辑软件的设计分为两个模块,编辑模块和转换模块。编辑模块主要实现梯形图的绘制、编辑、程序的存储和加载等功能:转换模块主要完成梯形图程序的语法逻辑检查、梯形图转换指令表等工作。

2 编辑模块

    QT的QMainWindow类提供了一个应用程序主窗口,包括菜单栏、工具栏、中心部件和状态栏等。在本系统的设计过程中,主框架继承自QMainWindow,这为以后的设计工作带来了很多方便之处。

    中间的编辑视图区不仅要绘制梯形图程序,还需要将转换后的指令表程序显现出来。因此,在主窗口的巾央区域采用了多文档界面(MultipleDocumentInterface,MDI)应用程序,或者称为MDI应用程序。在本编程软件的设计过程中,将QMdiArea类作为中央窗U部件,通过让每一个窗口都作为这个QMdiArea的子窗L]部件,实现多文档界面设计。

    2.1 类层次结构设计

    2.1.1 系统类的设计

    梯形图是由一个个像素组成的位图,计算机没有分析梯形图程序,以及判断每个元素间逻辑关系的能力,冈此,需要找到一种计算机可以“读懂”程序的描述方法。软件设计过程中,采用面向对象的设计方法。根据梯形图中对象的性质和功能将其抽象归并为四大类,分别为梯形图类LadLadder、梯级类LadRung、梯级行类LadLine和图元类LadComponent。

    2.1.2 图元对象的设计

    在设计过程中,为了减少代码的书写量,提高执行效率,为每一个图元建立一个类,根据图元类生成实例对象,将这些对象组合起来就构成了一个梯形图程序。

    根据梯形图图元的复杂程度不同,将梯形图图元分为两类:基本图元和功能指令,并相应抽象出两个基GraphElement和GraphFB,所有图元都继承自这两个基类。

    下面分别对图元基类和图元派生类进行设计。

    (1)图元基类的设计图元基类分成两部分:一类为基本图元基类,另一类为功能指令基类。下面分别介绍对这两个基类的设计方法。

    ①基本图元基类

    基本图元结构简单,是在设计顺序程序时最常用的指令,它们进行执行一个位运算的操作。包括常开触点、常闭触点、(取反)输出线圈等,从这些图元中抽象出一个基类GraphElement,定义了其共有的属性和操作接口。基本图元基类定义如下:

    classGraphElement{

    public:

    GraphElement(QPixmap*pixl);

    QStringaddress;//对应的输入地址

    QPointpoint;//所画图元的起始坐标

    QPixmap*pix2;//用作绘图设备

    virtual-GraphElement();

    protected:

    virtualvoiddraw();};//画图函数

    可见,GraphElement类抽象出了此类图元的共有属性,包括输入地址和坐标等信息,共有方法为画图函数。

    ②功能指令基类

    在绘制程序时,有些功能很难用执行位运算的基本图元来实现,此时用相对复杂的功能指令编程会更方便。功能指令包括二进制加(减)、逻辑与、计数器、计时器等。功能指令基类GraphFB定义如下为:

    classGraphFB{

    public:

    GraphFB(QPixmap*pixl);

    intFBtype;//用来标识不同的功能指令

    QPointpoint;//绘制图元的起点坐标

    QPixmap*pix2;//用作绘图设备

    virtual~GraphFB();

    protected:

    virtualvoiddraw();};

    (2)图元派生类的设计

    图元基类作为父类,封装了此类图元共有的属性和方法,根据每个图元的不同特性,从基类派生出各个图元子类,从而封装了每种图元对象所特有的属性,描述图元除了各种属性之外还有一些成员函数。有些方法是所有图元共有的,但具体的实现方法不同,在基类中将这样的函数声明为虚函数,在各个图元派生类中进行重载。例如在屏幕上绘图函数voiddraw(),由于每个图元的图符显示不同,因此需要将此函数定义为虚函数,在每个派生类巾进行重载。此方法充分体现了面向对象语言中接口和实现分离的思想。

    2.2 梯形图的存储结构

    梯形图的编辑过程是一个动态存储的过程,本文采用链表的数据结构存储梯形图来表述这种动态过程。梯形图由一个或若干个相互独立的梯级组成,每个梯级由一行或若干行组成。每一行又由很多图元组合而成。因此,梯形图梯级的存储结构选择采用两个层次的双向链表结构。梯形图梯级的存储结构如图1所示,下面分别对图元和行头结点设计数据结构。

梯形图梯级的存储结构图

图1 梯形图梯级的存储结构图

    2.3 绘制与编辑功能

    该软件为用户提供一个具有绘制与编辑功能的梯形图编程环境。设计过程中,使用一个行头结点HeadList的全局对象FastLadder作为梯形图存储结构的索引,通过全局对象上、下、左、右扫描可以得势一个完整的梯形图存储结构。

    QT中的二维图形引擎是基于QPainter类的。要想在绘图设备上绘图,只需创建一个QPainter,再将拒针传到该设备上,而在Qt的默认情况下要使用QPainter画图必须在paintEvent()函数里完成。paintEvent()是系统自带的函数,可以在类中重载以响应paint事件。系统封装的update()函数可以自动调厍paintEvent()函数。因此,在实现梯形图绘制或编辑功能时,需要在其对应的函数体中调用update()函数,update()函数会自动调用paintEvent()函数,从而能够完成将梯形图显示在绘制区域上的操作。

3 转换模块

    3.l 梯形雷语法逻辑检查

    在进行梯形图的绘制和编辑过程中,不可避免会遇到一些违背编程规则的情况。例如,短路、断路等语法逻辑错误。因此,需要对梯形图进行全面检查,确定准确无误后,才能将梯形图程序转换为对应的指令表程序。

    短路是指两个垂直连接线之间只有水平连接线,而没有任何其他图元出现。在检查时,只需顺次扫描梯形图程序,先找到两并联垂线,再判断两者之间是否有直接相连的情况。可以通过记录两并联垂线间的图元个数得出结论,若图元个数为零则表明出现短路;断路是指某一个干路或支路上缺少图元,可以通过扫描梯形图程序并记录下扫描到的图元,扫描结束后若发现还有未扫描到的图元就判定为断路。

    除此两种情况以外,系统还可能出现其它语法逻辑错误,此处不再一一列举。

    3.2 梯形图转换指令表

    指令表称为语句表或布尔助记符,是一种用助记符表示用户逻辑程序的文本化语言。与梯形图相比,指令表更接近于机器语言,更易于被转换为软PLC运行系统所识别的目标代码。IEC61131-3国际标准规定的其它四种编程语言,都可以转换为指令表语言。因此,若能实现对指令表语言的编译,即可实现对其它编程语言的扩展编译。

梯形图转换指令构成形式

图2 梯形图转换指令构成形式

4 结语

    基于Qt开发工具,设计了一款商观、方便、开放、高放的梯形图编辑软件,具有编辑和转换功能。经过测试,该软件的绘制、编辑操作方便、灵活,并能对梯形图程序进行语法逻辑检查,将其正确地转换为指令表程序。

责任编辑:邓忠帅
本文来源于互联网,e-works本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供,并以尽力标明作者与出处,如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
兴趣阅读
相关资料
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐