任麗麗 唐 娟 夏伯鍇
(1.中石油蘭州石化公司自動化研究院,蘭州 730060;2.中國石油大學(xué)(華東),山東 青島 266580)
對于石油化工行業(yè),“安穩(wěn)長滿優(yōu)”是生產(chǎn)裝置運行的目標(biāo)[1,2]。采用先進控制與優(yōu)化技術(shù)提高裝置的自控水平,對于充分發(fā)揮生產(chǎn)裝置的運行潛力,有效實現(xiàn)平穩(wěn)運行、增產(chǎn)與降耗具有十分重要的意義[3,4]。目前國內(nèi)裝置較多引進國外的先進控制與優(yōu)化軟件,由于這類軟件開發(fā)成本高,應(yīng)用時還需專家到現(xiàn)場測試數(shù)據(jù),并對軟件進行安裝、調(diào)試與培訓(xùn),費用昂貴,同時由于知識產(chǎn)權(quán)問題,重復(fù)購買時價格基本相同。所以,開發(fā)具有自主版權(quán)的先進控制與優(yōu)化軟件勢在必行。
筆者采用VC++和Visual Basic平臺開發(fā)先進控制系統(tǒng)軟件包,設(shè)計了軟件包的體系結(jié)構(gòu),并對狀態(tài)反饋預(yù)測控制算法進行簡要推導(dǎo),著重探討基于VC++的動態(tài)鏈接庫技術(shù)在先進控制系統(tǒng)軟件包中的設(shè)計與應(yīng)用。
按照需求分析、功能要求和設(shè)計原則,優(yōu)化控制軟件包體系(OCS)設(shè)計為C/S(客戶/服務(wù)器)結(jié)構(gòu),如圖1所示,服務(wù)器端(上位機)響應(yīng)并提供固定的服務(wù),客戶端(下位機)向服務(wù)器端請求某種服務(wù)。
本設(shè)計采用基于VB中應(yīng)用程序間數(shù)據(jù)傳送的動態(tài)數(shù)據(jù)交換(DDE)技術(shù)實現(xiàn)數(shù)據(jù)共享[5]。所有共享變量均置于運行平臺處,各模塊所需的變量可從運行平臺中得到。通過DDE技術(shù),應(yīng)用程序之間相互傳送數(shù)據(jù)。上位機和下位機的TCP/IP通信采用Winsock控件。
圖1 軟件包體系結(jié)構(gòu)
客戶端(下位機)常采用DCS、工控機、組態(tài)王及PLC等。在設(shè)計中,下位機的控制對象采用組態(tài)王應(yīng)用軟件。服務(wù)器端(上位機)包含有運行平臺、先進控制算法模塊和模擬仿真模塊。
采用組態(tài)王模擬下位機DCS,通過上-下位機聯(lián)調(diào)對熱水罐的液位、溫度的二入二出耦合模型進行仿真[6]。先進控制算法模塊從運行平臺得到過程對象模型的狀態(tài)變量和輸出變量,輸入、輸出和狀態(tài)個數(shù),以及控制的預(yù)測步數(shù)。調(diào)用動態(tài)鏈接庫函數(shù)計算出控制量,通過DDE技術(shù)寫入運行平臺。采用C語言基于VC++ 6.0(VC)環(huán)境編寫先進控制算法,通過編譯生成動態(tài)鏈接庫(DLL)。在VB中通過聲明調(diào)用.dll中的導(dǎo)出函數(shù),即可計算出控制量。
運行平臺通過TCP/IP協(xié)議再把控制量發(fā)送至下位機的組態(tài)王,通過過程對象模型的仿真計算模塊,計算出狀態(tài)變量和輸出變量,再通過TCP/IP協(xié)議將其送入運行平臺。反復(fù)進行以上步驟,通過上下位機的聯(lián)調(diào)即可實現(xiàn)過程對象的先進控制。
研究中采用多變量狀態(tài)反饋預(yù)測控制策略,以使系統(tǒng)突破內(nèi)模控制(IMC)的框架,可用于不穩(wěn)定的被控對象。具有較強的抗干擾能力,魯棒性好,穩(wěn)態(tài)無偏差且在線計算量小。多變量狀態(tài)反饋預(yù)測控制數(shù)學(xué)模型基于狀態(tài)空間,過程對象數(shù)學(xué)模型可描述為:
x(k+1)=Ax(k)+Bu(k)
y(k)=Cx(k)
(1)
由式(1)可得狀態(tài)變量x和輸出y在未來p時刻的預(yù)測值,即:
(2)
(3)
未來p時刻的輸出預(yù)測修正值和當(dāng)前輸出預(yù)測值分別為:
(4)
(5)
多變量預(yù)測控制系統(tǒng)與單變量(SISO)預(yù)測控制系統(tǒng)[7]的不同之處在于,多變量預(yù)測控制系統(tǒng)的每一個輸出yj(k)都可以有一個相應(yīng)的預(yù)測時域pj,或者說多變量預(yù)測控制系統(tǒng)的預(yù)測時域P是一個向量,即P=[p1,p2,…,pr]T,其中r為過程對象輸出的維數(shù)。
由式(3)可知,對于第j個輸出,在未來pj采樣時刻的預(yù)測值[8,9]為:
(6)
(7)
j=1,2,…,r
采用單值預(yù)測控制策略思路,可得:
u(k+i)=u(k),i>0
通過使反饋修正后的輸出預(yù)測值等于輸出給定值,得到最優(yōu)控制律。
聯(lián)立式(4)、(5)、(7)可得:
ysj(k+pj)=cjApjx(k)-cjApjx(k-pj)+
(9)
整理式(9)可得增量形式的最優(yōu)控制律為:
Δu(k)=S-1(P)[Ys(k)-y(k)-Δx-Δu]
Δu(k)=u(k)-u(k-1)
Δx=CAP[x(k)-x(k-P)]
軟件開發(fā)過程中,VB與VC的鏈接采用的是動態(tài)鏈接庫DLL技術(shù)。動態(tài)鏈接庫是二進制文件[10~12]。在軟件包開發(fā)應(yīng)用中調(diào)用.dll時,將所需的.dll文件置于Windows的系統(tǒng)目錄windowssystem之下。
在VC++中創(chuàng)建apc.dll的步驟如下:
a. 創(chuàng)建apc.dll工程。在VC++菜單中選擇FileNewProject,再選擇Win32 Dynamic-Link Library,在Project Name中輸入工程名apc,并保存apc.dll工程文件。
b. 創(chuàng)建apc.def文件。LIBRARY apc,定義導(dǎo)出函數(shù)algorithm()為例,EXPORTS;algorithm @1。
c. 創(chuàng)建apc.h頭文件。在菜單中選擇FileNewC++ Head File項,輸入代碼后保存文件名apc.h。
d. 填寫apc.cpp文件。輸入代碼后保存文件名apc.cpp。
e. 編譯apc.dll文件。
在apc.dll中,函數(shù)和過程對于VB應(yīng)用程序來說是外部過程,為了調(diào)用這些函數(shù)和過程,必須在VB中進行聲明。在一個VB(工程)中,要調(diào)用的dll過程只需聲明一次,以后即可在程序的任何地方調(diào)用[5,12,13]。dll過程的聲明有兩種格式:
a. Declare Sub過程名Lib”庫名”[Alias“別名”]([參數(shù)表列]);
b. Declare Function過程名Lib”庫名”[Alias“別名”]([參數(shù)表列])As類型。
在本設(shè)計中,采用第一種聲明方式,即declare sub algorithm lib“apc.dll”(byval as long,byval as long,byref as double,byref as double,byref as double,byref as long,byref as double),其中algorithm為VB應(yīng)用程序中使用的過程名;apc.dll為動態(tài)鏈接庫庫名;Byval為傳值方式;ByRef為傳址方式。由于u,x,y,p,ys為數(shù)組,所以必須將相應(yīng)參數(shù)聲明設(shè)為傳址方式,即把數(shù)組的第一個元素作為參數(shù)傳入,這樣在dll中就得到了數(shù)組的首地址,從而可對整個數(shù)組進行訪問。
開發(fā)中,需要對C語言與VB語言的數(shù)據(jù)類型進行轉(zhuǎn)換,見表1。由于dll過程中的參數(shù)是用C語言數(shù)據(jù)類型定義的,當(dāng)在VB中聲明一個過程時,必須指定與其匹配的VB數(shù)據(jù)類型。
表1 C語言與VB語言數(shù)據(jù)類型轉(zhuǎn)換
在VB中進行調(diào)用時,使用call語句。如調(diào)用動態(tài)鏈接庫中的預(yù)測控制algorithm函數(shù),則為call algorithm(m,n,u(0),x(0),y(0),p(0),ys(0))。
對熱水罐的液位和溫度二入二出耦合模型進行仿真測試,被控變量的控制效果如圖2、3所示,對于穩(wěn)定的被控過程,預(yù)測步數(shù)減小,預(yù)測控制作用增強,動態(tài)調(diào)節(jié)過程加快;反之,預(yù)測步數(shù)增大,則預(yù)測控制作用減弱,動態(tài)調(diào)節(jié)過程減慢,控制系統(tǒng)的魯棒性增強。
圖2 預(yù)測時域p1=2、p2=1的控制效果
圖3 預(yù)測時域p1=6、p2=5的控制效果
測試運行結(jié)果表明,以DDE和TCP/IP通信為基礎(chǔ),軟件包各模塊協(xié)調(diào)運行正常,上位機的預(yù)測算法對下位機組態(tài)王中的水罐模型實現(xiàn)了完美控制。基于狀態(tài)變量反饋的預(yù)測控制算法對耦合模型也消除了穩(wěn)態(tài)誤差。這就驗證了軟件包整體功能設(shè)計的正確性。