1 引言
IEC61131-3国际标准是工业自动化软件的集成标准。IEC61131-3第一个为工业自动化控制系统的软件设计提供标准化编程语言的国际标准。对当代工业控制器中种类繁多的概念及语言进行了标准化,在工业控制领域中产生了重要的影响,被全球越来越多制造商和客户所接受,并且成为DCS、PLC、FCS、IPC、CNC、以及SCADA的编程系统事实上的标准。
本项目采用Visual C++作为开发语言,在开发遵循1EC61131-3标准设计过程中采用面向对象的方法,以提高软件的可重用性。此外,Visual C++在图形编程方面也有比较强大的功能,在梯形图编辑界面的设计中提供了方便。集成了编辑、编译连接、下载和调试等功能,方便了用户对PLC的开发和使用。
2 PLC编程软件的基本功能设计
项目主要任务是开发出一个符合国际标准IEC61131-3《可编程序控制器的编程软件标准》的基于PC的PLC用户软件集成开发平台,为我们自行开发的可编程控制器提供一个友好、高效的编程环境。运行效果如图1所示。
图1 运行效果图
主要功能有以下部分:
(1) 实现梯形图与语句表的编辑功能;
(2) 实现梯形图程序语法检查部分(有无指令地址越界等语法错误)和梯形图程序逻辑检查部分(有无逻辑错误,如指令位置不正确、梯级中缺少输出指令等);
(3) 实现梯形图向语句表的转换及语句表向梯形图的转换;
(4) 实现语句表程序的下载功能。
3 PLC语言编辑模块设计
3.1 梯形图语言编辑模块
(1) 梯形图的表示
整个梯形图指令由若干个梯级组成,每个梯级又是由一个或几个输入元件和一个输出元件组成。我们可以发现梯形图中每个元件其实都有一个共同的属性,该属性可以用一个四元组表示(元件类型,所在位置,地址)。这个四元组是对所有梯形图元件共性的抽象表示,我们将这四个元素封装在类CIO中。
为每个梯形图元件建立各自一个单独的类LD,LDN,O,ON,HOR,OUT。这样做的好处就在于,因为我们在每一个单位区域中画的图形相对于单位区域的位置可以比较容易的控制。
我们知道如果把所有的触点如常闭触点、常开触点等类似的触点,甚至输出触点等功能块的输入电流线起点终点的位置相对于单元区域都是在一条水平线上的时候,当把一个个梯形图元素连接起来的时候,连线也就自然在一条水平线上了。
(2) 梯形图的存储
在绘制梯形图时,我们每次都只绘制一个元件(横向连线和纵向连线也当成元件处理),这些元件从产生时间的角度看是前后相串联的,而且,每个梯形图程序中所使用的元件的数量又是不定的,这两个特点恰是链表结构所特有的性质,所以,我们使用链表结构来描述梯形图程序是最合适的。
我们使用MFC给我们提供的COb- Array类来实现,CObArray和CPtrArray用法很类似,都有GetSize,Add,GetAt等函数,但是CObArray类本身支持串行化,所以我们选用CObArray类来实现,有关文件读写的操作在CDocument的Serialize函数中进行,有关数据和图形显示的操作在CView的OnDraw函数中进行。我们在其派生类中,只需要去关注Serialize和OnDraw函数就可以了,其它的细节我们不需要去理会,程序就可以良好地运行。
(3) 梯形图错误处理
主要检查所绘制的梯形图是否符合规定的格式,如果梯形图不符合格式要求,则会给出错误信息。首先在设置元件地址时,检查地址是否为‘I’,‘Q’,‘SM’,‘M’等事先规定好的字母,如不是则指出错误;然后对字母后的数字进行检查,例如I后面数字的范围在0.0-31.7之间,不是则指出相应错误。还要检查输出元件是否在最右边,元件是否为孤立的等,如果有错在编译是提示出错信息。
3.2 语句表编辑模块
在设计语句表编辑模块时,选用微软基本类库中的CEditView类作为基类。CEditView是一个已具有文字编辑功能的类,它所使用的窗口是Windows的标准控件之一Edit,其SerializeRaw成员函数可以把Edit控件中的数据写到文件中。另一方面,由于该类是从CView类派生而来,支持多窗口操作并有文件预览功能。因此,语句表文件可以非常方便地在编辑视窗中进行编辑。
4 梯形图与语句表的互译模块
4.1 梯形图向语句表转换的实现
通过对梯形图及其设计规则的分析,笔者发现,用梯形图编制程序的过程实质上是一个用梯形图图符来表示操作指令、用图符的串并联及位置顺序来表示操作指令之间逻辑关系的过程。为了在程序设计中更合理地描述梯形图,我们综合考虑了提高程序执行效率、节省存储空间、便于操作等因素,采用十字链表数据结构来存储梯形图。
4.2 语句表向梯形图转换的实现
在对语句表程序进行识别并将它转换为梯形图时,在内存建立与梯形图相对应的十字链表,用于存放转换所得的梯形图。
梯形图的生成在设计中,对语句及其对应的梯形图符进行了详细的分析,总结出梯形图的生成规则:
(l) 当前指令的输出端个数为零
指令队列中的所有元素出列,按规则绘制相应的图符;
(2) 当前指令的输出端个数不为零
进一步判断是否为O,ON或OLD指令。若是,则指令队列中的所有元素出列,按规则绘制相应的图符;否则,当前指令进指令队列;
(3) 指令的输入端个数为零
绘制对应的梯形图符时应与左侧母线连接;
(4) 指令的输入端个数为1
绘制对应的梯形图符时应按程序的逻辑关系,建立正确的连接;
(5) 指令的输入端个数为2
绘制对应的梯形图符时,将占用同一列上的上一行和当前行2个编辑区,并把前一列的上一行和当前行中的两个梯形图图符相连接;
(6) 指令的输入端个数为3
绘制对应的梯形图符时,将占用同一列上的当前行及上两行3个编辑区;并把前一列的上两行及当前行中的3个梯形图符相连接。
5 通讯下载模块的实现
这个模块主要完成的功能是实现运行,停止PLC和能够将STL语言编译成PLC硬件能识别的代码,实现下载的功能。
梯形图语言的处理方式与其它语言不同:梯形图语言作为一种“图形”语言,要直接对其编译是比较困难的,考虑到梯形图语言与语句表语言之间的紧密联系,笔者将梯形图语言翻译为语句表语言,再利用语句表语言的编译模块对其编译。
笔者建一个能够实现串口通信的类Cserial,里面有三个重要的函数Open,ReadData,SendData。按照PLC的通信格式,建立上位机与PLC的通信。逐行扫描语句表程序,将其翻译对应的代码,将得到的程序代码放入下载格式的代码中,就能实现下载等功能。
6 结束语
本文较详细地介绍了PLC编程软件的设计思想,给出了其中用到的主要数据结构,还给出了它们的运行效果。这为开发基于IEC61131-3新型软件PLC的工作打下了较坚实的基础。