基于C#液位过程测控软件的设计与实现
2012-08-01崔海全张春梅赵志诚
崔海全,张春梅,赵志诚
(1.太原科技大学电子信息工程学院,太原030024;2.新疆69028部队,乌鲁木齐830006)
液位控制是工业生产过程中的一类常见问题,液位过程控制实验系统能够很好地模拟工业生产中液位过程具有的非线性、时滞和时变等复杂特性。此外,液位过程测控平台的搭建和控制策略的研究,对工业生产中实施液位过程控制具有重要的指导作用[1]。
利用工业自动化组态软件可以快速搭建起较复杂的测控平台。组态软件除去了测控软件实现过程中的大量编程工作,使测控平台的开发效率获得了极大的提高,同时保证了测控平台的工作性能和测控质量[2]。然而,由于组态软件重点强调通用性,在使用过程中使得系统体积庞大,造成了资源的很大浪费,同时又难以满足个性化要求,价格昂贵,不适合大多数中小型企业。因此,开发人员更多地利用VC++、VB等具有强大功能的编程环境开发符合企业要求的测控软件[3-4]。虽然利用这些编程语言可以自由地对系统资源进行控制,但是很容易造成内存泄漏而影响软件运行和控制质量。同时,用于这些编程环境的COM(Component Object Model)组件往往难以掌控和使用。
C#是微软提出的一种基于.NET框架且面向对象的高级编程语言。C#由C和C++派生并拥有其强大的性能,同时拥有类似VB的快速开发能力[5]。基于C#开发的液位过程测控软件可以很好地实现测控系统的要求,利用.NET程序集、MSIL(Microsoft Intermediate Language)和JIT(Just In Time)编译器完成对组件的充分利用,并且通过垃圾回收机制回收软件运行时不再使用的内存资源,避免了内存泄露等缺陷。
1 控制系统构成
选用的液位过程控制系统由被控对象、检测装置、执行机构、采集模块和工控机5部分组成,其结构如图1所示。其中,被控对象由上水箱、中水箱和下水箱组成,其中上、中水箱的直径为25 cm,高度为20 cm.下水箱的直径为35 cm,高度为20 cm.检测装置为安装于水箱底部的扩散硅压力传感器和变送器,实现对水箱液位的测量,其输出信号为4 mA~20 mA DC.执行机构为智能直行程电动调节阀,其输入的控制信号为4 mA~20 mA DC或1 V~5 V DC,输出为4 mA~20 mA DC的阀位信号。检测装置和执行机构通过台湾鸿格ICP7000系列智能采集模块与工控机进行通信,其中I-7017是8路模拟量输入模块,I-7027是4路模拟量输出模块。工控机实现对液位过程的监督和控制作用。
系统工作时,压力传感器和变送器将液位高度转化为4 mA~20 mA DC模拟信号,经泓格I-7017采集并转换为数字信号送入工控机。测控软件调用适当的控制算法给出控制量,通过I-7024模块将控制量转化为4 mA~20 mA DC模拟信号传送到电动调节阀,控制阀门开度,实现对液位过程的控制。
图1 液位过程控制系统结构图Fig.1 Structure of the level-process control system
2 测控软件设计
2.1 软件功能需求和性能要求
为实现对液位过程的控制,测控软件应具备的功能主要包括:与采集和控制设备通信并进行数据交换;动态添加、设置并加载控制算法;实时显示监测数据;数据报警;绘制实时曲线和历史曲线;存储历史数据并支持对历史数据的查询等。
对测控软件的性能要求主要包括:实时性,在有限时间内对各种事件作出反应,并给出控制作用;多任务性,使多个任务在同一台计算机上并发执行;高可靠性,在计算机、输入输出设备、被控过程等正常工作条件下,要求软件运行稳定、可靠。
2.2 软件设计思想和流程框架
采用人性化的HMI(Human Machine Interface)。设计用户界面有以下几个主要规则:用户的熟悉程度;一致性;可复原性;用户的多样性等。
测控软件的设计方法采用面向对象编程(Object-oriented Programming,OOP)技术。OOP作为一种程序设计泛型将对象作为程序的基本单元,将数据和程序封装在对象中,提高了程序的重用性、灵活性和可扩展性[6]。
利用.NET程序集编写控制算法。在组件技术的基础上,.NET程序集提出了一种全新的建立和展开组件的方法[7]。其允许不同版本的组件无需在系统注册表中注册组件信息即可安全地在同一台计算机上共存[8]。
应用多线程技术,使计算机并行处理多个任务,提升系统的运行能力。此外,由于多核处理器近年来的快速发展,将并行的多任务线程交给不同的核心分别处理,使采用线程级并行编程的软件运行速度得到进一步地提升。
设计测控软件的基本流程框架如图2所示。
图2 软件基本流程框架Fig.2 Basic framework of the software process
3 测控软件的实现
选用Visual Studio 2005(VS2005)进行所有.NET程序的开发。VS2005拥有软件生命周期所需的大部分工具,同时C#是微软专为.NET平台而创建的编程语言,能够使用.NET Framework代码库提供的每一种功能[9]。数据库选用SQL Server 2005.下面介绍软件实现的一些关键技术。
3.1 创建用户控件
VS2005中缺乏监控界面需要的一些特殊控件,因此,根据VS2005工具箱中的控件并利用.NET程序集创建需要的用户控件。通过将几个已有控件组合并且将其功能和界面封装在一起,实现显示和控制的功能。通过这种方法创建的用户控件所有属性均可在软件运行时动态调整并保存到配置文件中。
曲线信息控件CanCurveShow,如图3(a)所示。通过组合checkBox和pictureBox控件,用以解决实时曲线和历史曲线描绘时,某一曲线是否显示和显示该曲线的名称、颜色、画笔宽度、画笔样式等属性。其中,将更新显示方法放在属性中,当属性改变时可及时更新显示。定义CanCurveShow控件的CheckedChanged事件,以响应是否显示该曲线。
图3 用户控件Fig.3 User controls
采用类似方法创建的其他用户控件包括:实时数据显示控件UCMonitor,用以实时数据的监控,如图3(b)所示;阀门控件Valve,用以显示电动调节阀反馈回测控软件的模拟信号,如图3(c)所示;管道控件Pipe,用于显示水流的位置和方向,如图3(d)所示。
3.2 串口通信
利用ActiveX Control(OCX)for ICP7000系列组件,通过串口实现工控机与模拟量输入模块I-7017和模拟量输出模块I-7024之间的通信。在程序添加该OCX组件时,自动将组件中的数据类型转换为.NET数据类型,并为其创建一个Wrapper assembly(包装器程序集),该程序集在.NET运行中自我说明,避免了在系统注册表中注册信息,可供C#直接调用。通过该组件可以完成串口、输入输出模块地址、通信参数、输入输出通道等信息的设置以及对串口的控制。
通过程序集中的方法可完成数据的采集和输出。获取模拟量输入数据的函数原型为:float AnologIn(short iChannelNum);输出控制数据的函数原型为:void AnalogOut(short iChannelNum,float fOutValue);获取控制输出反馈数据的函数原型为:float AnalogOutReadBack(short iChannelNum)。
3.3 控制算法参数的配置以及数据的存储
软件能够导入多种控制算法,不同控制算法所需监控的参数各不相同,需要在加载算法时能够进行详细地配置。此外,从数据库中读取的相关数据的维数也随着控制算法的不同而不同。本文利用.NET泛型类Dircionary<K,V> 和List<T>类完成对参数的配置和数据的读取。泛型类是以实例化过程中提供的类型或类为基础建立的,创建过程非常简便,可完成对集合动态地增加、删除、插入或排序等多种功能。在添加控制算法程序集时,通过对控制算法参数个数的设定,动态生成标号从0开始的文本控件,将标号与输入的参数名称对增加到Dircionary<K,V>类的实例中,达到对参数的配置。数据采集时,将一周期采集到的多个数据顺序添加到List<T>类实例中,实现对不同维数数据的读取。
数据存储的实现分为两步,首先软件运行过程中将采集到的数据及采集时刻的时间信息利用文件流保存到本地磁盘,然后在控制结束后,将本地磁盘的数据导入数据库。这样既保证了软件运行时过少地访问数据库,也保留了文本形式的数据备份,提高软件运行的实时性和可靠性。
3.4 实时曲线和历史曲线的绘制
本文中实时曲线实现为两种显示方式:背景随曲线同步移动;背景固定,曲线移动。历史曲线显示内容分为:当前控制过程的历史曲线;数据库中历史数据的历史曲线。曲线图形的Y坐标为数值大小,X坐标为相对于第一次采样时间的时间间隔。实现增加某一数据newValues[i]在曲线图形控件的Y坐标语句如下。
tmpNoteMessage.Y.Add(picHeight-coordinateY-
(((float)newValues[i]-yMinValue)/(yMaxValue
yMinValue))*(picHeight-coordinateY));
其中,picHeight为曲线图形控件的高度,coordinateY为曲线图形控件的Y轴偏移量,用以显示在X轴方向的时间坐标信息,newValues[i]为某一组数据中的一个数据,yMinValue为Y轴显示的数据最小值,yMaxValue为Y轴显示的数值最大值。
当前控制过程的历史曲线利用文件操作的输入流将数据读取到程序中并显示。数据库历史曲线利用以关系型的、面向表的格式访问数据的ADO.NET将数据库中的历史数据读取到程序中并显示。与实时曲线不同的是,历史曲线采用两个泛型类实例存储数据,分别为全部的历史数据和供显示的历史数据,通过按比例减少供显示使用的泛型类实例的数据量实现曲线的放大、缩小功能,同时不影响曲线的质量。此外,在显示曲线图形控件上,通过MouseMove事件响应鼠标在曲线图形控件上的移动动作,根据鼠标的位置,判断鼠标是否划过曲线,将鼠标处的曲线数据及采集时刻信息跟随鼠标显示。
3.5 多线程实现
设计的线程包括:人机交互线程(主线程),数据采集、控制算法运算线程,数据采样线程等。为避免多个线程同时访问同一块内存,采用两种线程同步技术。对于标志位采用Interlocked类为多个线程共享的变量提供原子操作。对于数据更新代码块的同步定义了一个线程锁,利用lock关键字保证代码块的安全运行。
3.6 控制算法程序集的实现与加载
本文将控制算法实现为.NET程序集,通过更改控制算法程序集实例中的字段和属性改变控制算法参数,输出为运算过程中需要监控的参数数组。程序中利用.NET反射技术编写LoadDllFrom-Resource类,该类用以动态处理控制算法程序集。将程序集内容读取到字符数组中,通过Assembly类实例装载字符数组,实例化程序集内容。Assembly是System.Reflection.Emit命名空间的类,能够在运行时构造类型。关键代码如下:
FileMode.Open);
//定义字符数组,用以存储程序集内容
byte[]buffer=new byte[(int)Fs.Length];
//读取程序集内容到字符数组中
Fs.Read(buffer,0,buffer.Length);
//利用Assembly类装载程序集
Assembly myAssembly=Assembly.Load(buffer);
//获取程序集中定义的类型
Type[]type=myAssembly.GetTypes();
//判断程序集是否与配置时相匹配,namespace为控制算法的命名空间,className为控制算法的类名称
foreach(Type t in type)
{if(t.Namespace==namespace && t.Name==
className)
{//获取程序集中方法,m获取运算过程方法,fm获取更新参数方法,lpProcName为运算过程方法名称,lpFreshName为更新参数方法名称
MethodInfo m=t.GetMethod(lpProcName);
MethodInfo fm=t.GetMethod(lpFreshName);
if(m!=null&& fm!=null)
{//实例化与配置项匹配的类型
object o=Activator.CreateInstance(t);
return;
}}}
4 实验结果及分析
//定义文件流用于读写文件,lpFileName表示程序集路径,FileMode.Open表示打开现有文件
FileStream Fs=new FileStream(lpFileName,
以下水箱为被控对象,编写PID控制算法程序集进行控制实验。软件运行界面如图4所示,界面分为三个面板,分别为虚拟液位过程面板、参数监控面板和实时曲线面板。
图4 人机交互界面Fig.4 Human-machine interactive interface
根据采样定理及现场要求,设定采样周期为500 ms.采用经验试凑法确定PID控制器参数,其中比例系数kp=10,积分系数kI=0.11,微分系数kD=0.07.初始液位为1 cm,待液位稳定后,设定液位值为6 cm,控制效果如图5所示。其中,系统调节时间为264 s,上升时间为183 s,超调量近似为0.实验结果表明,基于.NET程序集开发的PID算法能够很好地实现液位控制,并且运行稳定。
5 结语
基于C#设计的测控软件,实现了实时液位数据的采集和处理、数据异常报警和报警日志记录、动态加载控制算法、实时曲线和历史曲线的绘制、数据存储和查询等功能。在.NET框架基础上运用了面向对象编程、.NET程序集、多线程等技术,简化了控制算法加载和配置方法,节省了运行时间,保证了运行时对系统资源的合理利用,使软件具有很好的可靠性和实时性。
图5 液位响应曲线Fig.5 Response curve of the liquid level
[1]王志新,谷云东,李洪兴.三水箱多变量液位控制实验设计[J].实验技术与管理,2007,24(1):32-36.
[2]王朝阳,王学选.时滞液位过程模糊-PI控制系统设计[J].太原科技大学学报,2011,32(2):98-102.
[3]李子彬,赵志诚,张井岗.基于VC++6.0的PC机与PLC串口通信的实现及其应用[J].太原科技大学学报,2008,29(3):192-195.
[4]李晓鹿.基于C#上位机监控组态软件的设计与开发[D].济南:济南大学,2010.
[5]ANDREW KENNEDY.Securing the.NET programming model[J].Theoretical Computer Science,2006,364(3):311-317.
[6]韩欣欣.面向对象的软件测试方法研究[J].信息化研究,2010,36(10):32-36.
[7]黄海涛,谭瑛,周小波.基于构件的动态配置应用框架设计与实现[J].太原科技大学学报,2008,29(4):271-275.
[8]孙玉钰.基于.NET组件技术的插件式框架的研究[J].计算机应用与软件,2009,26(6):143-145.
[9]KARLI WATSON,CHRISTIAN NAGEL.Beginning Visual C#2005[M].北京:清华大学出版社,2006.