岳元龍 賈創(chuàng) 羅雄麟 徐寶昌 許亞嵐
摘要:實踐教學(xué)環(huán)節(jié)是自動化專業(yè)本科生課程體系的重要組成部分,也是強化學(xué)生掌握專業(yè)理論、培養(yǎng)實踐創(chuàng)新能力的有效方法。目前,校內(nèi)現(xiàn)有的縮比實踐教學(xué)裝置和可操作范圍有限、甚至沒有實操環(huán)節(jié)的工廠實習(xí),使學(xué)生無法通過實踐教學(xué)環(huán)節(jié)了解實際生產(chǎn)裝置對控制系統(tǒng)和操作人員的要求。本文給出全尺度仿真實踐教學(xué)平臺的建設(shè)方法,包括基于UniSim的全尺度仿真對象搭建和基于OPC服務(wù)器的數(shù)據(jù)接口開發(fā),使學(xué)生可以通過OPC客戶端直接控制全仿真對象。
關(guān)鍵詞:自動化;實踐教學(xué)平臺;全仿真;OPC
中圖分類號:G642.0 文獻標(biāo)志碼:A 文章編號:1674-9324(2018)24-0149-04
一、引言
獨立解決被控對象的狀態(tài)參數(shù)測量、控制方案設(shè)計和控制系統(tǒng)投用是自動化專業(yè)本科生重要的培養(yǎng)目標(biāo)。所以,自動化專業(yè)課程體系中設(shè)置了與培養(yǎng)目標(biāo)相對應(yīng)的(配套的)理論教學(xué)和實踐教學(xué)。目前,教師課堂講授是理論教學(xué)的主要方式。通過系統(tǒng)的理論教學(xué),學(xué)生一般可以較好理解和掌握自動化專業(yè)的基礎(chǔ)理論。在實踐教學(xué)方面,由于不同學(xué)校依托的行業(yè)背景不同,所以實踐教學(xué)環(huán)節(jié)比較多樣化[1]。中國石油大學(xué)(北京)自動化專業(yè)的定位是“突出石油石化行業(yè)特點,強化專業(yè)技能訓(xùn)練”,本科實踐教學(xué)主要依托校內(nèi)的煉油化工領(lǐng)域典型生產(chǎn)單元的縮比仿真模型和校外的煉化企業(yè)。但是,縮比仿真模型不能完全復(fù)現(xiàn)實際的生產(chǎn)過程特性,特別是在時間尺度方面,不能進行全時間尺度的仿真與操作。受限于生產(chǎn)過程的高溫、高壓、有毒等危險因素的影響,學(xué)生在校外煉化企業(yè)開展實踐教學(xué)過程中無法進行實際操作,校外實踐效果甚微[2]。所以,目前的實踐教學(xué)條件導(dǎo)致畢業(yè)生整體呈現(xiàn)解決實際問題能力與理論基礎(chǔ)不匹配的現(xiàn)象,進而出現(xiàn)用人單位招聘不到可用技術(shù)人員和學(xué)生找不到合適工作的雙重問題[3]。為了提高自動化專業(yè)本科生的實踐教學(xué)水平,探討自動化專業(yè)全仿真實踐教學(xué)平臺建設(shè)方案。提供一個基于UniSim工業(yè)軟件開發(fā)煉油化工領(lǐng)域全尺度仿真對象及其與控制算法進行實時通訊的方法。通過該方法,學(xué)生可以編寫控制算法并通過通信接口控制全尺度仿真對象,以驗證算法的可行性。搭建仿真教學(xué)平臺的基本步驟包括:第一步,在UniSim工業(yè)軟件環(huán)境下建立全尺度動態(tài)仿真對象;第二步,采用VB軟件讀取仿真對象的物性參數(shù),特別是讀取被控變量和操作變量;第三步,開發(fā)集成了仿真對象物性參數(shù)的OPC服務(wù)器,實現(xiàn)與具有OPC客戶端功能的控制算法進行通訊。
二、全尺度動態(tài)仿真對象的開發(fā)
本文以原油常壓蒸餾工藝為例,在UniSim軟件平臺上通過設(shè)置流程的物性參數(shù)和時間尺度參數(shù),搭建全仿真實踐教學(xué)平臺的動態(tài)仿真對象[4],主要步驟包括選擇物性包、選擇基本組分、對原油劃分虛擬組分、安裝物流和操作單元、檢查最終結(jié)果等。工藝流程中的操作單元主要包括預(yù)閃蒸、加熱爐、混合器和常壓蒸餾塔等,產(chǎn)品包括汽油、柴油等。具體操作請參考UniSim軟件使用指南,本文不再贅述。
三、全仿真對象物性參數(shù)的讀取
本文以VB讀取預(yù)閃蒸操作單元的數(shù)據(jù)為例,給出全仿真對象物性參數(shù)讀取方法,為OPC服務(wù)器開發(fā)提供數(shù)據(jù)源。讀取數(shù)據(jù)的步驟為:
第一步:建立VB開發(fā)環(huán)境與常壓蒸餾工藝模型之間的連接
啟動UniSim程序,打開常壓蒸餾工藝主流程圖。然后,在VB的菜單“工具”下“引用”中,選中“UniSim Type Library”,引入UniSim的類庫,然后聲明自動化對象,語法格式為:
Public unisimApp As UniSimDesign.Application
Public unisimCases As SimulationCases
Public unisimCase As SimulationCase
其中,Application對象代表了UniSim程序本身。SimulationCases代表了一個正在運行的UniSim程序中的所有模型案例,SimulationCase代表了其中的一個,后者是前者中的一個子案例。聲明自動化對象后,使用如下方法連接UniSim模型:
Set unisimApp = GetObject(,"UniSimdesign.Application")或
Set unisimApp = CreateObject("UniSimdesign.Application","192.168.1.1")
Set unisimCases = unisimApp.SimulationCases
Set unisimCase = unisimCases.Item(0)
其中,GetObject和CreateObject語句均可成功連接到UniSim模型。UniSimdesign.Application在這里指向的就是當(dāng)前環(huán)境中正在運行的常壓蒸餾工藝主流程圖。若VB程序連接的流程圖在另外一臺計算機上,可以使用CreateObject語句,括號內(nèi)逗號后的IP地址代表了局域網(wǎng)內(nèi)運行了UniSim的計算機的地址。為了方便,將unisimCases聲明為程序中所有的案例集合,若只有一個運行的模擬案例,則該案例為集合中的第一個也是唯一一個,可用“.Item(0)”來指代和引用,若還有其他的案例則可依次類推進行聲明。
第二步:聲明預(yù)閃蒸操作單元
下面定義和聲明模型中的對象,包括模型的流程、物流集合、操作單元以及物流,語法格式為:
Public MainFlow As Flowsheet
Public SubFlow As Flowsheet
Public MainStream As Streams
Public SubStream As Streams
Set MainFlow = unisimCase.Flowsheet
Set SubFlow = MainFlow.Flowsheets(0)
Set MainStream = MainFlow.MaterialStreams
Set SubStream = SubFlow.MaterialStreams
本例中有兩個流程,MainFlow和SubFlow。MainFlow是主流程,定義為案例(SimulationCase)的Flowsheet,即流程;SubFlow為子流程,本例中為常壓塔的流程圖,可認為是主流程中的第一個子流程,用“.Flowsheets(0)”來聲明。主流程中的物流(MainStream)定義在主流程對象(MainFlow)中,子流程的物流(SubStream)定義在子流程對象(SubFlow)中,均用“.MaterialStreams”來聲明。在定義和聲明模型中對象的基礎(chǔ)上,下面定義預(yù)閃蒸操作單元。
Dim PreFlash As Object
Set PreFlash = MainFlow.Operations.Item(0)
預(yù)閃蒸(PreFlash)為主流程的Operations的第一個單元,用“.Item(0)”來聲明,類似的可以依次對第二個、第三個等單元進行對象聲明。
第三步:讀取預(yù)閃蒸操作單元的數(shù)據(jù)
基于第一步和第二步就可以讀取對象的數(shù)據(jù)了。由于每個對象所包含的屬性各不相同,有的包含有壓力、溫度數(shù)據(jù),有的則是流量、壓降數(shù)據(jù),所以在數(shù)據(jù)讀取的過程中需要進行區(qū)分,不同對象的不同參數(shù)值需要對應(yīng)定義不同的變量,但是每個數(shù)據(jù)的讀取方法卻都是相同的。讀取預(yù)閃蒸操作單元的數(shù)據(jù)方法如下:
Text1.Text = PreFlash.VesselTemperature
Text2.Text = PreFlash.VesselPressure
Text3.Text = PreFlash.LiquidPercentLevelValue
讀取數(shù)據(jù)時在對象后用“.”加上所需要的屬性名即可,如上述的溫度(VesselTemperature)、壓力(VesselPressure)等。其他的操作單元和物流均與此相同,只是對應(yīng)的屬性不一樣而已。
四、OPC服務(wù)器的開發(fā)
OPC服務(wù)器開發(fā)包括兩部分內(nèi)容,分別是開發(fā)與預(yù)閃蒸操作單元數(shù)據(jù)連接的接口和開發(fā)OPC服務(wù)器標(biāo)準(zhǔn)接口。本文利用開發(fā)工具WtOPCServer.dll開發(fā)OPC服務(wù)器[5]。WtOPCServer.dll中封裝了COM和OPC規(guī)范等細節(jié)信息,只需要開發(fā)人員熟練地調(diào)用接口函數(shù)便可以完成OPC接口的開發(fā)。下面給出開發(fā)OPC服務(wù)器的步驟。
第一步:聲明函數(shù)
聲明開發(fā)工具中用于開發(fā)OPC服務(wù)器的函數(shù),只有聲明成功后才可以在VB中使用這些函數(shù)。
(1)服務(wù)器初始化函數(shù)聲明
Declare Function InitWTOPCsvr Lib "WtOPCSvr" Alias "_InitWTOPCsvr@8" (ByRef CLSID_Svr As Byte,ByVal ServerRate As Long) As Long
實現(xiàn)DCOM的初始化并在計算機中創(chuàng)建OPC服務(wù)器對象。其中參數(shù)CLSID_Svr為OPC服務(wù)器的類標(biāo)識(CLSID),用于計算機和OPC客戶端識別和連接服務(wù)器;參數(shù)ServerRate定義服務(wù)器的數(shù)據(jù)刷新速率,單位為毫秒。若該函數(shù)調(diào)用成功返回值為TRUE,否則為FALSE。
(2)服務(wù)器注冊函數(shù)聲明
Declare Function UpdateRegistry Lib "WtOPCSvr" Alias "_UpdateRegistry@16" (ByRef CLSID_Svr As Byte,ByRef Name As Byte,ByRef Descr As Byte,ByRef ExePath As Byte) As Long
(3)服務(wù)器注銷函數(shù)聲明
Declare Function UnregisterServer Lib "WtOPCSvr" Alias "_UnregisterServer@8" (ByRef CLSID_Svr As Byte,ByRef Name As Byte) As Long。
(4)標(biāo)簽創(chuàng)建函數(shù)聲明
Declare Function CreateTag Lib "WtOPCSvr" Alias "_CreateTag@28" (ByRef Name As Byte,ByVal Value As Variant,ByVal InitialQuality As Integer,ByVal IsWritable As Long) As Long
作用是建立OPC服務(wù)器的過程標(biāo)簽,Name為字符串,表明了所建標(biāo)簽的名字,為服務(wù)器可接受的文本字符串;參數(shù)Value定義了標(biāo)簽的初始值,為Variant類型;參數(shù)InitialQuality定義標(biāo)簽的OPC品質(zhì)屬性;參數(shù)IsWritable定義標(biāo)簽是否可寫,可寫為TRUE,否則為FALSE。標(biāo)簽創(chuàng)建成功會返回一個長整型值,為創(chuàng)建標(biāo)簽的句柄值,是標(biāo)簽的唯一識別值,在對標(biāo)簽進行各種操作時起識別作用。
(4)標(biāo)簽刪除函數(shù)聲明
Declare Function RemoveTag Lib "WtOPCSvr" Alias "_RemoveTag@4" (ByVal TagHandle As Long) As Long:。作用就是在服務(wù)器結(jié)束進程時將所創(chuàng)建的過程標(biāo)簽刪除,TagHandle為創(chuàng)建標(biāo)簽時所生成的句柄。
(5)標(biāo)簽刷新函數(shù)聲明
Declare Function UpdateTag Lib "WtOPCSvr" Alias "_UpdateTag@24" (ByVal TagHandle As Long,ByVal Value As Variant,ByVal Quality As Integer) As Long
其作用是刷新過程標(biāo)簽的數(shù)據(jù)值。參數(shù)TagHandle是句柄,由標(biāo)簽創(chuàng)建函數(shù)在創(chuàng)建標(biāo)簽時得到;參數(shù)Value為標(biāo)簽要更新的值;參數(shù)Quality為標(biāo)簽屬性條件。若函數(shù)調(diào)用成功返回值在為TRUE,否則返回FALSE。
(6)調(diào)用寫函數(shù)的函數(shù)聲明
Declare Function EnableWriteNotification Lib "WtOPCSvr" Alias "_EnableWriteNotification@8" (ByVal Callback As Long,ByVal ConvertToNative As Long) As Long
當(dāng)用戶對服務(wù)器中標(biāo)簽的數(shù)據(jù)進行寫操作時會觸發(fā)該函數(shù),從而調(diào)用相應(yīng)的寫函數(shù)完成該操作。
第二步:注冊服務(wù)器
利用第一步聲明的UpdateRegistry在計算機中注冊O(shè)PC服務(wù)器,以便OPC客戶端與其進行連接。
UpdateRegistry GUID(0),SerName(0),Desc(0),ExePath(0)
注意,UpdateRegistry函數(shù)的輸入值的類型為Byte,故在使用前要把各數(shù)據(jù)轉(zhuǎn)換為Byte類型。
GUID為全局唯一標(biāo)示符,在Windows系統(tǒng)中稱為Class ID,即CLSID,是系統(tǒng)對不同應(yīng)用程序分配的唯一的表示該程序的ID代碼,通常為一個128位的隨機數(shù),在創(chuàng)建OPC服務(wù)器時需要人為定義一個CLSID,可以是任意的。在注冊成功后系統(tǒng)會將相關(guān)信息注冊至注冊表中。SerNam為創(chuàng)建的服務(wù)器的名字,Desc為服務(wù)器描述,ExePath為服務(wù)器的路徑。
第三步:初始化服務(wù)器
創(chuàng)建了服務(wù)器后還需要進行初始化才可以進行數(shù)據(jù)通信,初始化的主要作用是完成有關(guān)COM/DCOM的初始化,并且創(chuàng)建OPC服務(wù)器接口對象,使OPC客戶可順利連接到服務(wù)器。
InitWTOPCsvr GUID(0),1000
初始化通過GUID來識別服務(wù)器,這里設(shè)置其數(shù)據(jù)刷新速率為1000毫秒,也可根據(jù)具體的需要進行設(shè)置。
第四步:創(chuàng)建標(biāo)簽
創(chuàng)建標(biāo)簽用到上文聲明的標(biāo)簽創(chuàng)建函數(shù),語法格式為:
TagHandle(0) = CreateTag(TagName(0),Value,192,True)
TagHandle為當(dāng)前創(chuàng)建的標(biāo)簽的句柄,具有唯一性。TagName為標(biāo)簽的名字,由用戶自行定義,需要注意的是這里TagName的數(shù)據(jù)類型為Byte。若標(biāo)簽名定義為“##.%%”則函數(shù)會自動創(chuàng)建一個組,組名為“##”,組內(nèi)包含了一個標(biāo)簽,標(biāo)簽名為“%%”,若再創(chuàng)建一個標(biāo)簽為“##.$$”,則該標(biāo)簽就會和前一個分在同一組下,標(biāo)簽名為“$$”,這一性質(zhì)為創(chuàng)建具有相關(guān)性的一組標(biāo)簽提供了可行性,在UniSim模型中有許多標(biāo)簽的數(shù)據(jù)來自同一個對象,利用該方法可以很好地將不同對象的標(biāo)簽區(qū)別開,分組定義。Value為標(biāo)簽的數(shù)據(jù)值,192表示當(dāng)前標(biāo)簽屬性為GOOD,True表示標(biāo)簽可寫。
通過該語句就可以在服務(wù)器中創(chuàng)建標(biāo)簽,對于一個UniSim模型,有大量的數(shù)據(jù)需要定義,本文在標(biāo)簽的創(chuàng)建中用了以下方法,仍然以主流程的預(yù)閃蒸為例,創(chuàng)建其第一個屬性標(biāo)簽。
Dim x As String
Dim y As Variant
Dim UniObj As Object
Set UniObj = MainFlow.Operations.Item(0)
x = "Main Flow." & UniObj & "." & "Vessel Temperature"
y = UniObj.VesselTemperature
TagHandle(0) = CreateTag(TagName(0),y,192,True)
程序定義了一個臨時對象UniObj,用來引用UniSim中的不同設(shè)備單元。x為字符串變量,通過上面的定義方法可以省去對每個對象一一定義的麻煩。
第五步:刷新標(biāo)簽
標(biāo)簽創(chuàng)建完成后需要對各個標(biāo)簽進行刷新,保持數(shù)據(jù)值的實時更新,通常在定時器中調(diào)用標(biāo)簽刷新函數(shù)來完成。
UpdateTag TagHandle(0),Value,192
TagHandle為標(biāo)簽句柄,作用是為了識別標(biāo)簽;Value為標(biāo)簽數(shù)據(jù)值的刷新值;192依然是表明當(dāng)前標(biāo)簽的屬性為GOOD。與創(chuàng)建標(biāo)簽時相同,刷新UniSim中的標(biāo)簽數(shù)量巨大,本文使用了如下的方式,通過定義一個臨時對象變量來完成賦值。
Set UniObj = MainFlow.Operations.Item(0)
y = UniObj.VesselTemperature
UpdateTag TagHandle(0),y,192
第六步:注銷服務(wù)器
利用服務(wù)器進行通信完成后,需要關(guān)閉和注銷服務(wù)器。首先要刪除服務(wù)器創(chuàng)建的所有標(biāo)簽,使用RemoveTag函數(shù),其中的TagHandle為標(biāo)簽句柄,對于有多個標(biāo)簽的服務(wù)器來說可以使用循環(huán)語句刪除標(biāo)簽。注銷使用UnregisterServer函數(shù),GUID和SerName分別為服務(wù)器標(biāo)示和名字。語法格式為:
RemoveTag TagHandle(0)
UnregisterServer GUID(0),SerName(0)
第七步:OPC服務(wù)器界面設(shè)計
服務(wù)器包括六個按鈕,在每個按鈕中通過調(diào)用函數(shù)實現(xiàn)相應(yīng)的功能,包括注冊服務(wù)器、初始化服務(wù)器、連接UniSim、創(chuàng)建標(biāo)簽、刷新標(biāo)簽、注銷服務(wù)器。
五、實驗結(jié)果
本文設(shè)計的OPC服務(wù)器將UniSim模型的仿真數(shù)據(jù)制作為符合OPC通信標(biāo)準(zhǔn)的標(biāo)簽,可由客戶端讀取。為了測試服務(wù)器運行情況,使用Matrikon OPC Explorer讀取服務(wù)器創(chuàng)建的數(shù)據(jù)標(biāo)簽,讀取OPC服務(wù)器數(shù)據(jù)的結(jié)果。
六、結(jié)論
針對自動化專業(yè)本科生實踐教學(xué)環(huán)節(jié)中現(xiàn)場實習(xí)缺少實操訓(xùn)練和實驗室實驗對象與工程設(shè)備不匹配的問題,探討了全尺度仿真實踐教學(xué)平臺的建設(shè)方法?;谠摲椒ǎ瑢W(xué)生可以根據(jù)實踐環(huán)節(jié)的具體需求,依托UniSim軟件搭建與工業(yè)實際生產(chǎn)裝置具有相同參數(shù)的仿真模型,用于產(chǎn)生全時間尺度的工藝數(shù)據(jù)。利用開發(fā)工具WtOPCServer.dll編寫OPC服務(wù)器程序,將仿真模型生成的工藝數(shù)據(jù)封裝為符合OPC通信標(biāo)準(zhǔn)的標(biāo)簽數(shù)據(jù)。學(xué)生設(shè)計的帶有OPC客戶端的監(jiān)控系統(tǒng)通過與OPC服務(wù)器通信,實現(xiàn)對生產(chǎn)裝置仿真模型的控制。本文給出實踐教學(xué)平臺建設(shè)方法極大地豐富了實踐教學(xué)內(nèi)容,提高了學(xué)生操作實際生產(chǎn)裝置的能力。
參考文獻:
[1]李清泉.強化高校科技優(yōu)勢轉(zhuǎn)化 提升高素質(zhì)人才培養(yǎng)質(zhì)量[J].中國高教研究,2011,(12):16-18.
[2]聶建英,羅雄麟,左信.自動化專業(yè)實踐教學(xué)基地建設(shè)研究[J].中國電力教育,2012,(15):80-82.
[3]張宏偉,張英琦,王新環(huán).自動化專業(yè)校內(nèi)外實踐基地建設(shè)與實踐教學(xué)改革[J].實驗室研究與探索,2013,32(11):448-451.
[4]朱玉杰.UniSim單元模型二次開發(fā)及外部通信研究[N].北京:中國石油大學(xué)(北京),2008.
[5]WinTECH Software Design.WTOPCSvr[Z].DLL User's Guide.