任 強(qiáng)(沈陽延鋒江森座椅有限責(zé)任公司,沈陽 110000)
使用VB語言編程OPC通信技術(shù)
任強(qiáng)
(沈陽延鋒江森座椅有限責(zé)任公司,沈陽110000)
傳統(tǒng)的PLC上位通信程序由于各品牌PLC有著不同的通信協(xié)議與接口方式,設(shè)計(jì)前需要花費(fèi)一定時(shí)間熟悉各品牌的通信協(xié)議與特性,設(shè)計(jì)難度很大。并且設(shè)計(jì)出的程序在更換PLC品牌后根本無法兼容,造成程序的靈活性較差。OPC技術(shù)由于其兼容廣泛、開發(fā)簡單的特點(diǎn),讓上位程序設(shè)計(jì)起來簡單靈活。本文通過講解如何使用VB語言編寫OPC上位機(jī)程序,使廣大電氣設(shè)計(jì)人員了解到該技術(shù)實(shí)現(xiàn)PLC上位通信是非常簡單的。
PLC;上位機(jī);OPC技術(shù)
OPC技術(shù)是(OLEforprocesscontrol)的簡稱,是基于微軟Windows系統(tǒng)的OLE/COM技術(shù)開發(fā)的一項(xiàng)應(yīng)用技術(shù)。COM技術(shù)提供了一個(gè)標(biāo)準(zhǔn)化的平臺,各個(gè)設(shè)備廠商基于這個(gè)平臺開發(fā)符合標(biāo)準(zhǔn)化COM接口的PLC產(chǎn)品。OPC技術(shù)基于這一平臺,整合各品牌PLC產(chǎn)品COM組件接口,輸出一個(gè)標(biāo)準(zhǔn)化數(shù)據(jù)接口。這樣無論應(yīng)用程序開發(fā)人員使用何種語言,只需要調(diào)用這個(gè)數(shù)據(jù)接口,即可訪問到所連接的PLC數(shù)據(jù),而不用考慮PLC的品牌,以及底層協(xié)議。
標(biāo)準(zhǔn)化的OPC系統(tǒng)包括4個(gè)部分:
(1)OPC服務(wù)器:為上位機(jī)與PLC提供過程數(shù)據(jù)。
(2)OPC代理占位DLL:為VB或者VBA開發(fā)的OPC應(yīng)用程序提供OPC服務(wù)器接口數(shù)據(jù)格式交換服務(wù)。
(3)OPC自動化包裝DLL:提供OPC服務(wù)器的自動化接口變換服務(wù)。VB或者VBA開發(fā)的上位機(jī)應(yīng)用程序需要通過該接口訪問OPC服務(wù)器。
(4)OPC應(yīng)用程序:設(shè)計(jì)人員使用VB等語言設(shè)計(jì)的提供給用戶的人機(jī)界面程序,含有用戶要求的所有功能。
上述中OPC服務(wù)器、OPC占位代理DLL、OPC自動化包裝DLL這三部分是由第三方開發(fā)的DLL文件。本文以KEPWARE公司的OPC軟件產(chǎn)品為例,介紹如何編程VB與OPC數(shù)據(jù)通訊。在KEPWARE中所連接的設(shè)備以通道(CHANNEL)的形式描述,每連接一個(gè)設(shè)備就使用一個(gè)CHANNEL,同時(shí)每一個(gè)CHANNEL對應(yīng)OPC服務(wù)器一個(gè)OPC組(下面會介紹到)。在對應(yīng)的CHANNEL里面設(shè)置好通信端口即可。以串口1為例是COM 1,也支持以太網(wǎng)通信。
通過VB訪問OPC服務(wù)器主要有三種對象,這三種對象有各自的參數(shù)、屬性、方法。
(1)OPC服務(wù)器。
(2)OPC組(OPC組集合)。
(3)OPC標(biāo)簽(OPC標(biāo)簽集合)。
OPC組、OPC標(biāo)簽在訪問之前需要在KEPWARE一側(cè)建立,并配置好標(biāo)簽的對應(yīng)PLC內(nèi)部地址。下面分步介紹如何編程訪問OPC服務(wù)器,以操作PLC數(shù)據(jù)的。
在使用VB編程OPC訪問程序的時(shí)候,首先建立OPC服務(wù)器名并建立連接。
聲明OPC服務(wù)器:
Publicopc_ServerObjAsOPCServer//聲明全局OPC服務(wù)器,變量名opc_ServerObj
Setopc_ServerObj=NewOPCServer//建立OPC服務(wù)器
連接OPC服務(wù)器可以顯式訪問也可以隱式訪問。
連接服務(wù)器:
opc_ServerObj.Connect(myOPCInfor.OPC_Server)//隱式訪問,使用myOPCinfor.OPC子過程返回的值作為訪問參數(shù)。這樣可以靈活指定所訪問的OPC服務(wù)器。
在OPC服務(wù)器中OPC組集合是自動包含的,可以使用OPC組集合的Add方法在里面添加OPC組。代碼示例:
Publicopc_G roupObjAsOPCG roup//全局聲明opc_GrouopObj變量作為OPC組屬性
Setopc_G roupObj=opc_ServerObj.OPCG roups.Add(myOPCInfor. OPC_G roup)//添加OPC組名稱,同樣使用隱式訪問,添加的組名稱為變量”myOPCInfor.OPC_G roup”中內(nèi)容。
SetmyGroup1=opc_ServerObj.OPCG roups.Add("G roup1")//顯式聲明一個(gè)名稱為G roup1的OPC組
在KEPWARE中配置的OPC標(biāo)簽集合名稱在編程時(shí)要一致,OPC組的名稱也要一致,否則無法通訊。下面是使用變量間接指定的例子。代碼示例:myOPCInfor.OPC_Item=myConfig.GetStringValue("OP CInfo","OPCItem","",m_strConfigurationFileName)//同樣通過Land文件當(dāng)中的“OPCinfo”字段中的“OPCItem”項(xiàng)內(nèi)容來指定OPC組集合字符串。
OPC項(xiàng)是指定訪問OPC服務(wù)器數(shù)據(jù)的名稱,其通過OPC服務(wù)器與PLC相關(guān)聯(lián),指向要訪問的PLC某個(gè)數(shù)據(jù)地址。編程OPC服務(wù)器之前,先在KEPWAR軟件當(dāng)中配置好需要訪問的OPC項(xiàng),將其與PLC內(nèi)部的某個(gè)地址相關(guān)聯(lián),軟件中稱為“TAG”。比如:新建項(xiàng)并命名TAG 1,配置地址為D200。那么在設(shè)計(jì)應(yīng)用程序訪問地址D 200的數(shù)據(jù)時(shí),就指定訪問名TAG 1就可以了。但是在使用OPC項(xiàng)之前,先進(jìn)行添加,取得相應(yīng)的句柄并妥善保存。如果要對OPC組內(nèi)大量項(xiàng)標(biāo)簽進(jìn)行讀寫操作的時(shí),這個(gè)句柄就非常有用。
Fori= 1 To 10
Setopc_ItemObj=opc_G roupObj.OPCItems.Add Item(m yOPCInfor.OPC_ G roup+myOPCInfor.OPC_Item + "TestMax"+CStr(i),1)//在OPC組中的項(xiàng)標(biāo)簽集合里面添加10個(gè)名稱從TestMax(1)到TestMax(10)的OPC項(xiàng)標(biāo)簽(item)。
Serverhandles(i)=opc_ItemObj.ServerHand le//通過數(shù)組取得項(xiàng)標(biāo)簽的句柄。
Nexti
在應(yīng)用程序設(shè)計(jì)中,如果需要讀寫項(xiàng)集合內(nèi)的某個(gè)項(xiàng)數(shù)據(jù),需要取得標(biāo)簽集合中該項(xiàng)標(biāo)簽的符號,這就需要用到枚舉方法。就是在標(biāo)簽集合中進(jìn)行項(xiàng)標(biāo)簽枚舉,直到找到指定的的項(xiàng)。
在程序代碼中編寫子過程用以實(shí)現(xiàn)枚舉標(biāo)簽集合中所有的項(xiàng)標(biāo)簽功能。這個(gè)子過程可以作為一個(gè)功能塊在所有讀寫項(xiàng)標(biāo)簽的語句中調(diào)用。在調(diào)用過程中只需要通過傳值的形式傳遞項(xiàng)標(biāo)簽標(biāo)識符,子過程就可以完成查找、返回項(xiàng)符號,進(jìn)而進(jìn)行讀寫操作。
代碼示例:
iCount=myGroup1.OPCItems.Count//取得OPC組中所有項(xiàng)的數(shù)目。IfiCount>0Then//下面是枚舉過程
For i =1 ToiCount
Set opc_ItemObj = myGroup1.OPCItems.Item(i) //取得每一項(xiàng)標(biāo)簽的標(biāo)識符
str = opc_ItemObj.Item ID //中間變量賦值
If (str = strItem)Then // 通過比較中間變量,找到與傳遞過來的項(xiàng)標(biāo)識符一致的項(xiàng)
Set opc_ItemObj = myGroup1.OPCItems.Item(i) //將找到的項(xiàng)符號賦值給指定變量,該變量用于項(xiàng)標(biāo)簽的讀寫操作。
gAddItem_PLC = True
End If
Next
End If
返回的項(xiàng)標(biāo)簽符號存入變量OPC_ItemObj中,可以方便的進(jìn)行讀寫操作。
代碼示例:
If my PubclsOPC.gAddItem_PLC(myOPCInfor.OPC_Group + myOPCInfor.OPC_Item + "Group1." + strBitItem)=TrueThen//將需要寫入的項(xiàng)標(biāo)簽標(biāo)示符(ItemID)傳值的形式傳遞到myPubclsOPC. gAddItem子過程。
opc_ItemObj.Write(True)//返回項(xiàng)標(biāo)簽符號寫入變量OPC_ItemObj中,使用項(xiàng)標(biāo)簽的寫方法賦值1(True)。
End If
OPC服務(wù)器支持同步與異步的讀寫方式。同步方式是指在應(yīng)用程序發(fā)出讀寫請求之后,直到OPC服務(wù)器操作結(jié)束后繼續(xù)程序執(zhí)行。異步方式是在應(yīng)用程序發(fā)出讀寫請求之后,應(yīng)用程序繼續(xù)執(zhí)行,在OPC服務(wù)器數(shù)據(jù)處理結(jié)束后,告之應(yīng)用程序處理完畢。在數(shù)據(jù)同步性要求不高的情況下兩者區(qū)別不大。
同步讀取代碼示例:
iCount = opc_GroupObj.OPCItems.Count //取得OPC組里面的項(xiàng)標(biāo)簽數(shù)目。
If iCount> 0 Then
Call opc_GroupObj.SyncRead(OPCDevice, iCount, Serverhandles, plcVal, MyErrors, myQuality, myTimeStamp) //讀取由數(shù)組Serverhandles指定句柄的項(xiàng)標(biāo)簽,將其內(nèi)容存放入數(shù)組PlcVal里面。
End If
上面的代碼示例適合于批量讀取PLC內(nèi)部數(shù)據(jù),如果需要單獨(dú)讀寫某個(gè)項(xiàng)標(biāo)簽的數(shù)據(jù),可以使用項(xiàng)標(biāo)簽的Read與Write方法。
代碼示例:opc_ItemObj.Write (True) //對變量OPC_ItemObj賦值的OPC項(xiàng)標(biāo)簽進(jìn)行寫操作。
OPC技術(shù)有很高的靈活性,同一OPC應(yīng)用程序可以集成不同種類的PLC設(shè)備。由于基于標(biāo)準(zhǔn)化COM接口技術(shù),在切換不同種類的PLC設(shè)備時(shí),上位機(jī)的應(yīng)用程序不需要重新開發(fā),可以直接切換,這也是OPC技術(shù)得以廣泛應(yīng)用的原因之一。本文通過介紹使用VB語言實(shí)現(xiàn)上位機(jī)程序訪問OPC數(shù)據(jù),讓廣大設(shè)備開發(fā)人員了解OPC技術(shù),使大家認(rèn)識到使用這項(xiàng)技術(shù)可以方便的實(shí)現(xiàn)PLC設(shè)備上位機(jī)通訊。
任強(qiáng),男,遼寧沈陽人,大專,助理設(shè)備工程師,研究方向:電氣設(shè)備管理。