賈銘 張金巍
(1.蘇州澤達(dá)興邦醫(yī)藥科技有限公司,蘇州 215000;2 天士力制藥集團(tuán)股份有限公司,天津 300410)
現(xiàn)代中藥生產(chǎn)工藝主要包括提取、過(guò)濾、濃縮、醇沉、分離、層析、收膏、干燥等過(guò)程,以及配套的乙醇回收等幾個(gè)工序組成。建立中藥生產(chǎn)控制系統(tǒng)可以從產(chǎn)品的源頭上解決中藥產(chǎn)品工藝和成分的均一、穩(wěn)定要求,更好地與國(guó)家GMP 規(guī)范相融合、有利于保證產(chǎn)品質(zhì)量。
現(xiàn)代中藥生產(chǎn)工藝繁瑣、參數(shù)變量大,特別是原材料成分和企業(yè)工藝的控制制約了不少先進(jìn)企業(yè)的發(fā)展,對(duì)生產(chǎn)過(guò)程的計(jì)算機(jī)控制與管理提出了迫切要求?,F(xiàn)代中藥生產(chǎn)中,提取是非常關(guān)鍵的起始階段,一般采用批量生產(chǎn)方式,批量生產(chǎn)過(guò)程要求生產(chǎn)線具有良好的操作柔性,即在同一生產(chǎn)線上按批量生產(chǎn)單一或經(jīng)清洗后滿足多種不同產(chǎn)品的生產(chǎn)。本文所述的中藥生產(chǎn)控制系統(tǒng)采用OPTO22 公司的PAC 控制系統(tǒng),對(duì)提取、過(guò)濾、濃縮、沉淀、分離等工序進(jìn)行了自動(dòng)化設(shè)計(jì),取得了良好的效果。
由于本控制系統(tǒng)采用OPTO22 公司的PAC 控制系統(tǒng),因此使用了OPTO22 集成的組態(tài)軟件進(jìn)行了組態(tài),實(shí)現(xiàn)了使用圖形界面進(jìn)行現(xiàn)場(chǎng)設(shè)備的監(jiān)測(cè)與控制,實(shí)現(xiàn)了生產(chǎn)操作的自動(dòng)化。同時(shí),在進(jìn)行工藝總結(jié)或生產(chǎn)過(guò)程回顧時(shí),需要查看生產(chǎn)過(guò)程數(shù)據(jù),進(jìn)行統(tǒng)計(jì)和分析,由于集成的ioDisplay 組態(tài)軟件歷史數(shù)據(jù)存儲(chǔ)功能簡(jiǎn)陋,只能保存為文本文檔,對(duì)于存儲(chǔ)以后的查詢,十分不便,因此主要依靠人工填寫(xiě)的生產(chǎn)記錄來(lái)追溯歷史過(guò)程。人工填寫(xiě)的生產(chǎn)記錄,記錄點(diǎn)少,間隔時(shí)間長(zhǎng),僅靠少量的數(shù)據(jù)不足以對(duì)整個(gè)生產(chǎn)過(guò)程做全面的評(píng)估、分析。因此控制系統(tǒng)迫切的需要增加控制點(diǎn)數(shù)據(jù)記錄功能。
根據(jù)數(shù)據(jù)處理過(guò)程,大致分為三步,首先將原始數(shù)據(jù)“讀出來(lái)”,然后將數(shù)據(jù)“存進(jìn)去”,最后再將數(shù)據(jù)“取出來(lái)”。要將數(shù)據(jù)從控制系統(tǒng)中“讀出來(lái)”,關(guān)鍵是實(shí)現(xiàn)PAC 數(shù)據(jù)通訊。“存進(jìn)去”即數(shù)據(jù)存進(jìn)數(shù)據(jù)庫(kù)中,“取出來(lái)”即數(shù)據(jù)從數(shù)據(jù)庫(kù)中取出來(lái),這兩步的關(guān)鍵是實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。最后“取出來(lái)”功能,還涉及表格、趨勢(shì)圖的自動(dòng)生成。
總結(jié)分解的目標(biāo)如下:
(1)實(shí)現(xiàn)PAC 控制系統(tǒng)數(shù)據(jù)通訊。
(2)實(shí)現(xiàn)數(shù)據(jù)存、取等數(shù)據(jù)庫(kù)操作。
(3)數(shù)據(jù)查詢及數(shù)據(jù)呈現(xiàn)。
要實(shí)現(xiàn)“讀出來(lái)”、“存進(jìn)去”和“取出來(lái)”三個(gè)過(guò)程,首先需要選擇軟件開(kāi)發(fā)平臺(tái)。本著輕量級(jí)化,軟硬件需求環(huán)境低的原則,選擇使用Visual Basic[1]6.0 開(kāi)發(fā)平臺(tái)。然后需要選擇數(shù)據(jù)庫(kù)平臺(tái),要同時(shí)滿足輕量級(jí)化和C/S(客戶端/服務(wù)器)架構(gòu),架設(shè)一個(gè)數(shù)據(jù)庫(kù)服務(wù)器可滿足多個(gè)操作員站訪問(wèn),選擇使用SQL Server[2]2000 數(shù)據(jù)庫(kù)。
下面針對(duì)每個(gè)分解目標(biāo)擬定實(shí)現(xiàn)方案。
3.2.1 實(shí)現(xiàn)PAC 控制系統(tǒng)數(shù)據(jù)通訊
要實(shí)現(xiàn)PAC 控制系統(tǒng)的通訊,主要有兩種途徑。第一是從PAC 硬件中讀取數(shù)據(jù),這需要開(kāi)發(fā)硬件驅(qū)動(dòng),費(fèi)事費(fèi)力。第二是從上位機(jī)軟件中讀取數(shù)據(jù),這里要用到IoProject 組態(tài)軟件關(guān)鍵的OPC 接口,下面簡(jiǎn)要介紹一下OPC 接口。
OPC[3]是OLE(Object Linking and Embedding,對(duì)象鏈接和嵌入)for Process Control 的縮寫(xiě),它是基于微軟的COM(組件對(duì)象模型)、DCOM(分布式組件對(duì)象模型)技術(shù),為實(shí)現(xiàn)控制系統(tǒng)開(kāi)放互通的一項(xiàng)標(biāo)準(zhǔn)。OPC 在硬件供應(yīng)商和軟件開(kāi)發(fā)人員之間搭上了一座橋梁,它提供了一種機(jī)制從數(shù)據(jù)源提供數(shù)據(jù)并且以一種標(biāo)準(zhǔn)的方式將這些數(shù)據(jù)傳送的任意客戶端應(yīng)用軟件[4]。OPC 也為實(shí)現(xiàn)控制網(wǎng)絡(luò)與信息網(wǎng)絡(luò)之間的信息交互提供了較為方便的途徑,見(jiàn)圖1。
3.2.2 實(shí)現(xiàn)數(shù)據(jù)存、取等數(shù)據(jù)庫(kù)操作
“存進(jìn)去”這一需求,需要在Visual Basic 6.0 開(kāi)發(fā)平臺(tái)與SQL Server 2000 數(shù)據(jù)庫(kù)中架設(shè)一座橋梁,ADO組件可以充當(dāng)了這一角色,下面簡(jiǎn)要介紹一下ADO 組件。
ADO (ActiveX Data Objects,ActiveX 數(shù)據(jù)對(duì)象)是Microsoft 提出的應(yīng)用程序接口(API)用以實(shí)現(xiàn)訪問(wèn)關(guān)系或非關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)。Microsoft 和其它數(shù)據(jù)庫(kù)公司在它們的數(shù)據(jù)庫(kù)和Microsoft 的OLE 數(shù)據(jù)庫(kù)之間提供了一個(gè)“橋”程序,OLE 數(shù)據(jù)庫(kù)已經(jīng)在使用ADO 技術(shù)。
3.2.3 數(shù)據(jù)查詢及數(shù)據(jù)呈現(xiàn)
DBGrid 是強(qiáng)大的表格工具,MSChart 是功能強(qiáng)大的ActiveX 組件,通過(guò)編寫(xiě)適當(dāng)?shù)拇a可將查詢的數(shù)據(jù)自動(dòng)生成表格和趨勢(shì)圖。
4.1.1 OPC 接口架構(gòu)
OPC接口共有6個(gè)對(duì)象,他們是OPCServer服務(wù)器、OPCGroups 組集合、OPCGroup 組、OPCItems 標(biāo)簽集合、OPCItem 標(biāo)簽、OPCBrowser 瀏覽器,見(jiàn)圖2。
圖1 OPC 接口示意圖
圖2 OPC 接口架構(gòu)
6 個(gè)對(duì)象的作用,見(jiàn)表1。
4.1.2 OPC 接口運(yùn)行過(guò)程
OPC 接口有特定的運(yùn)行過(guò)程,見(jiàn)圖3。
4.1.3 定義OPC 接口對(duì)象
Dim OPCServer1 As OPCServer / 定義OPCServer服務(wù)器
Dim Groups1 As OPCGroups /定義OPCGroups 組集合
表1 OPC 接口對(duì)象
Dim WithEvents Group1 As OPCGroup / 定義OPCGroup 組
圖3 OPC 接口運(yùn)行過(guò)程
Dim Item1 As OPCItem /定義OPCItems 標(biāo)簽
Set OPCServer1 = New OPCServer /創(chuàng)建OPCServer服務(wù)器實(shí)例
OPCServer1.Connect ("Opto22.OpcServer.2")/ 連接Opto22 控制系統(tǒng)
Set Groups1 = OPCServer1.OPCGroups / 創(chuàng)建OPCGroups 組集合實(shí)例
Set Item1 = Group1.OPCItems.AddItem(ItemID,ClientHandle) /創(chuàng)建OPCItem 標(biāo)簽實(shí)例
4.1.4 數(shù)據(jù)獲取方式
OPCServer 服務(wù)器提供了同步和異步兩種方法。同步的方式客戶端必須等待返回的結(jié)果,效率很低,此種方式一般在故障診斷時(shí)使用。異步的方式使客戶端可以在訪問(wèn)數(shù)據(jù)后繼續(xù)下一步操作,在結(jié)果返回時(shí),OPC 服務(wù)器會(huì)通知客戶端,這種方式訪問(wèn)效率高。
采用異步方式,我們可以利用OPCGroup 組的DataChange 事件,自動(dòng)獲取PAC 控制系統(tǒng)數(shù)據(jù)當(dāng)滿足一定的條件時(shí),OPC 服務(wù)器返回結(jié)果,激發(fā)相應(yīng)的事件來(lái)通知客戶端程序做相應(yīng)的處理,系統(tǒng)資源耗費(fèi)較少。
事件的結(jié)構(gòu)代碼如下:
Event DataChange(TransactionID As Long, NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)
至此,已經(jīng)完成了與PAC 控制系統(tǒng)的通訊。
4.2.1 定義ADO 組件對(duì)象并連接數(shù)據(jù)庫(kù)
Dim Connection1 As New ADODB.Connection / 定義Connection 連接對(duì)象
Dim Recordset1 As New ADODB.Recordset / 定義Recordset 數(shù)據(jù)集對(duì)象
Dim Command1 As New ADODB.Command / 定義Command 命令對(duì)象
Connection1.ConnectionString= "Provider = SQLOLEDB.1; Persist Security Info=False;_
User ID= 用戶名;Initial Catalog= 數(shù)據(jù)庫(kù);Data Source=數(shù)據(jù)源" /定義Connection 連接對(duì)象連接字符串
Connection1.Open / 打開(kāi)Connection 連接
Command1.ActiveConnection = Connection1 / 設(shè)置Command 命令使用Connection 連接
4.2.2 將記錄時(shí)間、數(shù)值、控制點(diǎn)位號(hào)及生產(chǎn)批號(hào)存入數(shù)據(jù)庫(kù)表
Dim String1 As String /定義字符串
String1 = "insert into 生產(chǎn)數(shù)據(jù)表(記錄時(shí)間,數(shù)值,控制點(diǎn)位號(hào),生產(chǎn)批號(hào)) _
values('Str(Item1.TimeStamp)', Item1.Value, ClientHandle, curBatchId)" / 設(shè)置insert 字符串語(yǔ)句
Command1.CommandText = String1 / 設(shè)置Command 命令為已設(shè)置完的insert 字符串語(yǔ)句
Command1.Execute /Command 命令執(zhí)行
4.3.1 數(shù)據(jù)查詢主要依靠強(qiáng)大的select 查詢語(yǔ)句,格式如下:
Select 記錄時(shí)間,數(shù)值,控制點(diǎn)位號(hào) from 生產(chǎn)數(shù)據(jù)表 where 生產(chǎn)批號(hào)=201401001
4.3.2 數(shù)據(jù)呈現(xiàn)
數(shù)據(jù)呈現(xiàn)的界面,見(jiàn)圖4。
借助Excel 強(qiáng)大的數(shù)據(jù)處理功能,能夠快速生產(chǎn)各種圖表,進(jìn)行統(tǒng)計(jì)、分析,Excel 輸出功能很多軟件都具備,且受歡迎,Excel 輸出關(guān)鍵代碼如下:
Set ExcelObject = CreateObject("Excel.Application") /創(chuàng)建Excel 對(duì)象
Set ExcelObject = GetObject(, "Excel.Application") / 激活Excel 對(duì)象
Set ExcelBook = ExcelObject.Workbooks.Add / 在Excel 中添加一個(gè)工作簿
圖4 數(shù)據(jù)查詢界面圖
Set ExcelSheet = ExcelBook.ActiveSheet / 在Excel中激活一個(gè)工作表
ExcelSheet.Cells(1, 1) = "時(shí)間" / 第1 行第1 列寫(xiě)入“時(shí)間”作為表頭
ExcelSheet.Cells(1, 2) = "數(shù)值" / 第1 行第2列寫(xiě)入“數(shù)值”作為表頭
定義循環(huán),將數(shù)據(jù)庫(kù)中存儲(chǔ)的“記錄時(shí)間”、“數(shù)值”輸出到Excel 工作表中
Dim i As Integer
For i = 2 To RecordSet1.RecordCount
ExcelSheet.Cells(i, 1) = RecordSet1.Fields. Item("記錄時(shí)間")
ExcelSheet.Cells(i, 2) = RecordSet1.Fields. Item("數(shù)值")
RecordSet1.MoveNext Next i
4.3.3 表格顯示功能
Set DataGrid1.DataSource=RecordSet1 /設(shè)置表格的數(shù)據(jù)源為查詢語(yǔ)句返回的記錄集
4.3.4 趨勢(shì)圖顯示功能
/設(shè)置MSChart 的行關(guān)聯(lián)RecordSet 記錄集
MSChart1.RowCount = RecordSet1.RecordCount
/定義循環(huán) ,將數(shù)據(jù)庫(kù)中存儲(chǔ)的“數(shù)值”生成趨勢(shì)圖
Dim i As Integer
For i = 1 To RecordSet1.RecordCount
MSChart1.Row = i
MSChart1.Data = RecordSet1.Fields.Item("數(shù) 值")
RecordSet1.MoveNext
Next i
使用Visual Basic 開(kāi)發(fā)平臺(tái)和SQL Server 數(shù)據(jù)庫(kù),運(yùn)用OPC、ADO 等關(guān)鍵技術(shù)進(jìn)行OPTO22 PAC 中藥生產(chǎn)控制系統(tǒng)數(shù)據(jù)庫(kù)二次開(kāi)發(fā),大幅度提升了原系統(tǒng)歷史數(shù)據(jù)管理能力,系統(tǒng)具備數(shù)據(jù)自動(dòng)存儲(chǔ)、查詢、Excel 輸出、表格和趨勢(shì)圖自動(dòng)生成功能,便于進(jìn)行生產(chǎn)過(guò)程數(shù)據(jù)的統(tǒng)計(jì)分析、歷史數(shù)據(jù)追溯,很大程度上,提高了產(chǎn)品質(zhì)量,收到了良好的效果。系統(tǒng)輕量級(jí)化,安裝文件僅四十多兆,安裝環(huán)境要求低,可安裝于原系統(tǒng)工程師站,不增加硬件投入。
[1] OPC 基 金 會(huì),Data Access Automation Interface Standard 2.02 版[M]. 1999.
[2] 龔沛曾, 楊志強(qiáng), 陸慰民. Visual Basic 程序設(shè)計(jì)教程(第3 版) [M].北京:高等教育出版社,2007.
[3] 劉啟芬, 顧韻華, 鄭阿奇. SQL Server 使用教程(第3 版)[M].北京:電子工業(yè)出版社,2012.
[4] 孫漢卿,吳海波.現(xiàn)場(chǎng)總線技術(shù)[M].北京:國(guó)防工業(yè)出版社,2014.