摘 要:在工業(yè)控制領(lǐng)域,組態(tài)軟件用于現(xiàn)場(chǎng)監(jiān)控時(shí)計(jì)算能力不強(qiáng),難以實(shí)現(xiàn)復(fù)雜的控制策略,而數(shù)學(xué)軟件Matlab可完成復(fù)雜的運(yùn)算。在組態(tài)軟件與matlab二者間建立通信可實(shí)現(xiàn)優(yōu)勢(shì)互補(bǔ)。該文基于ActiveX技術(shù),詳細(xì)介紹了組態(tài)軟件RSView32與matlab間進(jìn)行通信的步驟。該文的研究工作為在工業(yè)控制領(lǐng)域中使用組態(tài)軟件來(lái)完成復(fù)雜的控制算法開(kāi)辟了新的途徑,為測(cè)控系統(tǒng)與仿真系統(tǒng)的集成提供了新的技術(shù)支持。
關(guān)鍵詞:工業(yè)控制 組態(tài)軟件RSView32 數(shù)學(xué)軟件matlab 通信
1、前言
在工業(yè)控制領(lǐng)域,如何更有效地實(shí)現(xiàn)控制算法一直是人們普遍關(guān)心的問(wèn)題。目前,工控組態(tài)軟件具有豐富的圖形功能,強(qiáng)大的與硬件通信的能力,但是它的計(jì)算能力不強(qiáng),難以實(shí)現(xiàn)復(fù)雜的控制策略。MATLAB語(yǔ)言具有強(qiáng)大的科學(xué)運(yùn)算能力,借助其自帶的工具箱可實(shí)現(xiàn)各種復(fù)雜算法的運(yùn)算[1]。同時(shí),在工業(yè)測(cè)控系統(tǒng)開(kāi)發(fā)過(guò)程中,實(shí)現(xiàn)測(cè)控系統(tǒng)與仿真系統(tǒng)的集成是當(dāng)前的一個(gè)發(fā)展方向[2]。因此,在工業(yè)控制中將工控組態(tài)軟件與MATLAB相結(jié)合,實(shí)現(xiàn)優(yōu)勢(shì)互補(bǔ)一直是自動(dòng)控制領(lǐng)域研究的熱點(diǎn)。
RSView32是Rockwell公司開(kāi)發(fā)的一種組態(tài)軟件包,它是第一個(gè)在圖形顯示中利用ActiveX、VisualBasic Applications、OPC(面向過(guò)程控制的OLE)的MMI產(chǎn)品,提供了監(jiān)視、控制和數(shù)據(jù)采集功能。在RSView32與matlab間建立通信的方式目前有DDE動(dòng)態(tài)數(shù)據(jù)交換技術(shù)和ActiveX技術(shù)二種方式。ActiveX技術(shù)是在DDE的基礎(chǔ)上發(fā)展起來(lái)的,但它們之間還是有區(qū)別的,ActiveX在調(diào)用時(shí)不需要服務(wù)者事先已經(jīng)運(yùn)行,它實(shí)際上是在調(diào)用一種部件,而無(wú)須要求該部件對(duì)應(yīng)的程序正在運(yùn)行,這會(huì)使得其功能更加強(qiáng)大,語(yǔ)句結(jié)構(gòu)更簡(jiǎn)單,它的唯一要求就是MATLAB在程序運(yùn)行的機(jī)器上已經(jīng)安裝并可以成功運(yùn)行[3]。采用DDE方式進(jìn)行通信已在一些論文中多次提到,但采用ActiveX技術(shù)在RSView32與matlab間通信鮮見(jiàn)有詳細(xì)的描述,本文詳細(xì)地介紹了二者間進(jìn)行ActiveX技術(shù)通信的步驟[4]。
2、實(shí)現(xiàn)通信的過(guò)程
首先在RSView32的主界面中輸入所需的參數(shù),通過(guò)通信將數(shù)據(jù)傳送給Matlab進(jìn)行控制運(yùn)算,然后將結(jié)果傳送回RSView32,并通過(guò)其主界面演示出相應(yīng)的結(jié)果。其通信流程見(jiàn)下圖1。
3、使用ActiveX控件建立通信的步驟:
3.1 ActiveX對(duì)象的創(chuàng)建
在VBA中定義MATLAB對(duì)象前,必須在Windows
[align=center]

圖1 RSView32與MATLAB通信步驟框圖[/align]
下安裝RSView32和MATLAB6.1軟件,并在RSView32的VBA中引用MATLAB程序。MATALB的ActiveX對(duì)象名固定為”Matlab.application”,其具體程序如下:
‘將MATLAB實(shí)例對(duì)象定義為公共變量
Public objMATLAB As Object
Private Sub form_initialize()
‘創(chuàng)建matlab的實(shí)例
Set objMATLAB =
CreateObject("matlab.application")
End Sub
3.2在RSView32的人機(jī)界面中向tag中讀入一變量值
為了能接收輸入值,在界面上設(shè)置Solid Animation ,并讓其對(duì)應(yīng)一個(gè)標(biāo)簽tag,在VBA中讓該標(biāo)簽名與一變量相關(guān)聯(lián):
Set tAvalve7 = gTagDb("inoil\Avalve7")
這里Avalve7是與Solid Animation相對(duì)應(yīng)的一個(gè)標(biāo)簽名,tAvalve7是在VBA中定義的一個(gè)變量,在人機(jī)界面中通過(guò)Solid Animation滑動(dòng)動(dòng)畫拖動(dòng)滾動(dòng)條即可輸入數(shù)據(jù),該數(shù)據(jù)并儲(chǔ)存在VBA中的tAvalve7.value中。
3.3在VBA中用PutFullMarix命令將該數(shù)寫入MATLAB中
用PutFullMarix命令向MATLAB中寫入數(shù)據(jù)格式為:
Call matlab.putfullMatrix(“a”, “base”,
Mreal,Mimag)
其中 a 為Matlab中的矩陣變量名,base 為變量類型,Mreal 為VBA程序中的實(shí)部矩陣,Mimag為VBA中的虛部矩陣。
為了測(cè)試PutFullMarix命令,在RSView32的VBA中設(shè)計(jì)一窗體,其中有一CommandButton3,對(duì)CommandButton3_Click()事件編程序如下,運(yùn)行時(shí)在窗體中點(diǎn)擊CommandButton3,則會(huì)通過(guò)命令PutFullMatrix()實(shí)現(xiàn)數(shù)據(jù)從VBA傳送到MATLAB中,并通過(guò)getfullmatrix()命令又傳送回VBA中。最后在Text1中顯示結(jié)果”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命令執(zhí)行一條MATLAB命令例如,下面的程序?qū)⑼瓿纱蜷_(kāi)Matlab的Command
Windows 窗口以及在Figure No.1窗口中顯示一個(gè)三
維著色表面圖形。
‘將MATLAB實(shí)例對(duì)象定義為公共變量
Public objMATLAB As Object
Private Sub form_initialize()
‘創(chuàng)建matlab的實(shí)例
Set objMATLAB =
CreateObject("matlab.application")
result = objMATLAB.execute("surf(peaks)")
End Sub
在RSView32中的界面上可設(shè)置命令按鈕,如”測(cè)試”,在該按鈕的右鍵菜單中打開(kāi)”Edit Button1”,在如下圖2所示界面中,用Vbaexec begin來(lái)調(diào)用在VBA程序中的begin函數(shù),該函數(shù)的程序?yàn)?:
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
[align=center]

圖2 RSView32中的按鈕設(shè)置界面[/align]
這樣,在RSView32的界面中,就可用”測(cè)試”按鈕來(lái)調(diào)用Matlab中的Command Windows 窗口以及在Figure No.1窗口中顯示一個(gè)三維著色表面圖形。
3.5在VBA中用GetFullMarix命令讀取結(jié)果
執(zhí)行本命令將matlab中的一個(gè)矩陣變量傳送到VBA程序的1維或2維數(shù)組中,其格式為:
Call matlab.getfullmatrix(“a”,”base”,
MReal,Mimag)
例如下面的程序?qū)⑼瓿蓮腗atlab中的b數(shù)組中傳送數(shù)據(jù)到VB中的Mreal1數(shù)組中。
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、結(jié)論
本文采用上述步驟成功地在RSView32與matlab二者間建立了通信,從而利用各自的優(yōu)勢(shì),將復(fù)雜的運(yùn)算由matlab完成,由RSView32實(shí)現(xiàn)良好的人機(jī)界面和豐富的圖形顯示。本文的工作為在工業(yè)控制領(lǐng)域中使用組態(tài)軟件來(lái)完成復(fù)雜的控制算法開(kāi)辟了新的途徑,為測(cè)試系統(tǒng)與仿真系統(tǒng)的集成提供了新的技術(shù)支持。
參考文獻(xiàn)
[1]石瑩,洪銳,錢曉龍.MATLAB與組態(tài)軟件的數(shù)據(jù)交換技術(shù).儀器儀表學(xué)報(bào).2003,24(4):337-340
[2]吳躍斌,謝樹(shù)俊,徐立等.液壓仿真技術(shù)的現(xiàn)在和未來(lái).液壓與氣動(dòng),2002(11):1-3
[3]王穎,胡宗軍,鄒介棠等.ActiveX:從Visual Basic6.0調(diào)用MATLAB的實(shí)現(xiàn)方法.機(jī)電工程.1999(5)
[4] 徐江華,孫榮,邵惠鶴.博士論文:基于組態(tài)王、Excel和Matlab的PID自整定仿真軟件.計(jì)算機(jī)工程.2003,29(3):27-29