侯艳君
(华北水利水电学院,河南 郑州 450011)
计算机科学的快速发展和IEC61131-3标准的制定有力推动了软 PLC(Programmable Logic Controller)技术的发展。软PLC技术是一种基于PC的新型控制技术,相对于传统的硬PLC而言,软PLC具有开放的体系结构、强大的网络通信能力和数据处理能力,能较好地满足工业自动化领域中控制系统开放性和柔性的要求,是目前工业自动化领域研究的热点之一。所谓软PLC技术[1],就是以PC作为硬件支撑平台,利用软件实现传统PLC的基本功能,即将PLC的控制运算功能封装在软件内,运行于PC的环境中。这样的控制系统在提供了PLC相同功能的同时,也具备了PC的各种优点。
本文介绍的软PLC编程系统软件采用Windows多任务环境下的多线程技术,以C++Builder为主要开发平台,利用其强大的软件功能,使人机交互界面更为友好。由于C++Builder固有的面向对象机制,可方便地设计梯形图数据结构,并结合相应的算法,完成软PLC编程系统设计。本文设计了界面友好的编辑环境和方便灵活的编辑方式,实现了可视化、规范化的梯形图设计,方便用户使用,提高了PLC编程效率。对提高当前软PLC梯形图编程软件通用化和标准化做出了有益的尝试和探索。
软PLC系统包括编程系统和运行系统,如图1所示[1-2]。编程系统是基于Windows环境的编程工具,运行于普通PC机上。它独立于运行系统,主要完成PLC源程序的编辑、编译以及仿真功能。编程系统最终产生一份满足控制要求的目标代码,运行系统在启动时就可以加载该目标代码,对其进行解释执行,并控制对象进行交互,完成输入、输出处理等工作,最终实现控制功能。
经分析,编程系统软件应具有以下功能:(1)编程和仿真功能:编程功能主要包括程序录入、修改、文件存取和语法检查功能;仿真功能包括模拟开关控制、模拟脱机运行过程。(2)提供菜单和工具栏两种操作方式,输入输出采用直观的图形方式,便于用户直观地编辑梯形图程序。(3)顺序控制功能、逻辑控制功能、数据控制功能、定时/计数功能和监控功能。(4)可对PLC用户程序进行正确性检查(包括编程元件的使用、语法和逻辑关系正确性检查)。(5)实现常见PLC的内部编程元件的仿真,实现PLC指令解释器的仿真。(6)与Windows界面一致,提供中英文两种语言界面与随机帮助,支持对程序的注释。
根据功能需求分析,采用模块化的思想进行软件设计,将编辑系统软件划分为主模块、输入模块、支持模块,仿真模块和通信模块。软件的组成及其相互间的关系如图2所示。
图2 模块划分
主模块完成软件运行参数的初始化,协调其他各模块调用控制,程序打开、显示、保存等。支持模块进行类、对象和结构体的定义。输入模块通过对具体的指令类对象的调用,对数据成员进行赋值、修改等操作,录入、编辑PLC应用程序。仿真模块模拟PLC中的继电器、寄存器及相关I/O变量,有效模拟现场被控对象信号输入,直观地描述各个继电器的相互控制关系,通过时序图实时监控所有 (或部分)程序使用的继电器的通断状态。通信模块在编辑系统和运行系统间进行通信,把经过编译和脱机调试后的目标代码文件下载到运行系统中。
IEC61131-3标准[3]规定了 5种编程语言,其中梯形图(Ladder Diagram)是应用最广泛的编程语言,是PLC编程的最重要编程语言,因此本系统采用梯形图(LD),其他语言待以后进一步加入和完善。梯形图程序的保存采用操作系统自带的记事本,由此需要制定编码规则,并按照这个固定的规则存储数据或打开显示梯形图。
PLC程序中需要表示的控件主要有常开触点NO,常闭触点 NC,输出触点 OP,记时器触点 TM,记数器触点CT、MC、MCE、 跳转控制触点 JP、LAL,上升沿触点 DF、下降沿 DF/,进栈 ANS、ORS、PUSH、RDS、POPS、置位触点SET,复位触点 RST,保持触点 KEEP,横线及竖线等[3-4]。必须为每个触点设定一个专用的标志符号,以便于保存、打开程序时能够识别这些控件。采用字符串与数字组合表示每一个触点控件的相关信息,制定规则如图3所示。
图3 编码规则
图3中,Ο为字符串,Δ为数字,每项可有多位,各项之间加空格。触点种类以符号表示,例如NC为常闭触点,TM为计时器触点。横线设为 Hshort,none代表此块没有被写入信息,END,CNDE,DF,DFNot及 HShort等类其后的数字没有意义。例如,记时器控件可表示为:TM 0 3 30 0 0。把梯形图的每一行分为12个图片位,每个图片位都以此规则表示。为了区分文件是否以此规则保存,规则还设定了SimPLC为此种文件的起始标记。图4所示的梯形图按此规则,可用下面的形式保存成记事本文档。
图4 梯形图示例
存储功能的算法用N-S结构化流程图表示,如图5所示。
图5 存储功能N-S流程图
遍历存储过程程序片段如下[5]:
文件加载时,通过制定的规则进行译码,执行的顺序与存储文件基本相同。
Windows多任务环境下的多线程技术是将CPU的时间划分成许多时间片段,并按照一定的优先级将时间片段分配给各个线程,各线程在各自的时间片段内共享CPU,从而实现微观上的轮次执行宏观上并发运行的多任务机制。多线程技术的主要优势在于充分利用了CPU的空闲时间片,用尽可能少的时间对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。
PLC的工作原理是一个“顺序扫描、不断循环”的单线程循环过程[4]。如果软件采用单线程,一旦开始执行PLC程序,CPU将被这个死循环完全占用,软件的其他事件得不到系统响应,无法运行。因此,决定采用多线程机制[5-6]。仿真模块占用2个线程:(1)控制程序在“在线模式”与“离线模式”之间转换;(2)精确地实时监控。加上系统本身的主线程,共有3个线程。在C++Builder中,通过File/New/Other下 new页面的 “Thread Object”即可轻松地建立多个线程[5]。
实时监控线程的作用是不断地读取程序运行中各个继电器的状态,并将状态的值返回到时序图,以控制时序图的输出。线程对各继电器状态的读取采用链表的形式,依次读各节点的属性。当启动线程时,线程会执行Execute()函数中的程序,GO按钮调用Resume()函数启动线程,STOP按钮调用Suspend()函数暂停线程。运行时,从头开始遍历读取各个继电器的通电状态的powered属性,如果 powered=true,则在时序图上做高为 20、以淡绿色填充的矩形,表示继电器处于通电状态;如果powered=false,则在梯形图上作高为20的矩形,将矩形设置为与窗体相同的颜色,使视觉上感觉好像没有画矩形图,以达到显示不通电状态的效果。矩形左上角的X坐标用一个 xstart变量来取值,xstart的值为 powered改变的那一刻的Image1的水平位置;右下角的X坐标始终为Image1的水平位置,不停地变化。为了限制时序图的大小,等到Image1走到一定的位置,即将它复位到起始点,重新开始画图。程序片段如下[5]:
以C++Builder为开发平台,采用面向对象和多线程技术,实现了在PC机上进行PLC程序的编制、调试和逻辑结果的仿真,使PLC程序编制、调试与硬件脱离。软件提供了菜单和工具栏两种操作方式,操作简单,便于用户直观地画梯形图程序,具有较高的应用和实践价值,对其他类似模拟系统的设计也具有参考价值。
[1]吴玉香,周东霞,林锦赟.嵌入式软 PLC系统的研究和实现 [J].计算机工程,2009,35(10):235-237.
[2]贺无名,余强国.基于嵌入式软PLC的矿井提升机控制系 统 设 计[J].煤矿机械,2011,32(6):244-246.
[3]彭瑜,何衍庆.IEC 61131-3编程语言及应用基础[M].北京:机械工业出版社,2009.
[4]吴建强.可编程控制器原理及其应用(第2版)[M].北京:高等教育出版社,2004.
[5]陆卫忠,刘文亮.C++Builder 6程序设计教程(第2版)[M].北京:科学出版社,2009.
[6]章德宾,胡斌,张金隆.多线程技术与分布式并发离散事件仿真[J].计算机仿真,2007,24(1):97-100.
[7]王纪森,王俊,周宇.基于多线程的电液伺服加载系统测控软件设计[J].机床与液压,2009,37(10):159-160.