鮑 坤 孫學華
(南京工業大學電子與信息工程學院,江蘇 南京 211816)
目前,工業控制中的各種儀器、儀表、地磅系統和裝車系統等都提供了計算機通信協議。但是,由于不同的廠商提供的協議不同,所以與這些設備和系統交換數據、編寫接口程序比較復雜。OPC技術能夠很好地解決這個難題[1]。
某企業環氧乙烷衍生精細化工生產采用霍尼韋爾的Experion PKS系統進行控制,其生產產品需要通過儲罐車進行運輸。涉及到運輸則需要使用另一個獨立的系統——裝車臺系統。裝車臺系統主要用來計量并記錄一些裝車信息,例如裝車時間、物料名稱、提料單位、預發量、實發量和累積量等信息,這些信息在發車時都會被打印出來。
為了確保安全,裝車臺需要遠離控制室,因此在裝車過程中,主控制室是監控不到裝車臺系統信息的。但是由于生產監控的需要,在監控室內也需要對裝車臺系統的一些信息進行監控,所以就需要建立生產系統與裝車臺系統之間的數據傳輸通道。
實現生產系統與裝車臺系統之間的數據交互,首先需要分析了解裝車臺系統。通過與第三方廠家的溝通,了解到裝車臺系統的數據信息存儲在SQL數據庫中。因此,可以通過以太網遠程連接數據庫并對數據庫進行讀寫操作。如果在PKS生產系統中直接編程以遠程讀寫數據庫,會給生產系統帶來很大的負擔,這是因為PKS生產系統只支持VB、C等簡單的語言,所以不太方便在PKS生產系統中直接編程并遠程讀寫數據庫。
由于PKS控制系統支持先進的第三方接口OPC,通過OPC接口可以對生產系統中的數據進行讀寫操作,因此只需開發一個第三方程序??赏ㄟ^遠程連接數據庫來讀取數據庫中的數據,再通過OPC接口將數據傳輸到生產系統中;也可以通過OPC接口讀取生產系統中的數據,再將數據寫到裝車臺數據庫中,以此實現生產系統和裝車臺系統之間的數據交互。
第三方程序采用C#進行開發,通過ADO.NET遠程連接數據庫并進行相應的讀寫操作;利用OPC接口實現對生產系統中的數據進行操作。數據交互框圖如圖1所示。

圖1 數據交互圖Fig.1 Schematic of data interaction
在數據交互過程中,還需在裝車臺系統中增加裝車起始時的儲罐儲量以及裝車結束后的儲罐儲量。雖然裝車臺系統中有自己的計量系統,可以計量出實際裝車量,但是卻不能測得儲罐現有的實際儲量;而且在裝車前后計量儲量也可起到一個參考作用。
技術作為控制領域中的第一接口標準,具有舉足輕重的地位,廣泛應用在工業生產自動化主要生產裝置DCS(集散型控制系統)中,使得原本復雜的通信過程變得統一化、標準化。
本系統設計了基于C#的OPC客戶端,實現了生產系統與裝車臺系統之間的數據交互。OPC的接口分為自動化接口(automation interface)和自定義接口(custom interface)[2],由于程序選用的開發語言是 C#,所以在此選用自動化接口。
使用C#進行客戶端程序的開發,就必須了解服務器對象模型。OPC自動化服務器對象的組織為層次結構,自動化接口對象的分層結構如圖2所示。

圖2 OPC自動化接口對象的分層結構Fig.2 Hierarchic structure of the OPC automation interface objects
OPC服務器對象不僅包含服務器的信息,而且它也是組對象(Group)的容器。OPC組對象提供了OPC客戶程序用于組織數據的方法,客戶通過組對象進行讀寫操作[3]。當服務器緩沖區內的數據發生變化時,OPC將向客戶發出通知,客戶得到通知后進行必要處理,而無需浪費大量時間進行查詢[4]。一般情況下,客戶和服務器的連接對應一個組對象即可。OPC數據項(Item)是服務器端定義的對象,是OPC中最小的數據單位。每個組對象中,可以加入多個OPC數據項,每個OPC項指向設備的一個寄存器單元。OPC客戶對設備寄存器的操作是通過其數據項來完成的,通過OPC數據項,OPC規范隱藏了設備的特殊信息,也使OPC服務器的通用性大大增強[5]。OPC客戶端是通過OPC組對象進行操作的,OPC項并不提供對外接口,客戶不能直接對其進行操作。每個數據項包含3個成員變量:數據值、數據質量和時間戳。一個OPC服務器最多有一個OPC瀏覽器對象,方便客戶程序瀏覽OPC服務器上的相關信息。
裝車臺系統提供了一個實時數據庫供訪問,在實時數據庫中加入了裝車前儲量和裝車后儲量兩個信息,以便將計量得到的儲罐儲量記錄到裝車臺系統中。裝車臺系統中部分數據信息表如表1所示。

表1 裝車臺數據信息Tab.1 Data information of loading platform
從表1中所示數據信息可以得知,可以通過ms_state(裝車狀態)標志位來確定哪個裝車臺正在裝車。
C#開發自動化接口具有許多優點,如自動初始化COM庫、自動釋放接口指針等,這些都不需要開發者自己動手操作。采用C#開發自動化接口,首先要建立一個服務器對象;接著根據OPC服務器的ProgID連接OPC服務器,實現從客戶端啟動OPC服務器;然后再按順序添加組、添加項;最后,就可以實現同步或者異步讀寫操作[6]。這些操作都是通過OPCGroup即組對象進行操作的。通信完畢后,客戶端退出時必須斷開與OPC服務器的連接,釋放接口與內存。此處使用OPCdotNETLib.dll動態鏈接庫[7]。
以上為OPC客戶端訪問服務器的過程。在實際生產系統中,還需要考慮到裝車臺和罐容計量等因素。實際生產系統中有2個裝車臺,2個裝車臺的數據存放在同一個數據庫表中,因此在程序設計過程中需要判斷2個裝車臺的標志位。為確保裝車信息的實時性,不采用循環輪詢的方式來讀取裝車信息。當2個裝車臺的標志位處于裝車狀態時,采用并發的形式對其進行操作。單個裝車臺的程序設計流程圖如圖3所示。

圖3 程序流程圖Fig.3 Flowchart of the program
裝車臺的服務器名稱為ZCT/SQL,數據庫名稱為Zct_Database,裝車信息表的名稱為ms_state。連接裝車臺數據庫的部分程序代碼如下。


當裝車標志位為1后,連接控制系統的OPC服務器,讀寫控制系統的數據。程序代碼如下。

連接完OPC服務器并讀取到相關數據后,先要計量儲罐儲量,儲罐儲量的計量由一個函數完成,通過直接調用函數完成即可。將儲量結果存入數據庫,讀取數據庫,更新OPC項,判斷裝車標志位。如果標志為1,裝車進行中,則繼續更新數據;否則裝車結束。再次調用儲量計量函數,并將結果存入數據庫。最后斷開OPC服務器連接,程序跳轉至開頭,繼續循環。至此即實現了生產系統與裝車臺系統之間的數據交互功能。
本文主要闡述了如何實現生產系統與裝車臺系統之間的數據交互功能。由于PKS系統提供了OPC接口,裝車臺系統提供了數據庫,因此利用C#開發第三方程序,通過OPC接口與生產系統進行數據交互,通過ADO.NET與裝車臺數據庫進行數據交互,最終實現了兩個生產系統之間的數據交互。
[1]陳曦,李鵬.OPC服務器在SCADA系統中的應用研究[J].機械設計與制造,2010(11):59 -61.
[2]李梁.基于OPC技術的自動化軟件的研究[D].成都:電子科技大學,2000.
[3]王燕,王健.OPC接口技術在DCS數據交換中的應用[J].微計算機信息,2010,26(11):48 -50.
[4]梅曉東,顏燁青.Visual C#網絡編程技術與實踐[M].北京:清華大學出版社,2008.
[5]羅剛.基于OPC技術的工業控制系統的研究與開發[D].南京:南京工業大學,2005.
[6]王艷艷.大型石化企業OPC技術的研究與應用[D].北京:北京化工大學,2009.
[7]穆群英.動態連接庫(DLL)及其應用[J].石油儀器,2001(3):49-51.