基于ActiveX协议的组态软件RSView32与matlab的通信 |
摘 要:在工业控制领域,组态软件用于现场监控时计算能力不强,难以实现复杂的控制策略,而数学软件Matlab可完成复杂的运算。在组态软件与matlab二者间建立通信可实现优势互补。该文基于ActiveX技术,详细介绍了组态软件RSView32与matlab间进行通信的步骤。该文的研究工作为在工业控制领域中使用组态软件来完成复杂的控制算法开辟了新的途径,为测控系统与仿真系统的集成提供了新的技术支持。 关键词:工业控制 组态软件RSView32 数学软件matlab 通信 1、前言 在工业控制领域,如何更有效地实现控制算法一直是人们普遍关心的问题。目前,工控组态软件具有丰富的图形功能,强大的与硬件通信的能力,但是它的计算能力不强,难以实现复杂的控制策略。MATLAB语言具有强大的科学运算能力,借助其自带的工具箱可实现各种复杂算法的运算[1]。同时,在工业测控系统开发过程中,实现测控系统与仿真系统的集成是当前的一个发展方向[2]。因此,在工业控制中将工控组态软件与MATLAB相结合,实现优势互补一直是自动控制领域研究的热点。 RSView32是Rockwell公司开发的一种组态软件包,它是第一个在图形显示中利用ActiveX、VisualBasic Applications、OPC(面向过程控制的OLE)的MMI产品,提供了监视、控制和数据采集功能。在RSView32与matlab间建立通信的方式目前有DDE动态数据交换技术和ActiveX技术二种方式。ActiveX技术是在DDE的基础上发展起来的,但它们之间还是有区别的,ActiveX在调用时不需要服务者事先已经运行,它实际上是在调用一种部件,而无须要求该部件对应的程序正在运行,这会使得其功能更加强大,语句结构更简单,它的唯一要求就是MATLAB在程序运行的机器上已经安装并可以成功运行[3]。采用DDE方式进行通信已在一些论文中多次提到,但采用ActiveX技术在RSView32与matlab间通信鲜见有详细的描述,本文详细地介绍了二者间进行ActiveX技术通信的步骤[4]。 2、实现通信的过程 首先在RSView32的主界面中输入所需的参数,通过通信将数据传送给Matlab进行控制运算,然后将结果传送回RSView32,并通过其主界面演示出相应的结果。其通信流程见下图1。 3、使用ActiveX控件建立通信的步骤: 3.1 ActiveX对象的创建 在VBA中定义MATLAB对象前,必须在Windows 图1 RSView32与MATLAB通信步骤框图 下安装RSView32和MATLAB6.1软件,并在RSView32的VBA中引用MATLAB程序。MATALB的ActiveX对象名固定为”Matlab.application”,其具体程序如下: ‘将MATLAB实例对象定义为公共变量 Public objMATLAB As Object Private Sub form_initialize() ‘创建matlab的实例 Set objMATLAB = CreateObject("matlab.application") End Sub 3.2在RSView32的人机界面中向tag中读入一变量值 为了能接收输入值,在界面上设置Solid Animation ,并让其对应一个标签tag,在VBA中让该标签名与一变量相关联: Set tAvalve7 = gTagDb("inoil\Avalve7") 这里Avalve7是与Solid Animation相对应的一个标签名,tAvalve7是在VBA中定义的一个变量,在人机界面中通过Solid Animation滑动动画拖动滚动条即可输入数据,该数据并储存在VBA中的tAvalve7.value中。 3.3在VBA中用PutFullMarix命令将该数写入MATLAB中 用PutFullMarix命令向MATLAB中写入数据格式为: Call matlab.putfullMatrix(“a”, “base”, Mreal,Mimag) 其中 a 为Matlab中的矩阵变量名,base 为变量类型,Mreal 为VBA程序中的实部矩阵,Mimag为VBA中的虚部矩阵。 为了测试PutFullMarix命令,在RSView32的VBA中设计一窗体,其中有一CommandButton3,对CommandButton3_Click()事件编程序如下,运行时在窗体中点击CommandButton3,则会通过命令PutFullMatrix()实现数据从VBA传送到MATLAB中,并通过getfullmatrix()命令又传送回VBA中。最后在Text1中显示结果”90”。 Private Sub CommandButton3_Click() Dim matlab As Object Dim result As String Set matlab = CreateObject("matlab.application") Dim sita(1 To 6) As Double sita(1) = 0: sita(2) = 90: sita(3) = 0 sita(4) = -90: sita(5) = 0: sita(6) = 0 Dim Mreal(1 To 6, 1 To 1) As Double Dim Mimag() As Double Dim sitam() As Double Dim I As Integer Dim mreal2(1 To 6, 1 To 1) As Double Dim mimag2() As Double For I = 1 To 6 Mreal(I, 1) = sita(I) Next I Call matlab.PutFullMatrix("sitam", "base", Mreal, Mimag) Call matlab.getfullmatrix("sitam", "base", mreal2, mimag2) Text1 = mreal2(2, 1) End Sub 3.4在VBA中用Execute命令执行一条MATLAB命令例如,下面的程序将完成打开Matlab的Command Windows 窗口以及在Figure No.1窗口中显示一个三 维着色表面图形。 ‘将MATLAB实例对象定义为公共变量 Public objMATLAB As Object Private Sub form_initialize() ‘创建matlab的实例 Set objMATLAB = CreateObject("matlab.application") result = objMATLAB.execute("surf(peaks)") End Sub 在RSView32中的界面上可设置命令按钮,如”测试”,在该按钮的右键菜单中打开”Edit Button1”,在如下图2所示界面中,用Vbaexec begin来调用在VBA程序中的begin函数,该函数的程序为 : Private Sub CommandButton1_Click() Dim matlab As Object Dim result As String Set matlab = CreateObject("matlab.application") result = matlab.Execute("surf(peaks)") End Sub Public Sub begin() UserForm6.Show End Sub 图2 RSView32中的按钮设置界面 这样,在RSView32的界面中,就可用”测试”按钮来调用Matlab中的Command Windows 窗口以及在Figure No.1窗口中显示一个三维着色表面图形。 3.5在VBA中用GetFullMarix命令读取结果 执行本命令将matlab中的一个矩阵变量传送到VBA程序的1维或2维数组中,其格式为: Call matlab.getfullmatrix(“a”,”base”, MReal,Mimag) 例如下面的程序将完成从Matlab中的b数组中传送数据到VB中的Mreal1数组中。 MATLAB.execute "b=[1,2;4,7]" Dim mreal1(1 To 2, 1 To 2) As Double Dim mimag1() As Double Call MATLAB.getfullmatrix("b", "base", mreal1, mimag1) Text1 = mreal1(2, 2) 4、结论 本文采用上述步骤成功地在RSView32与matlab二者间建立了通信,从而利用各自的优势,将复杂的运算由matlab完成,由RSView32实现良好的人机界面和丰富的图形显示。本文的工作为在工业控制领域中使用组态软件来完成复杂的控制算法开辟了新的途径,为测试系统与仿真系统的集成提供了新的技术支持。 |