姚家庆,陶耀东,郑一麟
(1.中国科学院 研究生院,北京 100049;2.中国科学院 沈阳计算技术研究所,沈阳 110004)
当前,开放式数控体系结构已经成为数控系统发展的主流。在这种形势下,传统的PLC 由于难以构成开放式的硬件体系结构、编程方法不相兼容等缺点,无法满足开放式数控系统的要求。相比而言,软PLC 不仅可以充分利用PC 丰富的软硬件资源,为用户提供非常友好的人机交互界面,而且在编程语言上还有各个厂商可以遵循的标准——IEC61131-3 标准。这不仅能够保证系统的开放性,而且在一定程度上方便用户的使用。
MiniGUI 是一种面向实时嵌入式系统轻量级图形用户界面的支持系统[1]具有以下的特点[1]:①较强的伸缩性;②占用资源较少,是一个轻量级的嵌入式图形库;③具有可配置性,方便定制。
此外,MiniGUI 还具有很强的跨系统操作特性。MiniGUI 的抽象层将底层的操作系统和硬件的差别隐藏起来,对上层的应用程序提供一致的接口,使得上层应用程序无需关心底层的差别。其系统的层次结构大致如图1 所示。
图1 MiniGUI 系统层次结构
MiniGUI 是一种轻量级的图形界面支持系统,不仅占用的系统资源少,还具优良的跨平台特性。因此,在开放式的数控系统中使用MiniGUI 实现系统界面,不仅可以节省大量的系统资源,而且还方便移植,本文使用MiniGUI1.6.10 开源版本。
本文主要是基于蓝天数控系统以及IEC61131-3标准来设计PLC 编程系统,其中涉及到的图元包括:常开触点、常闭触点、输出线圈、取反输出线圈、复位和置位线圈、功能类型以及水平垂直连接线等等。
梯形图是一种图形化的语言,因而会涉及到以下的一些问题如梯图图元的设计、图元与梯图的显示、梯图转换成IL 文本、梯图的语法正确性检查等等,本文在设计的过程中就以上的问题逐一进行解决。
由于界面大小的限制,一行显示图元的个数是有限的。在本程序中将梯形图编辑区域划分成等宽的9 列,同时将该区域划分成等高的若干行,形成网格。一般结构简单的图元如触点、线圈之类,占据的空间为一个网格。对于较为复杂的功能块而言,由于包含的输入输出信息较多,可能会占据多个网格。图2 所示是不同图元所占网格大小的对比。
图2 不同图元所占网格大小的比较
为了描述梯形图中使用到的各个图元,程序中使用定义entity 和entityor 结构体:
在entity 结构体当中,name、in 和out 数组用于保存图元的名称以及输入输出参数。m_type 值唯一标记一个图元。x_n 和y_n 来表示组成图元各网格的位置,而各个图形符号在整个梯形图中的位置则使用分量x、y 来表示。
结构体entityor 用于描述纵向连接线图元,定义如下:
其中m_ortype 表示纵向连接线的类别,有左右两种纵向连接线图元。x 和y 则表示该图元在梯形图结构体中的位置。
在程序当中将每一个图元的绘制封装成一个接口。在接口中图元被拆分成若干简单几何图形进行绘制,通过调用MiniUI 中各个基本图形绘制函数来完成整个图元的绘制,以下是MiniGUI 绘制直线、圆、矩形的接口:
图元的地址或输入输出参数可以通过MiniGUI的文本输出接口来显示:
梯图是由若干个图元组成的,梯形图程序对应的数据结构如下所示:
其中max_row 和max_col 为梯形图的最大行数和最大列数。二维数组p 和po 用于存放一般图元和连接线图元结构体指针。
由于窗口大小的限制,显示的梯形图往往是整个梯图的一部分,因而有必要使用一个结构来定位当前显示的梯图位置,定义的结构体如下所示:
其中,row 分量表示当前显示部分梯图第一行在整个梯形图中的行号。col 表示当前焦点光标所处位置的列号。focus_col 则表示当前焦点光标在当前可视区域中的行号,max_focus_col 则表示当前编辑区域内允许的最大行号。
在编辑梯形图时可以根据Plc_ladder 结构体中的内容确定当前编辑的位置,插入或者删除图元时就针对LIDoc 结构体中的p 或po 数组中对应的单元进行处理。同样,在刷新梯形图时,程序通过读取Plc_ladder 结构体中的内容,确定当前窗口显示的梯形图位于LIDoc 二维数组中的位置,并调用绘制函数将该部分的各个图元绘制出来。
梯形图在编辑完成之后必须要保存下来,为PLC的其他模块使用。本程序将梯形图程序转换成一种文本——IL 程序形式保存。在保存之前必须进行梯形图的语法正确性检查。
梯形图的语法检查主要针对的梯形图程序中出现的语法错误,如出现断路、短路、没有标上组件地址、出现重复的标签、非法使用程序的结束标记等等。对于短路可以在扫描并联分支时检查是否出现只有直线的分支,在扫描各个组件时检查其对应的结构体输入区域是否为空就可以检查是否有组件没有地址。而出现重复标签的情形只须在扫描时将标签记录下来,每扫描到一个标签时就将其与已经扫描到的标签进行比较,检查是否重复。对于一般的错误,比如创建组件位置有误、输入错误的参数等则在编辑梯形图时通过扫描梯级就能检测出来并阻止操作,例如为了避免在最后一列插入常开触点,程序可以在插入图元时检查插入位置的col 分量,若为最后一列的序号,则提示该位置不可以插入图元。
梯形图向IL 转换的算法有很多,在文献[2]中采用的方法是先构造逻辑树结构,通过遍历树结构就能得到对应的指令集。文献[3]采用的方法是将构成梯形图的各个梯级分别转换成二叉树,构成二叉树森林,之后对二叉树森林进行遍历,得到相应的指令表。文献[4]利用串并联算法实现PLC 梯形图到指令表的转换,该算法将梯形图转化为有向无环图,对图中的串并联关系进行分类归并,将串并联结构按层次存储在广义表中,根据广义表生成指令表。文献[5]通过将梯形图映射为AOV 图,并由其建立二叉树来表示指令间的逻辑关系,通过遍历二叉树实现梯形图向IL 的转换。文献[6]指出使用AOV图来实现梯形图向IL 文本的转换效率不高,提出将梯形图映射成森林,由森林建立对应的二叉树,通过遍历二叉树来实现梯形图向IL 文本的转换。在本程序中,梯形图向IL 转换所使用的方法是“正向深度扫描”方法[7],这种方法与手工扫描梯图过程类似。它按照从左向右、从上向下的顺序扫描梯图,当遇到比当前更深的分支时则先扫描更深的分支,对每一个分支也执行以上同样的操作。以下图3 是梯形图梯级扫描的一个示例。
图3 梯形图梯级扫描示例
转换后的IL 程序段为:
PLC 梯形图编程系统界面由3 部分组成:信息提示和输入区、梯图编辑区和功能键区。信息提示区用于提示编辑梯图时出现的错误,输入区用于输入图元的地址及参数,功能键区则用于提示当前可以进行的操作。其布局大致如图4 所示。
图4 梯形图编辑界面布局
由于界面宽度限制,诸多功能键选项需要分成多层,通过“下一页”和“退出”按键在各个功能选项组之间切换。不同层次之间,同一个按钮的动作以及显示的文本往往是不同的。因此,程序为不同的层次设置了唯一的状态标记。在处理按钮消息时可以根据当前的状态来确定按钮的动作以及按钮显示的文本。
在编辑浏览梯形图时,焦点的连续快速移动会使得界面刷新的频率增大,很可能会造成界面闪烁。为此,可以采用MiniGUI 下的的双缓冲[7],具体的步骤如下:
(1)创建一个与当前DC 兼容的内存DC;
(2)每次刷新界面,调用绘制梯形图的接口在内存DC 上绘制当前界面中梯形图的可视部分;
(3)使用BitBlt 函数将内存DC 中的内容输出到界面上;
蓝天数控系统使用的PLC 程序包括快逻辑、慢逻辑和子程序,实验中将梯图程序作为快逻辑。下面针对梯图编辑过程当中出现的断路、短路、空跳转以及在并联结构中插入行等错误进行测试,并编写一个完整的梯图程序进行转换,结果如下图5 ~8 所示。
图5 PLC 程序断路报警提示
图6 PLC 程序短路报警提示
图7 PLC 程序空跳转报警提示
图8 PLC 程序插入行错误报警提示
以下是对梯形图转换成为指令表程序进行测试,梯形图程序如图9 所示,转换结果如图10 所示。
图9 梯形图程序实例
图10 保存梯形图生成的IL 程序
经过实验测试,验证了本梯形图编辑工具的正确性与可用性。
本文基于MiniGUI 设计并实现了梯形图编辑工具,实现梯形图的编辑、梯形图的语法检查以及保存等功能。在梯形图保存时使用类似于树深度优先遍历的“正向深度扫描法”,这种方法比较直观、形象。本文实现的编辑器主要将直观的梯图程序转换成为类似于汇编的IL 文本进行保存,并且生成的IL 文件将作为系统PLC 编译模块的输入文件[9]。鉴于MiniGUI 资源占用低、可移植性好等特点,该系统具有一定的实用性。
[1]魏永明. MiniGUI 用户手册[Z]. 北京飞漫软件技术有限公司,2003.
[2]莫易敏,章德平,周哲. PLC 梯形图转化为指令表算法及实现[J]. 控制工程,2006,13(6):573-576.
[3]黄晶晶,陈文芗,叶军君,等. 基于二叉树的PLC 梯形图转化为指令表的算法[J]. 现代电子技术,2010(4):125-127.
[4]林懋恺,王晓芳,林亨. PLC 梯形图的广义表转换[J]. 计算机工程,2007,33(13):75-78.
[5]Ge Fen,Wu Ning. A transformation algorithm of ladder diagram into instruction list based on AOV digraph and binary tree[C].IEEE Tencon 2006.
[6]裴峰,蔡启先,郭森. 梯形图与指令表互换算法的研究[J]. 广西工学院学报,2010,21(3):42-45.
[7]郭书杰. 软件PLC 梯形图编程系统的研究与实现[D].沈阳:中国科学院研究生院,2010.
[8]韩超. 嵌入式GUI 开发设计——基于MiniGUI[M]. 北京:电子工业出版社,2009.
[9]赵鸿玢,于东,李毅霞,等. 基于RTLinux 的软PLC 系统设计与实现[J]. 小型微型计算机系统,2007,28(3):470-473.