OPC Client 动态连接库开发和应用.docx

上传人:牧羊曲112 文档编号:4886994 上传时间:2023-05-21 格式:DOCX 页数:18 大小:267.02KB
返回 下载 相关 举报
OPC Client 动态连接库开发和应用.docx_第1页
第1页 / 共18页
OPC Client 动态连接库开发和应用.docx_第2页
第2页 / 共18页
OPC Client 动态连接库开发和应用.docx_第3页
第3页 / 共18页
OPC Client 动态连接库开发和应用.docx_第4页
第4页 / 共18页
OPC Client 动态连接库开发和应用.docx_第5页
第5页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《OPC Client 动态连接库开发和应用.docx》由会员分享,可在线阅读,更多相关《OPC Client 动态连接库开发和应用.docx(18页珍藏版)》请在三一办公上搜索。

1、OPC Client动态连接库开发和应用无锡市北辰自动化技术有限公司收藏本交)查看我的收藏一、引言现在有很多工业控制产品都支持OPC Server,如西门子SIMATIC NET、WINCC、WI NAC、Protool/pro,亚控公司组态王等,这些产品本身在一些需要实现很复杂的数据模型 功能上还显得不足,由于支持了 OPC,我们就可以在VB或C+上通过OPC获取数据进 而实现较复杂的功能(如强大的数据库管理或数据分析)。本文讨论了如何在VB中开 发一个动态连接库,以方便开发者实现对OPC服务器的数据采集,将精力更多的放在界 面开发和数据处理上。二、功能设计类型设计为ActiveX Dll,

2、名称:OPC_Dll.dll,可以在VB工程引用中加载,加载后通 过创建类BCA_OPC的实例来实现OPC数据通讯,BCA_OPC的调用功能如下:1、配置初始化:Dll_Initial(strConfigFile As String) As Boolean其中strConfigFile为连接OPC服务器对应的配置文件名称(*.ini),用户建立的配置文 件应遵循一定的格式(在下面应用中说明),并且应放在系统目录下(如C:WINNT下)。 配置文件中包含了要连接的OPC服务器名称、log文件名称、变量组定义及对应组内的 变量定义(本连接库最多支持1024个变量通讯,对变量组的数目没有限制)。配置

3、成功 返回TRUE。2、连接 OPC 服务器:ConnectServer(Optional IPAddress As String) As Boolean IPAddress为可选的远程OPC服务器所属PC的IP地址,如“192.168.0.,1如果不提供I PAddress参数,则默认为本机OPC服务器。连接成功返回TRUE。3、配置通讯变量(组态 OPC 客户机):SetConfiguration() As Boolean根据提供的ini配置文件组态OPC客户机与服务器的变量通讯,组态成功返回TRUE。4、读变量数据:GetData(ItemName As String)ItemName为

4、变量名称,必须与ini配置文件中的变量名称一致。本功能返回该变量的实 际数据。5、写变量数据:WriteData(ItemName As String, ItemWriteData As Variant) ItemName为变量名称,ItemWriteData为变量数据。三、实现代码1、在VB6.0中新建ActiveX Dll工程,如下图:2、在工程菜单中添加引用,如下图:如果系统中没有OPC Automation,你需要安装注册OPC自动化。一般装了 OPC支持的 软件,系统都支持OPC自动化。3、在工程中添加模块,如下图:模块API_Function为软件所需的一些API函数。模块Glob

5、al_constants为一些系统常量类模块BCA_OPC为实现主类类模块ItemInfo和ItemsInfo实现变量信息的封装4、以下为各模块的程序代码:API_Function:Option Explicit获取一个与给定初始化文件指定域中的一个键相联系的整数值(1)Public Declare Function GetPrivateProfileInt Lib kernel32 AliasGetPrivateProfileIntA (ByVal lpApplicationName As String, ByVal lpKeyName As String, _ByVal nDefault

6、As Long, ByVal lpFileName As String) As Long从一个初始化文件中获取指定段的所有键和值(2)Public Declare Function GetPrivateProfileSection Lib kernel32 AliasGetPrivateProfileSectionA (ByVal lpAppName As String, ByVal lpReturnedString As String, _ByVal nSize As Long, ByVal lpFileName As String) As Long获取初始化文件中的制定断下的一个字符串(3

7、)Public Declare Function GetPrivateProfileString Lib kernel32 Alias _GetPrivateProfileStringA (ByVal lpApplicationName As String, ByVal lpKeyNam e As Any, _ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As L ong, ByVal IpFileName As String) As LongGlobal_constants:Option Ex

8、plicitOption Base 1Global constrantsGlobal Const English = &H409Global Const OPC_DS_CACHE = 1Global Const OPC_DS_DEVICE = 2BCA_OPC:Option ExplicitOption Base 1 Interface Objects 接口对象必须使用 WithEvents来申明对象OPCServer和OPCGroup,WithEvents指定申明的对象用于处理对象的事件Dim WithEvents ServerObj As OPCServer 定义 OPCServerDim

9、 GroupObj As OPCGroup定义 OPCGroupDim WithEvents GroupCollection As OPCGroups 定义 OPCGroupsDim ItemCollection As OPCItems 定义 OPCItemsDim ItemObj As OPCItem定义 OPCItemGlobal Variables 全局变量Dim ServerName As String OPC 服务器名称Dim ServerConnected As Boolean OPC 服务器已连接标志OPCServer 和 OPCGroup 都有 ServerHandle 和 C

10、lientHandle 参数;ServerHandle用于OPC服务器定位;ClientHandle用于OPC客户端定位;服务器-组句柄(索引)服务器-条目句柄客户机-组句柄客户机-条目句柄DLL初始化Dim ServerGroupHandle() As LongDim ServerItemHandle() As LongDim ClientGroupHandle() As LongDim ClientItemHandle() As LongDim Dll_is_Initial As BooleanDim Configuration is Set As Boolean 是否已组态Dim Tra

11、ceOn As BooleanDim TraceFile As StringDim ConfigFile As StringDim ItemData(1024) As Variant跟踪开关跟踪文件组态文件读取变量数据的储存地址Dim AllItemsInfo As New ItemsInfo log文件记录操作Private Function Trace(TraceMsg As String)If TraceOn = True ThenDim fs As Object, f As ObjectDim mHour, mMinute, mSecond, mMSecond As StringSet

12、 fs = CreateObject(Scripting.FileSystemObject)Set f = 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.Write

13、line & mHour & : & mMinute & : & mSecond & . & mMSeco nd & & TraceMsgf.CloseSet fs = NothingSet f = NothingEnd IfEnd Function (l)DLL初始化Public Function Dll_Initial(strConfigFile As String) As BooleanDim Result As String * 255, fs As Object, f As ObjectConfigFile = strConfigFileGetPrivateProfileString

14、 TRACE, TraceOn, _ ERROR, Result, 255, ConfigFileIf Result ERROR ThenIf Result = 1 ThenGetPrivateProfileString TRACE, TraceFile, _ERROR, Result, 255, ConfigFileIf Result ERROR ThenTraceFile = ResultElseTraceFile = App.Path & Trace.logEnd IfSet fs = CreateObject(Scripting.FileSystemObject)Set f = fs.

15、CreateTextFile(TraceFile, True)f.Writeline (* BCA_OPC Trace Started , BeiChen Automation 2003 / ZhangPeng *)f.CloseTraceOn = TrueElseTraceOn = FalseEnd IfDll_is_Initial = TrueDll_Initial = TrueTrace Dll_InitialTrace ConnectServerIf Dll_is_Initial = False ThenTrace ConnectServer Cancelled,Because Dll

16、_Initial has not been calledExit FunctionEnd IfIf Not ServerConnected ThenServerName = GetServerNameOn Error GoTo ErrorHandlerSet ServerObj = New OPCServerServerObj.Connect ServerName, IPAddressServerConnected = TrueTrace ConnectServer OKElseTrace Server has been connected,Please do not connect it a

17、gainEnd IfConnectServer = ServerConnectedExit FunctionErrorHandler:Trace SetConfiguration start.If Dll_is_Initial = False ThenTrace SetConfiguration Cancelled,Because Dll_Initial has not been calledExit FunctionEnd IfIf ServerConnected = False ThenTrace SetConfiguration Cancelled,Because ConnectServ

18、er has not been calledExit FunctionEnd IfIf Configuration_is_Set = True ThenTrace SetConfiguration Cancelled,Because configuration has been setExit FunctionEnd IfBegin to configureDim f_ret As Long, ReturnedString As String * 1024, Valid_ReturnedString As Strin gDim ReturnedString1 As String * 1024,

19、 Valid_ReturnedString1 As StringDim Space_pos As Integer, GroupName As StringDim Space_pos1, Equal_pos As Integer, ItemName As String, ItemIndex As LongDim NumItems As Long, ItemIDs(1) As String, ClientHandles(1) As Long, Serverha ndles() As LongDim Errors() As LongReturnedString =ReturnedString1 =O

20、n Error GoTo ErrorHandlerSet GroupCollection = ServerObj.OPCGroupsGroupCollection.DefaultGroupIsActive = Falsef_ret = GetPrivateProfileSection(GROUP”, ReturnedString, 1024, ConfigFile)Valid_ReturnedString = Left(ReturnedString, f_ret + 1)Do Until InStr(Valid_ReturnedString, Chr(0) 0Space_pos = InStr

21、(Valid_ReturnedString, Chr(0)GroupName = Left(Valid_ReturnedString, Space_pos - 1)If GroupName = ThenGoTo nxt3End IfSet GroupObj = GroupCollection.Add(GroupName)GroupObj.IsSubscribed = FalseTrace Add group: & GroupName & OKSet ItemCollection = GroupObj.OPCItemsItemCollection.DefaultIsActive = Truef_

22、ret = GetPrivateProfileSection(GroupName, ReturnedString1, 1024, ConfigFile)Valid_ReturnedString1 = Left(ReturnedString1, f_ret + 1)Do Until InStr(Valid_ReturnedString1, Chr(0) 0 Or InStr(ItemName, IsSubscribed) 0 ThenGoTo nxt1End IfItemCollection.DefaultRequestedDataType = GetItemDataType(ItemName)

23、ItemIndex = ItemIndex + 1NumItems = 1ItemIDs(1) = ItemNameClientHandles(1) = ItemIndexItemCollection.AddItems NumItems, ItemIDs, ClientHandles, Serverhandles, Err orsAllItemsInfo.ItemInfo_Add ItemName, GroupName, ItemIndex, Serverhandles nxtl:Valid_ReturnedString1 = Mid(Valid_ReturnedString1, Space_

24、pos1 + 1)Loopnxt2:f_ret = GetPrivateProfileInt(GroupName, UpdateRate”, 0, ConfigFile)GroupObj.UpdateRate = f_retTrace Set group: & GroupName & UpdateRate= & f_ret & OK f_ret = GetPrivateProfileInt(GroupName, IsSubscribed, 0, ConfigFile) GroupObj.IsSubscribed = IIf(f_ret = 1, True, False) GroupObj.Is

25、Active = TrueTrace Set group: & GroupName & IsSubscribed= & f_ret & OK Valid_ReturnedString = Mid(Valid_ReturnedString, Space_pos + 1) Set GroupObj = NothingSet ItemCollection = NothingLoopnxt3: Trace SetConfiguration endConfiguration_is_Set = TrueSetConfiguration = TrueExit FunctionErrorHandler:Tra

26、ce SetConfiguration Error,Please be sure that config file is correct Configuration_is_Set = FalseEnd Function获取服务器名称Private Function GetServerName() As StringDim Result As String * 255GetPrivateProfileString SERVER, Server, _ERROR, Result, 255, ConfigFileGetServerName = RemoveSpaces(Result)End Funct

27、ion获取服务器连接状态Private Function GetConnectStatus() As Boolean GetConnectStatus = ServerConnectedEnd Function功能块:移除空格Private Function RemoveSpaces(Item As String) As StringDim Result As StringDim i As Integeri = 1While (Mid$(Item, i, 1) Chr(0)Result = Result & Mid$(Item, i, 1)i = i + 1WendRemoveSpaces =

28、 ResultEnd FunctionPrivate Sub Class_Initialize()Configuration_is_Set = FalseDll_is_Initial = FalseServerConnected = FalseEnd SubDLL终止Private Sub Class_Terminate()Set ServerObj = Nothing 释放 ServerObjSet GroupCollection = Nothing 释放 GroupCollectionSet ItemCollection = Nothing 释放 ItemCollectionServerC

29、onnected = FalseDll_is_Initial = FalseConfiguration_is_Set = FalseTrace Dll is terminateEnd Sub全局数据改变Private Sub GroupCollection_GlobalDataChange(ByVal TransactionID As Long, ByVal GroupHandle As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValu es() As Variant, Qualities() As Long, Ti

30、meStamps() As Date)Dim i As Integer, GroupName As String, ItemName As StringTrace = GlobalDataChange!Following is the data:GroupName = GroupCollection.GetOPCGroup(GroupHandle).NameTrace = GroupName: & GroupName & Number of Items: & NumItemsFor i = 1 To NumItemsItemData(ClientHandles(i) = ItemValues(

31、i)Trace = Items Name: & AllItemsInfo.GetItem Name(ClientHandles(i) & Values: & ItemValues(i) & Changed Data: & TimeStamps(i)NextTrace GetData start:ItemName= & ItemNameIf Dll_is_Initial = False ThenTrace GetData Cancelled,Because Dll_Initial has not been calledExit FunctionEnd IfIf ServerConnected =

32、 False ThenTrace GetData Cancelled,Because ConnectServer has not been calledExit FunctionEnd IfIf Configuration_is_Set = False ThenTrace GetData Cancelled,Because configuration has not been setExit FunctionEnd IfDim ItemClientHandle As LongItemClientHandle = AllItemsInfo.GetItem_ClientHandle(ItemNam

33、e)GetData = ItemData(ItemClientHandle)Trace WriteData to Wincc start.Trace ItemName: & ItemName & Value: & ItemWriteDataIf Dll_is_Initial = False ThenTrace WriteData Cancelled,Because Dll_Initial has not been calledExit FunctionEnd IfIf ServerConnected = False ThenTrace WriteData Cancelled,Because C

34、onnectServer has not been calledExit FunctionEnd IfIf Configuration_is_Set = False ThenTrace WriteData Cancelled,Because configuration has not been setExit FunctionEnd IfOn Error GoTo ErrorHandlerSet GroupObj = GroupCollection.GetOPCGroup(AllItemsInfo.GetItem_Group(ItemNam e)Set ItemObj = GroupObj.O

35、PCItems.GetOPCItem(AllItemsInfo.GetItem_ServerHandle(It emName)ItemObj.Write ItemWriteDataTrace WriteData to Wincc OKSet GroupObj = NothingSet ItemObj = NothingExit FunctionErrorHandler:Trace Write Data to Wincc Error,Please make sure Items Name and Write-data is correctSet GroupObj = NothingSet Ite

36、mObj = NothingEnd Function列举某个变量的属性Private Function GetItemProperty(ItemID As String)Dim Count As Long, i As LongDim PropertyIDs() As LongDim Descriptions() As StringDim DataTypes() As IntegerDim PropertyValues() As VariantDim Errors() As LongServerObj.QueryAvailableProperties ItemID, Count, Propert

37、yIDs, Descriptions, DataTy pesServerObj.GetItemProperties ItemID, Count, PropertyIDs, PropertyValues, ErrorsTrace =Get ItemID Property Start=For i = 1 To CountTrace = & PropertyIDs(i) & & Descriptions(i) & & PropertyValues NextTrace =Get ItemID Property End=End Function获取某个变量的数据类型Private Function Ge

38、tItemDataType(ItemID As String) As LongDim Count As LongDim PropertyIDs(1) As LongDim PropertyValues() As VariantDim Errors() As LongCount = 1PropertyIDs(1) = 1ServerObj.GetItemProperties ItemID, Count, PropertyIDs, PropertyValues, ErrorsGetItemDataType = PropertyValues(1)End Function服务器关闭Private Su

39、b ServerObj_ServerShutDown(ByVal Reason As String)Trace ! Dll is shutdown,Following is the Reason:Trace ! & ReasonServerObj.DisconnectConfiguration_is_Set = FalseDll_is_Initial = FalseServerConnected = FalseEnd Sub获取服务器连接状态Public Property Get Server_Connected() As BooleanServer_Connected = Configura

40、tion_is_SetEnd PropertyItemInfo:Option ExplicitPublic ItemName As StringPublic GroupName As StringPublic ItemServerHandle As LongPublic ItemClientHandle As LongItemsInfo:Option ExplicitDim Collection_ItemsInfo As New Collection 定义 OPCItem 信息Public Function ItemInfo_Add(Name As String, Group As Strin

41、g, ClientHandle As Lon g, ServerHandle As Long)Dim Info As New ItemInfoWith Info,ItemName = Name.GroupName = Group.ItemClientHandle = ClientHandle.ItemServerHandle = ServerHandleEnd WithCollection_ItemsInfo.Add InfoEnd Function获取Item属于的组名Public Function GetItem_Group(ItemID As String) As StringDim I

42、nfo As ItemInfoFor Each Info In Collection_ItemsInfoIf Info.ItemName = ItemID ThenGetItem_Group = Info.GroupNameExit FunctionEnd IfNextEnd Function获取 Item 的 ServerHandlePublic Function GetItem_ServerHandle(ItemID As String) As LongDim Info As ItemInfoFor Each Info In Collection_ItemsInfoIf Info.Item

43、Name = ItemID ThenGetItem_ServerHandle = Info.ItemServerHandleExit FunctionEnd IfNextEnd Function获取 Item 的 ClientHandlePublic Function GetItem ClientHandle(ItemID As String)Dim Info As ItemInfoFor Each Info In Collection_ItemsInfoIf Info.ItemName = ItemID ThenGetItem_ClientHandle = Info.ItemClientHandleExit FunctionEnd IfNextEnd Function获取Item的名称Public Function GetItem_Name(ItemClientHandle As Long)Dim Info As ItemInfo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号