基于Matlab、VC++与PCAuto组态软件混合编程方法的Kalman滤波器实现

来源 :科学与财富 | 被引量 : 0次 | 上传用户:zdb_zhang
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:Matlab是功能强大的工程计算和数据分析软件,VC++是面向对象的快速开发工具,PCAuto组态软件是面向监控与数据采集(Supervisory Control and Data Acquisition, SCADA)的软件平台工具。三者结合,可以取长补短,能开发出处理复杂矩阵运算且界面友好、满足工程领域需要的应用软件。本文探讨了三者混合编程的详细实现过程,通过一个Kalman滤波实例,说明了实现混合编程方法的过程和实用性。
  关键词:Kalman滤波;VC++;Matlab;PCAuto;混合编程
  1 引言
  滤波问题是如何从被噪声污染的观测信号中过滤噪声,尽可能消除或减小噪声影响,求未知真实信号或系统状态的最优估计。由于信号和噪声往往是多维非平稳随机过程,因此1960年初Kalman[1,2]用时域上的状态空间方法提出了Kalman滤波理论,提出了便于计算机上递推实现的Kalman滤波算法,解决了多维非平稳随机信号的滤波问题。我们基于Kalman滤波算法用Matlab实现仿真,通过VC将Matlab与组态软件进行互联,最终通过组态软件来实现Kalman滤波器。
  2 理论依据
  考虑用如下状态空间模型描写的动态系统
  其中t为离散时间,系统在时刻t的状态为x(t)∈Rn,y(t)∈Rm为对状态的观测信号,方差为Q的输入白噪声w(t)∈Rr,方差为R的观测白噪声v(t)∈Rm,且w(t)和v(t)不相关。?椎,,H分别为已知的适当维矩阵。由[1,2]我们易知该系统的最优状态滤波方程组为:
  3 用Matlab实现Kalman滤波器仿真
  在系统(1)和(2)中取?椎= 0.9 0-0.5 0.2,?祝=12,H=[1 1],Q=0.81, R=1。基于Kalman滤波原理(3)-(8), 通过Matlab在计算机上实现Kalman滤波器的仿真。
  具体m文件源代码如下:
  for i=1:bushu
  [x1(:,i+1)]=mult(fai,x(:,i));
  [wa]=mult(tao,w(i));
  [x(:,i+1)]=add(x1(:,i+1),wa);
  [hx]=mult(H,x(:,i+1));
  [y(i)]=add(hx,v(i));
  [xjian(:,i+1),p]=kkmm(n,fai,tao,H,Q,R,p,xjian(:,i),y(i));
  End
  其中,调用了mult(),add(),kkmm()这三个函数,这些都是预先编写好的。kkmm.m是整个程序的主要部分,即Kalman滤波算法。运行结果如图1和图2所示,其中实现表示真实状态,虚线表示估计状态。
  4 VC++与Matlab混合编程的应用
  VC++[3]具有很多的优点,但对于一些比较复杂的工程计算程序,编写起来比较困难。Matlab语言是一种高级矩阵语言,对于一些复杂的运算有直接的函数可以调用,提高了编程的效率。
  4.1 应用实例(Kalman滤波器)
  建立一个基于对话框的MFC应用程序Kalman,通过制作一个曲线控件[3],可以清楚地看到xi(t)和 i(t|t)走势。
  其中,使用了WM_TIMER响应函数。运行结果如图3所示,其中黄线表示真实状态x(t)红线表示估计状态 (t|t)。
  5 实现VC++与组态软件的数据通讯
  建立一个基于对话框的MFC程序VMP,按照本文4.2节提到的方法,将Kalman滤波器添加到当
  前工程中。其中响应函数CVMPDlg::OnTimer(UINT nIDEvent)的主要源代码如下:
  for(int i = 0;i  { CString strTagPar,strVal;
  XEstrTagPars.GetSubStr(i,strTagPar);
  pTagPars[i].vt = VT_BSTR;
  pTagPars[i].bstrVal = strTagPar.AllocSysString();
  XEstrVals.GetSubStr(i,strVal);
  pVals[i].vt = VT_BSTR;
  pVals[i].bstrVal = strVal.AllocSysString();}
  m_pDbCom->SetStringData(iTagParCount,pTagPars,pVals);
  for (i = 0; i < iTagParCount; i++)
  { SysFreeString(pTagPars[i].bstrVal);
  SysFreeString(pVals[i].bstrVal);}
  delete pTagPars; delete pVals;
  然后(t|t)可以通过上述源代码进行数据传递,将数据从Matlab通过VC++传到组态软件当中去。
  6 结论
  通过上述方法,可以将Kalman滤波器应用到现场中,广泛应用在信号处理、通信、目标跟踪和控制等领域。VC++是Matlab与组态软件结合的桥梁,从而扩大了Matlab的应用范围。因此如何在特定的情况下使用最好的实现方法非常重要,随着数据接口的进一步改善,混合编程将在工程应用中发挥其越来越重大的作用。
  参考文献
  [1]Kalman R E. A New Approach to Linear Filtering and Predictioning Problems.Trans.ASME,J.Basic Eng.,1960,82D:34-45.
  [2]邓自立,王欣,高媛.建模与估计(第二版)[M].北京:科學出版社,2016.
  [3]王东华,李樱.VisualC++6.0从入门到精通[M].北京:人民邮电出版社,2016.
  [4]江泽林,刘维.实战MATLAB文件与数据接口技术[M].北京:北京航空航天大学出版社,2014.
  [5]张琼琼,马跃,王志成.组态式人机界面编辑与仿真技术[J].计算机系统应用,2015(04),26-31.
  [6]邓云伟,杜卫星,杨光玲.基于组态软件和FP23智能仪表的温度监控系统设计[J].价值工程.2013(20),208-210.
其他文献
摘 要:电在生活中无处不在,是人们生活中的必备资源,而继电保护,相信很多人都知道,就是防止电力系统发生故障而设置的,虽然已经对电力故障做了防治,但是有很多的时候,继电保护器二次回路也会引发故障,给居民、市政、企业、电力到来非常大的损失,而继电器的主要原理就是,在电力系统发生事故的时候,以最短的时间,把发生故障的设备,从系统中切除。本文就继电保护二次回路引发的故障进行分析,希望能够更好地促进电力事业
摘 要:随着国家经济水平与科技水平的提升,各电气企业的发展得到了不小的突破与创新。一些电力企业不仅对原有的企业管理理念和模式进行了更新与完善,还逐渐提高了对降损增效的重视与研究,从而在顺应节能时代发展的同时,为电力企业未来的可持续发展奠定良好的基础。但是部分电力企业在进行降损增效工作的过程中,不能全面的掌握工作原则和要点,需要企业相关负责团队能够注重对这方面内容的关注。本篇文章就电力企业降损增效的
摘 要:随着经济社会的不断进步与发展,让新型技术的不断被开发与应用,很多行业也开始积极应用这些技术优势进行结构转型。电气自自动化技术的出现让电力企业的发展速度得到提升,随着技术普及范围的不断扩展,电气自动化技术在发电厂的电荷系统中扮演着重要角色,对发端系统的继电保护与通讯工作都有相应的综合性价值。本文从发电厂的电气综合系统的自动化工作进行了简要概述,希望可以给发电厂的自动化技术改造带来参考价值。