基于MDI应用程序的软PLC指令表编辑模块的实现*
2012-11-24陈婵娟
陈婵娟,李 龙
(陕西科技大学机电工程学院,西安 710021)
0 引言
软PLC技术是一种基于IPC或EPC的将PLC的控制功能封装在软件内的控制技术[1],也就是通过软件来实现标准硬件PLC的基本功能。它不但具有传统PLC的PID调节、离散控制和I/O控制功能,而且具有微型计算机的高速数据处理和网络功能[2]。由于国际编程标准IEC61131-3的制定和推广应用,软PLC技术已经成为一项新兴的技术。
根据IEC61131-3的标准,可选用的编程语言有:梯形图(LD),指令表(IL),结构文本(ST),功能模块(FB)和顺序功能图(SFC)[3]。指令表程序可以更方便的用于程序的编译,所以指令表编辑模块的开发具有着很大的实用意义。为了使所开发的系统能够实现指令表编辑功能,本文根据指令表语言的特点,并采用C++语言成功开发了指令表编辑模块,从而实现了指令表语言的编辑,修改与输出。
1 MDI应用程序的结构
指令表编辑模块是建立在多文档界面应用程序之上的。多文档界面应用程序简称MDI(Multiple Document Interface),它允许有多个文档、视图类和多个文档模板CMultiDocTemplate存在,即可以建立多种文档——视图——子框架窗口的关系[4]。由于MDI程序基于的文档模板类为CMultiDocTemplate,能够同时创建多种文档类型,所以采用了MDI应用程序来开发软PLC开发系统,开发出的软PLC开发系统界面如图1所示。
图1 软PLC开发系统界面
2 指令表编辑模块的实现
2.1 指令表程序显示窗口的实现
图1中最右侧的窗口为指令表程序最终的输出窗口,该窗口不仅可以显示指令表编辑器所编辑的指令表程序,还可以显示由梯形图程序转化的指令表程序。根据指令表程序语言的特点我们将所创建的指令表程序显示窗口设置成一个列表视图控件。实现方法是给程序添加一个基于CListView类的新类:CILView,并给这个类定义一个类型为CListCtrl的变量:m_listctrl,从而来初始化列表视图控件。
指令表程序显示窗口是从原有的MDI应用程序窗口拆分而来的。实现方法是在CChildFrame类中定义两个类型为CSplitterWnd的变量:m_wndSplitter1和m_wndSplitter2,再利用这两个变量调用函数CreateStatic()来拆分窗口,最后将构建的类CILView通过函数CreatView()将列表视图控件在拆分的窗口上显示[5]。MDI应用程序窗口切分流程如图2所示。
图2 MDI应用程序窗口切分流程
2.2 指令表编辑器的设计
指令表编辑器是在一个对话框上实现的,通过给程序添加一个对话框资源,并构建一个基于CDialog类的新类:CEDITDlg来实现的。基于对话框的类CEDITDlg定义如下:
为了获取程序相应的“步数”、“指令”和“操作数”这三个元素,在对话框上添加了三个Edit Box控件来。同时为了方便用户预览程序,也在对话框上添加了一个具有网格线风格的列表视图控件。另外还添加了5个按钮控件,从而实现“删除”和“插入”等功能,以便用户能够对程序进行更改和删除等操作。指令表编辑器的界面如图3所示。
图3 指令表编辑器编辑界面
2.3 指令表编辑器数据结构的设计
指令表程序主要包括“步数”、“指令”和“操作数”这三个元素,根据这三个元素首先定义一个结构体CILElement用于存储程序的相关数据。数据结构体CILElement的定义如下:
定义完存储数据的结构体后,再用MFC的链表类将程序的每个“步数”串联起来,就是定义一个CPtrList类的变量 m_IlList指向定义的结构体CILElement,以便对后面对程序的序列化和输出。程序输出之间要对程序数据进行提取、交换与存储,数据的提取、交换与存储流程如图4所示。
图4 数据处理流程
2.4 指令表编辑器数据的输出
指令表编辑器里输入的数据经过提取、交换和存储,接下来就是要将编辑器里输入的数据输出到程序的最终输出窗口。实现的方法是分别在源文件CEDITILDlg.cpp和CS_PLCView.cpp的头部定义自定义消息码:#define WM_SET_IL WM_USER+100,最后通过自定义的消息处理函数实现数据的输出[6]。指令表程序最终输出界面如图5所示。
图5 指令表程序最终输出界面
3 结束语
图5是指令表编辑器编辑的程序最终输出到列表视图控件所在窗口的界面,由于对指令表程序所包含的三个元素采用字符串类CString类进行定义,所以数据在处理过程中不会出现错误,在程序运行时保证了输入和输出程序的一致性。软PLC相对于传统PLC来说,它更灵活,可以根据用户自己的需求开发出相应的产品,并且价格低廉。指令表编辑模块是软PLC开发系统不可或缺的部分,该模块的开发对于整个开发系统的完整性具有重要意义。同时指令表编辑模块的开发也为以后程序的编译和仿真奠定了基础。
[1]黄延延,林跃,于海斌.软PLC技术研究及实现[J].计算机工程,2004,30(1):15-17.
[2]陈婵娟,高帅,王杰.软PLC开发系统梯形图编辑模块的实现[J].组合机床与自动化加工技术,2010(10):5-6.
[3]Open-PLC programming using IECll31-3,http://www.engineeringtalk.com.
[4]杨波,叶春,等.用VC++实现一个通用的MDI应用程序[J].计算机应用,2001(7):4-7.
[5]候俊杰.深入浅出MFC(第二版)[M].武汉:华中科技大学出版社,2001.
[6]郑慧,范忠诚,等.零基础学 Visual C++[M].北京:机械工业出版社,2008.