嵌入式软PLC编程系统的设计

2010-09-22 06:55安静
电气传动自动化 2010年6期
关键词:链表梯形图嵌入式

安静

(广东松山职业技术学院电气工程系,广东韶关512126)

1 引言

随着控制技术向网络化、智能化和开放式发展,传统PLC逐渐暴露出其许多不足。主要表现为技术封闭,造成了各生产厂商的PLC产品互不兼容,且编程开发方法差别很大,技术专门性很强,用户必须经过长期培训才能掌握其中一种产品的开发方法,这些问题制约了传统PLC的快速发展[1]。随着计算机科学的发展和工业控制的IEC61131国际标准的制定,出现了用软件方式实现传统PLC控制功能的软PLC技术。

软PLC具有符合现代工业控制技术的优点,体系结构开放,支持多种硬件环境,解决了传统硬PLC互不兼容的问题。软PLC把控制运算的功能封装在软件中,具有传统PLC的功能,可在计算机操作系统中实现程序的编辑、运算、编译、存储等功能,具有编程语言标准化、控制功能模块化、硬件配置灵活等特点[2]。

本文介绍的嵌入式软PLC编程系统软件在Windows环境下引入VC++开发工具,利用VC++强大的软件功能,使人机交互界面更友好,由于VC++固有的面向对象机制,可方便地设计梯形图数据结构,并结合相应的算法,完成软PLC编程系统设计。本文主要给出编辑、编译和仿真模块。

2 嵌入式软PLC系统的总体框架

图1 嵌入式软PLC系统总体框图

嵌入式软PLC主要由编程系统和运行系统组成。编程系统进行梯形图的编辑、指令的解析以及生产目标代码;运行系统执行目标代码,实现控制目的[3]。其总体架构如图1所示。

软PLC编程系统的编程语言基于国际电工委员会发布的IEC61131-3国际标准,是一个通用的开发环境,主要是由编辑、编译、仿真和通信四大模块组成[4]。其中编辑模块提供用户程序开发环境;编译模块实现对用户程序的扫描和编译;仿真模块用以离线模拟、调试用户程序;通信模块负责把编译后的用户程序目标代码下载到运行系统。

3 软PLC编程系统的界面设计

IEC61131-3国际标准(International Electro technical Commission)定义了5种PLC编程语言的规范:梯形图(LD)、顺序功能图(SFC)、功能模块(FBD)、结构化文本(ST)和指令表(IL)[3]。由于梯形图简单、直观,所以本编程系统主要采用梯形图作为用户程序的开发语言。

本软件采用VC++开发工具,并基于多文档的Document/View结构设计,以支持梯形图和指令表对应的格式—*.lad和*.txt。其界面由梯形图编辑区、指令表区和信息输出区三部分组成,如图2所示。

图2 软PLC编程系统主界面

1)梯形图编辑区用于梯形图驻留和相关参数的设置;

2)指令表区用于显示梯形图对应的逻辑指令;

3)信息输出区显示梯形图可能的语法错误信息以及正确执行后的输出信息。

4 梯形图数据结构设计

4.1 梯形图元件类的继承关系设计

梯形图元件包括常开触点、常闭触点和输出线圈等简单元件和定时器、计数器、数据运算(包括加减运算、比较运算等)等复杂元件。由面向对象的继承特性,可以抽象出一个类作为梯形图元件的总体接口,再以这个类为基础,派生出具体的元件子类。梯形图元件的抽象类定义如下:

由此抽象类派生出简单元件类和复杂元件类,并扩充相应的属性和方法操作;再由这两类派生出具体元件类,如常开触点或定时器等。如图3所示为各元件类型的继承树示意图。

图3 梯形图元件类型的继承关系

4.2 梯形图容器的数据结构设计

整个存储梯形图的容器选择用双向链表结构表示。其原因基于以下两点:①对梯形图的添加、修改、删除等操作,能够方便地运用链表的存储结构完成;②梯形图的编辑过程是动态的,梯形图的行数、列数和元件类型都是未知的,这种动态存储过程,用链表结构比其它的数据结构表达得更为清楚、有效。

存储梯形图的双向链表在文档类中定义为:CObList m_LADList,存储梯形图的容器。由此,添加梯形图元件,实质就是在内存中建立相应的对象,并调用链表的AddHead或AddTail函数加入该对象的指针;而删除梯形图元件,实质就是调用链表的RemoteHead或RemoveTail函数移除链表中对应对象的指针。下列代码表示生成一个常开元件对象,并把该对象的指针加入到链表中:

//通过简单工厂生成常开元件对象

pLADEle=CPLCFactory::GetInstance(TYPE_POSITIVE);

pLADEle->SetIsSelected(FALSE);

//将常开元件对象的指针加到链表中

//这里,plcList是指向 m_LADList的指针plcList->AddHead(pLADEle);

4.3 用户对梯形图元件的控制

用户通过与编程界面的交互,达到对梯形图元件的控制。为了缩小显示、控制和梯形图元件三者间的耦合性,可引入MVC(Model-View-Control)模式解决。其中,由VC++中的CView类充当显示部分,并设计CPLCEleController类用以控制梯形图元件。CPLCEleController类依赖于工厂类CPLCEleFactory类,通过简单工厂模拟以创建梯形图元件实体,并且针对编辑、编译和仿真的操作封装了相应方法。其定义如下:

5 梯形图的编辑

梯形图的编辑部分封装于视图类,能实现存储与显示分离,以有效降低代码的耦合性。

梯形图的编辑大体可分为以下步骤:①选择所要加载的梯形图元件类型;②用户在编辑区单击鼠标,扫描程序获取单击对应位置的笛卡儿坐标值;③添加该梯形图元件到存储链表中;④在窗口中显示该梯形图;⑤设置梯形图元件的其它参数。

5.1 梯形图的绘制

矢量图是计算机通过数学表达式解析的图形,具有内存消耗小,操作灵活的特点。因此,本软件按矢量绘制梯形图。

在VC++中,MFC类库中的CDC类封装了矢量图的相关操作,由此,对梯形图的绘制可以通过遍历链表,并调用CDC类对象指针的函数来完成。并基于面向对象的多态性调用各元件实际的绘制操作:

梯形图被绘制后,其类型、行号、列号信息均被确定。而其它的参数,如元件编号、定时器的时基,由用户输入确定,具体可以通过添加消息映射函数,扫描鼠标操作实现。当用户双击某梯形图元件时,弹出参数设置对话框,输入数据后,相关的参数就被绑定在该元件对象中。下面的代码片段表示对定时器设置参数。

5.2 梯形图的序列化

要实现梯形图的多次编辑,就要对梯形图实现序列化,将其保存为文件;而当再次调用时,需要把程序加载到内存。

对于Document/View结构,数据都存放于CDocument类里,将其中的变量写入文件,即实现了梯形图的序列化;打开文件时,通过动态创建机制,把其中变量导入内存,即实现了梯形图的反序列化。

由于梯形图元件类继承了CObject类,因此,运行时其自身具有类型识别和动态创建的功能,在CArchive类中调用重载的读写运算符">>"和"<<",就能执行相应文件缓冲区建立和数据读写。

6 梯形图的编译

梯形图的编译是编程系统的关键部分,因为编译的实质是把用户编辑的梯形图程序,经过语法分析和逻辑分析,循环扫描,最终生成运行系统可识别的目标程序。

按照梯形图编程语言规范,编译程序扫描梯形图,经过语法分析和逻辑分析后,若发现梯形图有错误,便生产相应的错误提示信息,并复制到用户界面。

6.1 梯形图的扫描

梯形图扫描和编译以梯级为单位,且梯级是由相互影响的行组成的最小单元,图4所示为一个梯级。对梯形图的扫描采用深度扫描算法,即以竖线元素作为逻辑区分,对梯形图网络自左向右,从上到下,逐个元素进行。

图4 梯形图扫描过程图

以图4为例,一个梯形图梯级的深度扫描过程为:①首先读取串联关系的元件X1和X2;②遇到并联接点A,从而转至下一行扫描,读取元件X4;③遇到并联接点B,转至下一行,读取元件X6;④回到并联接点B,读取元件X5;⑤回到并联接点A,读取元件X3;⑥读取输出元件Y1,则完成该梯级的扫描和编译。

实践证明,该扫描算法容易实现,能深入解析梯形图逻辑关系,占用存储空间较少,扫描效率较高。

6.2 梯形图数据信息的记录

为了提高移植性,降低运行系统程序与VC++程序的耦合度,本软件引入了生成相应配置文件技术,以记录梯形图的数据信息,供仿真模块或运行系统读取。

梯形图被扫描过程,程序自动生成梯形图相关的逻辑关系数据对应的配置文件,用四组数字分别代表梯形图的类型、连接关系,包括复杂元件中定时器的时基等数据信息,以备在运行系统加载。其梯形图数据信息存储结构示例如表1所示。

表1存储了一个梯形图的梯级信息,一个梯形图元件对应表中的一格,表中"X-X-X-X"的格式为简单的元件信息,分别表示“元件类型-连接关系-存储类型-对应存储类型数组的偏移量”。如表中第1行第1列的"1-0-0-25"数据,代表梯级中位于第1行第1列,无并联关系的常开触点,它在简单元件类型输入数组中的存储偏移量为25。

表1 梯形图数据信息存储结构示例

7 梯形图的仿真

为了判定被编译程序执行的正确性,本编程系统设计了仿真模块,以模拟现场梯图程序运行。仿真需要将梯形图程序转化为C程序,以实现逻辑控制。

仿真模块主要分为逻辑运算模块、算术运算模块和梯形图更新显示模块。其中,逻辑运算模块是仿真模块的核心,负责对梯形图数据信息的识别,以及逻辑状态的转移。

仿真程序通过读取存储梯形图逻辑信息的配置文件,并还原对应每个梯形图元件及相应的逻辑关系。以下的代码片段通过运行是类型识别,反映了当前读取的元件是常开/常闭触点或输出线圈时的逻辑运算:

//常闭触点,右连接:=左连接取反

//常开触点,右连接:=左连接,不需改动

//输出能流为左连接状态和本元件状态相与

动态仿真过程在梯形图编辑区实时显示方便用户进行错误定位、追踪。具体表现为梯形图元件能流导通时的变色反显,可通过重绘触发的方式实现。

8 结束语

本嵌入式软PLC编程系统实现了梯形图的编辑、编译和仿真功能。并基于VC++开发平台面向对象的封装、继承和多态性,通过编辑过程引入存储梯形图信息的配置文件,实现了编译与仿真的桥接,有效地降低了与VC++开发环境的耦合度,移植性强。

[1] 高金刚,陈建春,刘雄伟.数控系统的软PLC系统开发[J] .计算机测量与控制,2004,12(3):254-256.

[2] 肖世广,李 彦,吉 华.Linux环境下基于Qt库的软件PLC 编程系统[J] .计算机工程与设计,2007(4):1663-1666.

[3] 黄延延,林 跃,于海彬.软PLC技术研究及实现[J] .计算机工程,2004,30(1):165-167.

[4] 江连海.嵌入式控制系统开发平台上软PLC的实现[D] .华中科技学,2005:14-17.

猜你喜欢
链表梯形图嵌入式
基于二进制链表的粗糙集属性约简
跟麦咭学编程
基于链表多分支路径树的云存储数据完整性验证机制
搭建基于Qt的嵌入式开发平台
基于VC的梯形图编程软件开发技术
嵌入式软PLC在电镀生产流程控制系统中的应用
继电器电路转为梯形图教学经验浅谈
一种可编程逻辑控制程序的竞态检测方法
PLC梯形图程序设计技巧及应用
链表方式集中器抄表的设计