




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
一、引言
現(xiàn)在有很多工業(yè)控制產(chǎn)品都支持OPCServer,如西門子SIMATICNET、WINCC、WINAC、Protool/pro,亞控公司組態(tài)王等,這些產(chǎn)品本身在一些需要實現(xiàn)很復雜的數(shù)據(jù)模型功能上還顯得缺乏,由于支持了OPC,我們就可以在VB或C++上通過OPC獲取數(shù)據(jù)進而實現(xiàn)較復雜的功能〔如強大的數(shù)據(jù)庫管理或數(shù)據(jù)分析〕。本文討論了如何在VB中開發(fā)一個動態(tài)連接庫,以方便開發(fā)者實現(xiàn)對OPC效勞器的數(shù)據(jù)采集,將精力更多的放在界面開發(fā)和數(shù)據(jù)處理上。二、功能設(shè)計
類型設(shè)計為ActiveXDll,名稱:OPC_Dll.dll,可以在VB工程[引用]中加載,加載后通過創(chuàng)立類BCA_OPC的實例來實現(xiàn)OPC數(shù)據(jù)通訊,BCA_OPC的調(diào)用功能如下:
1、配置初始化:Dll_Initial(strConfigFileAsString)AsBoolean
其中strConfigFile為連接OPC效勞器對應的配置文件名稱〔*.ini〕,用戶建立的配置文件應遵循一定的格式〔在下面應用中說明〕,并且應放在系統(tǒng)目錄下〔如C:\WINNT下〕。配置文件中包含了要連接的OPC效勞器名稱、log文件名稱、變量組定義及對應組內(nèi)的變量定義〔本連接庫最多支持1024個變量通訊,對變量組的數(shù)目沒有限制〕。配置成功返回TRUE。
2、連接OPC效勞器:ConnectServer(OptionalIPAddressAsString)AsBoolean
IPAddress為可選的遠程OPC效勞器所屬PC的IP地址,如“”,如果不提供IPAddress參數(shù),那么默認為本機OPC效勞器。連接成功返回TRUE。
3、配置通訊變量〔組態(tài)OPC客戶機〕:SetConfiguration()AsBoolean
根據(jù)提供的ini配置文件組態(tài)OPC客戶機與效勞器的變量通訊,組態(tài)成功返回TRUE。
4、讀變量數(shù)據(jù):GetData(ItemNameAsString)
ItemName為變量名稱,必須與ini配置文件中的變量名稱一致。本功能返回該變量的實際數(shù)據(jù)。
5、寫變量數(shù)據(jù):WriteData(ItemNameAsString,ItemWriteDataAsVariant)
ItemName為變量名稱,ItemWriteData為變量數(shù)據(jù)。
三、實現(xiàn)代碼
1、在VB6.0中新建ActiveXDll工程,如下列圖:
2、在工程菜單中添加引用,如下列圖:
如果系統(tǒng)中沒有OPCAutomation,你需要安裝注冊O(shè)PC自動化。一般裝了OPC支持的軟件,系統(tǒng)都支持OPC自動化。
3、在工程中添加模塊,如下列圖:
模塊API_Function為軟件所需的一些API函數(shù)。
模塊Global_constants為一些系統(tǒng)常量
類模塊BCA_OPC為實現(xiàn)主類
類模塊ItemInfo和ItemsInfo實現(xiàn)變量信息的封裝
4、以下為各模塊的程序代碼:
API_Function:
OptionExplicit'----------------------------------
'獲取一個與給定初始化文件指定域中的一個鍵相聯(lián)系的整數(shù)值(1)
PublicDeclareFunctionGetPrivateProfileIntLib"kernel32"Alias_
"GetPrivateProfileIntA"(ByVallpApplicationNameAsString,ByVallpKeyNameAsString,_
ByValnDefaultAsLong,ByVallpFileNameAsString)AsLong
'從一個初始化文件中獲取指定段的所有鍵和值(2)
PublicDeclareFunctionGetPrivateProfileSectionLib"kernel32"Alias_
"GetPrivateProfileSectionA"(ByVallpAppNameAsString,ByVallpReturnedStringAsString,_
ByValnSizeAsLong,ByVallpFileNameAsString)AsLong
'獲取初始化文件中的制定斷下的一個字符串(3)
PublicDeclareFunctionGetPrivateProfileStringLib"kernel32"Alias_
"GetPrivateProfileStringA"(ByVallpApplicationNameAsString,ByVallpKeyNameAsAny,_
ByVallpDefaultAsString,ByVallpReturnedStringAsString,ByValnSizeAsLong,_
ByVallpFileNameAsString)AsLongGlobal_constants:
OptionExplicit
OptionBase1
'Globalconstrants
'------------------------------
GlobalConstEnglish=&H409
GlobalConstOPC_DS_CACHE=1
GlobalConstOPC_DS_DEVICE=2BCA_OPC:
OptionExplicit
OptionBase1'InterfaceObjects接口對象
'----------------------------------------------------------------------------
'必須使用WithEvents來申明對象OPCServer和OPCGroup,
'WithEvents指定申明的對象用于處理對象的事件
DimWithEventsServerObjAsOPCServer
'定義OPCServer
DimGroupObjAsOPCGroup
'定義OPCGroup
DimWithEventsGroupCollectionAsOPCGroups'定義OPCGroups
DimItemCollectionAsOPCItems
'定義OPCItems
DimItemObjAsOPCItem
'定義OPCItem
'----------------------------------------------------------------------------
'GlobalVariables全局變量
'----------------------------------------------------------------------------
DimServerNameAsString
'OPC效勞器名稱
DimServerConnectedAsBoolean
'OPC效勞器已連接標志
'OPCServer和OPCGroup都有ServerHandle和ClientHandle參數(shù);
'ServerHandle用于OPC效勞器定位;ClientHandle用于OPC客戶端定位;
DimServerGroupHandle()AsLong
'效勞器-組句柄(索引)
DimServerItemHandle()AsLong
'效勞器-條目句柄
DimClientGroupHandle()AsLong
'客戶機-組句柄
DimClientItemHandle()AsLong
'客戶機-條目句柄
DimDll_is_InitialAsBoolean
'DLL初始化
DimConfiguration_is_SetAsBoolean
'是否已組態(tài)
DimTraceOnAsBoolean
'跟蹤開關(guān)
DimTraceFileAsString
'跟蹤文件
DimConfigFileAsString
'組態(tài)文件
DimItemData(1024)AsVariant
'讀取變量數(shù)據(jù)的儲存地址
DimAllItemsInfoAsNewItemsInfo'log文件記錄操作
PrivateFunctionTrace(TraceMsgAsString)
IfTraceOn=TrueThen
DimfsAsObject,fAsObject
DimmHour,mMinute,mSecond,mMSecondAsString
Setfs=CreateObject("Scripting.FileSystemObject")
Setf=fs.OpenTextFile(TraceFile,8,-2)
mHour=Format(Fix(Timer/3600),"00")
mMinute=Format(Fix((Timer-mHour*3600)/60),"00")
mSecond=Format(Fix((Timer-mHour*3600-mMinute*60)),"00")
mMSecond=Format(Fix((Timer-Fix(Timer))*1000),"000")
f.Writeline"["&mHour&":"&mMinute&":"&mSecond&"."&mMSecond&"]
"&TraceMsg
f.Close
Setfs=Nothing
Setf=Nothing
EndIf
EndFunction'(1).DLL初始化
PublicFunctionDll_Initial(strConfigFileAsString)AsBoolean
DimResultAsString*255,fsAsObject,fAsObject
ConfigFile=strConfigFile
GetPrivateProfileString"TRACE","TraceOn",_
"ERROR",Result,255,ConfigFile
IfResult<>"ERROR"Then
IfResult=1Then
GetPrivateProfileString"TRACE","TraceFile",_
"ERROR",Result,255,ConfigFile
IfResult<>"ERROR"Then
TraceFile=Result
Else
TraceFile=App.Path&"\Trace.log"
EndIf
Setfs=CreateObject("Scripting.FileSystemObject")
Setf=fs.CreateTextFile(TraceFile,True)
f.Writeline("***BCA_OPCTraceStarted,BeiChenAutomation2003/ZhangPeng***")
f.Close
TraceOn=True
Else
TraceOn=False
EndIf
Dll_is_Initial=True
Dll_Initial=True
Trace">Dll_Initial"
Trace"<Dll_InitialOK"
Else
MsgBox"無法找到配置文件:"&strConfigFile,vbOKOnly,"錯誤"
Dll_is_Initial=False
Dll_Initial=False
EndIf
EndFunction'(2).連接OPC效勞器
PublicFunctionConnectServer(OptionalIPAddressAsString)AsBoolean
Trace">ConnectServer"
IfDll_is_Initial=FalseThen
Trace"<ConnectServerCancelled,BecauseDll_Initialhasnotbeencalled"
ExitFunction
EndIf
IfNotServerConnectedThen
ServerName=GetServerName
OnErrorGoToErrorHandler
SetServerObj=NewOPCServer
ServerObj.ConnectServerName,IPAddress
ServerConnected=True
Trace"<ConnectServerOK"
Else
Trace"<Serverhasbeenconnected,Pleasedonotconnectitagain"
EndIf
ConnectServer=ServerConnected
ExitFunction
ErrorHandler:
Trace"<ConnectServerError,PleasebesurethatServerisrunning"
ConnectServer=False
EndFunction'(3).組態(tài)OPC客戶機
PublicFunctionSetConfiguration()AsBoolean
Trace">SetConfigurationstart..."
IfDll_is_Initial=FalseThen
Trace"<SetConfigurationCancelled,BecauseDll_Initialhasnotbeencalled"
ExitFunction
EndIf
IfServerConnected=FalseThen
Trace"<SetConfigurationCancelled,BecauseConnectServerhasnotbeencalled"
ExitFunction
EndIf
IfConfiguration_is_Set=TrueThen
Trace"<SetConfigurationCancelled,Becauseconfigurationhasbeenset"
ExitFunction
EndIf
'Begintoconfigure
Dimf_retAsLong,ReturnedStringAsString*1024,Valid_ReturnedStringAsString
DimReturnedString1AsString*1024,Valid_ReturnedString1AsString
DimSpace_posAsInteger,GroupNameAsString
DimSpace_pos1,Equal_posAsInteger,ItemNameAsString,ItemIndexAsLong
DimNumItemsAsLong,ItemIDs(1)AsString,ClientHandles(1)AsLong,Serverhandles()AsLong
DimErrors()AsLong
ReturnedString=""
ReturnedString1=""
OnErrorGoToErrorHandler
SetGroupCollection=ServerObj.OPCGroups
GroupCollection.DefaultGroupIsActive=False
f_ret=GetPrivateProfileSection("GROUP",ReturnedString,1024,ConfigFile)
Valid_ReturnedString=Left(ReturnedString,f_ret+1)
DoUntilInStr(Valid_ReturnedString,Chr(0))<0
Space_pos=InStr(Valid_ReturnedString,Chr(0))
GroupName=Left(Valid_ReturnedString,Space_pos-1)
IfGroupName=""Then
GoTonxt3
EndIf
SetGroupObj=GroupCollection.Add(GroupName)
GroupObj.IsSubscribed=False
Trace"<Addgroup:"&GroupName&"OK"
SetItemCollection=GroupObj.OPCItems
ItemCollection.DefaultIsActive=True
f_ret=GetPrivateProfileSection(GroupName,ReturnedString1,1024,ConfigFile)
Valid_ReturnedString1=Left(ReturnedString1,f_ret+1)
DoUntilInStr(Valid_ReturnedString1,Chr(0))<0
Space_pos1=InStr(Valid_ReturnedString1,Chr(0))
ItemName=Left(Valid_ReturnedString1,Space_pos1-1)
IfItemName=""Then
GoTonxt2
EndIf
IfInStr(ItemName,"UpdateRate")>0OrInStr(ItemName,"IsSubscribed")>0Then
GoTonxt1
EndIf
ItemCollection.DefaultRequestedDataType=GetItemDataType(ItemName)
ItemIndex=ItemIndex+1
NumItems=1
ItemIDs(1)=ItemName
ClientHandles(1)=ItemIndex
ItemCollection.AddItemsNumItems,ItemIDs,ClientHandles,Serverhandles,Errors
AllItemsInfo.ItemInfo_AddItemName,GroupName,ItemIndex,Serverhandles(1)
Trace"<AddItem:"&ItemName&"OK"
nxt1:
Valid_ReturnedString1=Mid(Valid_ReturnedString1,Space_pos1+1)
Loop
nxt2:
f_ret=GetPrivateProfileInt(GroupName,"UpdateRate",0,ConfigFile)
GroupObj.UpdateRate=f_ret
Trace"<Setgroup:"&GroupName&"UpdateRate="&f_ret&"OK"
f_ret=GetPrivateProfileInt(GroupName,"IsSubscribed",0,ConfigFile)
GroupObj.IsSubscribed=IIf(f_ret=1,True,False)
GroupObj.IsActive=True
Trace"<Setgroup:"&GroupName&"IsSubscribed="&f_ret&"OK"
Valid_ReturnedString=Mid(Valid_ReturnedString,Space_pos+1)
SetGroupObj=Nothing
SetItemCollection=Nothing
Loop
nxt3:
Trace"<SetConfigurationend"
Configuration_is_Set=True
SetConfiguration=True
ExitFunction
ErrorHandler:
Trace"<SetConfigurationError,Pleasebesurethatconfigfileiscorrect"
Configuration_is_Set=False
EndFunction'獲取效勞器名稱
PrivateFunctionGetServerName()AsString
DimResultAsString*255
GetPrivateProfileString"SERVER","Server",_
"ERROR",Result,255,ConfigFile
GetServerName=RemoveSpaces(Result)
EndFunction'獲取效勞器連接狀態(tài)
PrivateFunctionGetConnectStatus()AsBoolean
GetConnectStatus=ServerConnected
EndFunction'功能塊:移除空格
PrivateFunctionRemoveSpaces(ItemAsString)AsString
DimResultAsString
DimiAsInteger
i=1
While(Mid$(Item,i,1)<>Chr(0))
Result=Result&Mid$(Item,i,1)
i=i+1
Wend
RemoveSpaces=Result
EndFunctionPrivateSubClass_Initialize()
Configuration_is_Set=False
Dll_is_Initial=False
ServerConnected=False
EndSub'DLL終止
PrivateSubClass_Terminate()
SetServerObj=Nothing
'釋放ServerObj
SetGroupCollection=Nothing
'釋放GroupCollection
SetItemCollection=Nothing
'釋放ItemCollection
ServerConnected=False
Dll_is_Initial=False
Configuration_is_Set=False
Trace"<Dllisterminate"
EndSub
'全局數(shù)據(jù)改變
PrivateSubGroupCollection_GlobalDataChange(ByValTransactionIDAsLong,ByValGroupHandleAsLong,ByValNumItemsAsLong,ClientHandles()AsLong,ItemValues()AsVariant,Qualities()AsLong,TimeStamps()AsDate)
DimiAsInteger,GroupNameAsString,ItemNameAsString
Trace"<==GlobalDataChange!Followingisthedata:"
GroupName=GroupCollection.GetOPCGroup(GroupHandle).Name
Trace"<==GroupName:"&GroupName&"NumberofItems:"&NumItems
Fori=1ToNumItems
ItemData(ClientHandles(i))=ItemValues(i)
Trace"<==Item'sName:"&AllItemsInfo.GetItem_Name(ClientHandles(i))&"Values:"&ItemValues(i)&"ChangedData:"&TimeStamps(i)
Next
Trace"<==GlobalDataChangeEnd"
EndSub
'獲取單個變量數(shù)據(jù)
PublicFunctionGetData(ItemNameAsString)
Trace">GetDatastart:ItemName="&ItemName
IfDll_is_Initial=FalseThen
Trace"<GetDataCancelled,BecauseDll_Initialhasnotbeencalled"
ExitFunction
EndIf
IfServerConnected=FalseThen
Trace"<GetDataCancelled,BecauseConnectServerhasnotbeencalled"
ExitFunction
EndIf
IfConfiguration_is_Set=FalseThen
Trace"<GetDataCancelled,Becauseconfigurationhasnotbeenset"
ExitFunction
EndIf
DimItemClientHandleAsLong
ItemClientHandle=AllItemsInfo.GetItem_ClientHandle(ItemName)
GetData=ItemData(ItemClientHandle)
Trace"<GetDataOK:ItemData="&GetData
EndFunction'寫入單個變量數(shù)據(jù)
PublicFunctionWriteData(ItemNameAsString,ItemWriteDataAsVariant)
Trace">WriteDatatoWinccstart..."
Trace">ItemName:"&ItemName&"Value:"&ItemWriteData
IfDll_is_Initial=FalseThen
Trace"<WriteDataCancelled,BecauseDll_Initialhasnotbeencalled"
ExitFunction
EndIf
IfServerConnected=FalseThen
Trace"<WriteDataCancelled,BecauseConnectServerhasnotbeencalled"
ExitFunction
EndIf
IfConfiguration_is_Set=FalseThen
Trace"<WriteDataCancelled,Becauseconfigurationhasnotbeenset"
ExitFunction
EndIf
OnErrorGoToErrorHandler
SetGroupObj=GroupCollection.GetOPCGroup(AllItemsInfo.GetItem_Group(ItemName))
SetItemObj=GroupObj.OPCItems.GetOPCItem(AllItemsInfo.GetItem_ServerHandle(ItemName))
ItemObj.WriteItemWriteData
Trace"<WriteDatatoWinccOK"
SetGroupObj=Nothing
SetItemObj=Nothing
ExitFunction
ErrorHandler:
Trace"<WriteDatatoWinccError,PleasemakesureItem'sNameandWrite-dataiscorrect"
SetGroupObj=Nothing
SetItemObj=Nothing
EndFunction
'列舉某個變量的屬性
PrivateFunctionGetItemProperty(ItemIDAsString)
DimCountAsLong,iAsLong
DimPropertyIDs()AsLong
DimDescriptions()AsString
DimDataTypes()AsInteger
DimPropertyValues()AsVariant
DimErrors()AsLong
ServerObj.QueryAvailablePropertiesItemID,Count,PropertyIDs,Descriptions,DataTypes
ServerObj.GetItemPropertiesItemID,Count,PropertyIDs,PropertyValues,Errors
Trace"=====GetItemIDPropertyStart======"
Fori=1ToCount
Trace"="&PropertyIDs(i)&"
"&Descriptions(i)&"
"&PropertyValues(i)
Next
Trace"=====GetItemIDPropertyEnd======"
EndFunction
'獲取某個變量的數(shù)據(jù)類型
PrivateFunctionGetItemDataType(ItemIDAsString)AsLong
DimCountAsLong
DimPropertyIDs(1)AsLong
DimPropertyValues()AsVariant
DimErrors()AsLong
Count=1
PropertyIDs(1)=1
ServerObj.GetItemPropertiesItemID,Count,PropertyIDs,PropertyValues,Errors
GetItemDataType=PropertyValues(1)
EndFunction
'效勞器關(guān)閉
PrivateSubServerObj_ServerShutDown(ByValReasonAsString)
Trace"!Dllisshutdown,FollowingistheReason:"
Trace"!"&Reason
ServerObj.Disconnect
Configuration_is_Set=False
Dll_is_Initial=False
ServerConnected=False
EndSub
'獲取效勞器連接狀態(tài)
PublicPropertyGetServer_Connected()AsBoolean
Server_Connected=Configuration_is_Set
EndPropertyItemInfo:
OptionExplicitPublicItemNameAsString
PublicGroupNameAsString
PublicItemServerHandleAsLong
PublicItemClientHandleAsLongItemsInfo:
OptionExplicitDimCollection_ItemsInfoAsNewCollection
'定義OPCItem信息PublicFunctionItemInfo_Add(NameAsString,GroupAsString,ClientHandleAsLong,ServerHandleAsLong)
DimInfoAsNewItemInfo
WithInfo
.ItemName=Name
.GroupName=Group
.ItemClientHandle=ClientHandle
.ItemServerHandle=ServerHandle
EndWith
Collection_ItemsInfo.AddInfo
EndFunction'獲取Item屬于的組名
PublicFunctionGetItem_Group(ItemIDAsString)AsString
DimInfoAsItemInfo
ForEachInfoInCollection_ItemsInfo
IfInfo.ItemName=ItemIDThen
GetItem_Group=Info.GroupName
ExitFunction
EndIf
Next
EndFunction'獲取Item的ServerHandle
PublicFunctionGetItem_ServerHandle(ItemIDAsString)AsLong
DimInfoAsItemInfo
ForEachInfoInCollection_ItemsInfo
IfInfo.ItemName=ItemIDThen
GetItem_ServerHandle=Info.ItemServerHandle
ExitFunction
EndIf
Next
EndFunction'獲取Item的ClientHandle
PublicFunctionGetItem_ClientHandle(ItemIDAsString)
DimInfoAsItemInfo
ForEachInfoInCollection_ItemsInfo
IfInfo.ItemName=ItemIDThen
GetItem_ClientHandle=Info.ItemClientHandle
ExitFunction
EndIf
Next
EndFunction'獲取Item的名稱
PublicFunctionGetItem_Name(ItemClientHandleAsLong)
DimInfoAsItemInfo
ForEachInfoInCollection_ItemsInfo
IfInfo.ItemClientHandle=ItemClientHandleThen
GetItem_Name=Info.ItemName
ExitFunction
EndIf
Next
EndFunction將以上代碼輸入VB并編譯生成OPC_DLL.dll文件,完成后注冊。OPC調(diào)用函數(shù)請參閱opcdataaccessautov2-02_76文件。四、應用介紹
1、
新建ini配置文件〔保存于系統(tǒng)目錄下〕,如wincc.ini。注意組中定義的變量名稱必須存在于OPCServer中!右邊//后的內(nèi)容僅
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)服裝定制合同采購協(xié)議
- 工程承包合同范本-屋面防水
- 快遞企業(yè)與員工勞動合同模板
- 餐飲業(yè)短期勞動合同范本
- 勞動合同范本 - 標準勞動合同
- Module 4 Unit 1 Chinese people invented paper(教學設(shè)計)-2024-2025學年外研版(一起)英語四年級上冊
- 企業(yè)培訓與發(fā)展專項集體合同
- 18《一只窩囊的大老虎》教學設(shè)計-2024-2025學年語文四年級上冊統(tǒng)編版
- 養(yǎng)殖場勞務外包合同
- 施工場地平整合作合同書樣本
- 高中英語單詞及短語匯總(北師大版)
- TTT培訓教材(-55張)課件
- 煤炭物流園區(qū)總體規(guī)劃(2016-2030)參考范本
- 道德與法治《上學路上》教案教學設(shè)計(公開課)
- XXX酒店預收款收據(jù) Deposit Receipt辦公模板
- 六郁湯-古今醫(yī)鑒卷四-方劑加減變化匯總
- 汽車公司APQP質(zhì)量門檢查表
- 數(shù)據(jù)結(jié)構(gòu)教學課件:chapter8
- 玉米雜交種制種技術(shù)匯總
- T∕ACSC 01-2022 輔助生殖醫(yī)學中心建設(shè)標準(高清最新版)
- 線性空間的定義與性質(zhì)
評論
0/150
提交評論