基于IEC61131-3标准的软PLC开发系统的研究与实现
2018-11-26
(西南科技大学 信息学院特殊环境机器人技术四川省重点实验室,绵阳 621010)
0 引言
随着传统PLC在工业生产中的广泛应用,逐渐表现出一些弊端:例如,不同品牌、不同型号的产品不能够相互兼容;数据结构封闭,用户不能添加或改变其功能;各厂家编程语言各不相同,使用人员需要经过长期专业化学习。以上问题制约着传统PLC的发展,但随着电子技术和计算机的发展以及IEC61131-3标准的制定和实施,涌现出了一种基于计算机来实现传统PLC功能的软PLC技术。相对传统PLC,软PLC具有开放的体系结构、强大数据分析和数据处理能力、友好人机界面及便于操作等优点[1]。
本系统采用C++语言开发,同时遵循可编程控制器标准IEC61131-3。系统采用模块化的设计方法,将常用的程序功能分解为若干小模块,并对每个小模块加以封装;支持自顶向下和自底向上两种开发方式;该标准所规范的编程系统独立于具体的目标系统,可以最大限度实现在不同的PLC目标系统中运行;提供多种编程语言,包括三种图形化语言和两种文本化语言,给程序编制人员提供更多的选择[2]。
1 软PLC开发系统的功能模块
开发系统主要由编辑模块、项目管理模块、仿真模块、通信模块和编译模块组成。编辑模块即梯形图编辑器,主要功能包括梯形图图元的绘制、编辑、保存和读取以及注解、逻辑检查;编译模块进行梯形图到指令表的转换以及由指令表编译生成目标代码;仿真模块进行元件的测试、跟踪调试、状态监控;通信模块作为开发系统和运行系统的连接枢纽,实现它们之间信息交换[3]。软PLC开发系统模块如图1所示。
图1 软PLC开发系统模块
2 编辑模块
2.1 梯形图编辑界面的设计
编辑界面是系统与用户交互的窗口,不但可以编写程序,而且还可以利用该界面将编写好的程序送到存储区,同时可以进行检查、调试和修改程序,监控程序的运行情况,通过外围硬件调入及显示保护装置的状态、系统参数,通过接口与CPU联系,实现人机对话。
本开发系统的梯形图编辑界面利用VC++中MFC的文档/视图结构来设计,该结构中的文档负责数据的维护和管理,视图用来显示。该编辑界面不但具有标准Windows环境下的标题栏、工具栏、菜单栏、状态栏,而且具有针对编程环境所设计的梯形图绘制区和梯形图元件工具箱。梯形图绘制区域左边框输出为左母线,右边框输出为右母线,画布被划分成9行、16列,用黑色小点进行划分。用户可以根据程序大小,设置画布的大小,本编辑界面最大支持100行、16列。梯形图编辑界面如图2所示。
图2 梯形图的编辑界面
2.2 梯形图的图元设计
梯形图的图元由可编辑属性的图形符号构成,是输入、输出继电器等器件的抽象表示形式。随着PLC控制对象的复杂化,控制功能的具体化,梯形图的图元种类越来越多。因此,需要考虑如何应对梯形图的图元种类繁多这个问题。通过分析发现,可以把图元划分成不同种类,通过提取共同特征,利用C++语言的封装性、继承性和多态性,构建一个图元的基类,通过类的继承和扩展派生出具有不同特性的指令图元[4]。图元由结构定义、绘制生成方法和基本属性三部分构成。图元结构定义为:
绘制某个图元时,用户首先用鼠标选中要绘制的元件,然后在编辑区选中元件放置的位置,最后单击鼠标的左键就可以完成绘制。其中具体的绘制流程如图3所示。
图3 图元绘制过程
不同的图元具有一些相同属性或功能,例如图元的类型、大小、名称、使用说明,此外还有复制功能、显示功能、保存及参数设置等功能。因此定义图元属性结构基本上包括位置信息、接口信息、连接信息。图元的位置信息规定图元在编辑界面中的位置参数。接口信息规定图元的线性、线宽、颜色、文本输入等[5]。连接属性描述各图元元件属性与接口数据及表达式的对应关系,建立连接后可以进行数据参数传递,从而实现图元属性和外观的改变。
2.3 梯形图的存储
梯形图是由图元按一定规则组合而成,图元之间不但存在位置关系还存在逻辑关系,如何正确描述并保存图元之间的位置和逻辑关系是梯形图编辑模块中要的一个重要环节。通过分析发现,梯形图程序是由若干网络构成,网络由若干行构成,行由若干图元组成。梯形图编辑是一个动态的过程,网络、行数和图元均不确定,因此梯形图的存储需要动态分配存储空间。根据该特点考虑采用链表存储结构。除此之外,梯形图编辑过程常常进行删除、插入、剪切、复制等操作,这些操作使用指针可以方便地完成。双向链表是环形结构,可以从任意结点遍历整个链表。在双向链表中,每个结点包括三个域,分别是data(数据域)、next(后继结点指针)和prior(前继结点指针)。双向链表结点的结构如图4所示。采用行双向链表对梯形图每行进行存储,head指针是头指针,current指针为当前指针,tail指针为尾指针,其结构如图5所示。
图4 双向链表结点的图示结构
图5 行双向链数据结构图
3 编译模块设计
3.1 梯形图到换指令表的转换
由于梯形图具有形象直观和易于编程的特点成为PLC最常用编程语言之一,但却不能被PLC的CPU直接识别。指令表类似汇编语言,便于底层运行系统解释执行。因此,为了使梯形图被PLC的CPU识别,可将梯形图转换成指令表。有多种方法将梯形图转换为指令表,本文采用AOV有向图和串并联扫描的方法,该方法相对其他方法具有效率高、占用空间少、逻辑错误查找快等优点。该方法是梯形图映射成为AOV有向图,从而确定各元件后继和前驱关系,再利用串并联扫描构建逻辑树,确定元件之间的逻辑关系,最后对逻辑树进行遍历,生成指令表。
AOV图由顶点和弧构成,梯形图则由若干图元和线段按照一定规则相互连接而成。通过分析发现,可以把梯形图中的图元看作AOV图的顶点,图元之间的连线看作弧,因此就可以实现梯形图到AOV的映射[6]。同时,映射需要在母线和其它联结处加入虚顶点。下面给出一个梯形图实例和对应映射的AOV有向图,分别如图6和如图7所示,其中AOV有向图中顶点1、2是两个虚顶点。
图6 梯形图
虽然AOV能描述出各元件的后继和前驱的关系,但是不能描述其逻辑关系即串并联关系,因此需要进一步研究图元的串并联关系[7]。基于AOV有向图的串并联扫描的步骤如下:
图7 AOV有向图
1)对AOV进行扫描,确定串联或并联关系;2)对更新AOV图进行串并联扫描,同样根据扫描结果去更新AOV图;3)重复执行1)和2),直到能够生成能够清楚反应逻辑关系逻辑树。
以图7的AOV有向图为例,I0.0和I0.1是串联关系,可以用串1表示;I0.2和I0.3是串联可以用串2表示;I0.5和I0.6串联用串3表示;串1、串3、I1.1并联可以用并1表示。如此不断扫描更新,最终建立一棵完整的逻辑树如图8所示。对逻辑树进行后序遍历生成指令表如表1所示。
图8 串并联扫描生产的逻辑树
表1 遍历生成的指令表
3.2 指令表编译系统设计
指令表虽然是类似汇编的底层语言,但是它编写的程序却不能被PLC的CPU直接识别和执行。指令表程序在PLC运行之前,需要翻译成CPU能够识别的二进制代码[8]。指令表程序翻译成目标机器可以执行的机器码,需要经过四个阶段:词法分析阶段、语法分析阶段、词义分析及代码优化阶段、目标代码生成阶段。编译过程如图7所示。
图9 指令表编译过程
本文采用Flex工具和Bison工具进行词法语法分析。Flex是一种词法分析程序生成软件,会根据规则生成一个Flex文件,该文件由定义段、规则段和用户代码段组成。其结构的格式如下:<定义段>、<语法规则段>和<用户子程序段>。定义段包括词法分析选项、外部变量、宏及函数声明、结构定义、开始状态声明,名字定义等。规则段以“%%”开始和结束的,是Flex输入文件的主干,并且和后面的语法分析密切相关。规则段由模式和动作组成,模式是匹配单词的正则表达,动作是扫描指令表源文并识别出一个单词时,词法分析程序采取相应的行为。
Bison是一种通用目的的语法分析程序生成器,它使用自下而上的向前LALR分析方法造语法树,将LALR(1)上下文无关文法的描述转化成分析文法的C程序[9]。Bison的语法规则形式由终结符和非终结符组合表示。Bison源程序结构由<声明段>、<语法规则段>和<用户子程序段>三部分组成。声明段是以“%{”符号开始,以“%}”符号结束,定义类型和变量、宏等头文件以及声明全局标识符和一些函数。语法规则段是由一条或多条规则组成,每条规则以分号结束。用户子程序段包含必须的头文件,定义声明函数和其它辅助函数。
4 梯形图逻辑检测模块
梯形图的编辑需要符合编程规则和逻辑规则,当发现梯形图存在逻辑错误,软件以框图的形式向用户报错并且向用户指出错误的位置和类型[10]。针对常见逻辑错误进行如下的分类:左右母线直接水平相连,中间没有元器件;输入线圈与左母线直接相连;输出线圈后面有图元连接;出现断路、短路的情况;同一地址输出线圈多次使用造成逻辑混乱;出现线圈串联;功能块指令缺少输入和输出[11]。
5 结束语
本文阐述了利用c++语言开发软PLC技术的实现方法,该方法能够实现PLC梯形图的绘制、逻辑检错、存储以及梯形图到指令表的转换,通过对指令表的编译生成运行系统可执行的目标代码。本方法采用面向对象编程技术,使得系统具有易维护、易扩展、效率高的优点。