马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
2.3 编写OPC客户端应用程序 VB简单实用,是比较理想的OPC应用程序快速开发工具,若要用VB开发OPC应用程序,必须要使用OPC自动化包装器,这在前文已经提过,这种包装器一般由OPC服务器的供应商以DLL形式提供,下面就以SIEMENS提供的sopcdaauto.dll为例,介绍如何开发OPC应用程序,这也正是笔者在最近的工程中实际应用到的,这是基于DA2.0的版本。 首先,新建VB工程后,作图四所示的引用:
2.3.1 建立OPC对象
- 首先申明OPC对象:
- Option Base 1
- Dim WithEvents ServerObj As OPCServer 'OPC Server对象,连接OPC服务器
- Dim GroupsObj As OPCGroups 'OPC Groups对象,添加OPC组
- Dim WithEvents GroupObj As OPCGroup 'OPC Group对象
- Dim ItemsObj As OPCItems 'OPC Item集合
- Dim ServerHandles() As Long '服务器端OPC Item的句柄
- Dim ClientHandles() as Long '客户端OPC Item的句柄
- Dim ItemId(2) As String
- Dim Errors() As Long
- 接下来,生成各个对象:
- If ServerObj Is Nothing Then Set ServerObj = New OPCServer
- '连接OPC服务器
- If ServerObj.ServerState = OPCDisconnected Then
- ServerObj.Connect ("OPC.SimaticNET") '假设OPC服务器运行在本机
- End If
- If GroupsObj Is Nothing Then Set GroupsObj = ServerObj.OPCGroups
- If GroupObj Is Nothing Then Set GroupObj = GroupsObj.Add
- If ItemsObj Is Nothing Then Set ItemsObj = GroupObj.OPCItems
- GroupObj.IsActive = True '设置组为活动状态
- '假设有两个数据源,一个是8位开关量输入,一个是8位开关量输出
- ItemId(1) = "S7:[S7 connection_1]IB0"
- ItemId(2) = "S7:[S7 connection_1]QB0"
- ClientHandles(1) = 1
- ClientHandles(2) = 2
- '添加组项目,ServerHandles数组的值为各个OPC Item的服务器句柄,
- ' ClientHandles数组的值为各个OPC Item的客户端句柄,由应用程序设定
- Call ItemsObj.AddItems(2, ItemId, ClientHandles, ServerHandles, Errors)
-
- 2.3.2异步数据读取
- ' OPC Item的服务器句柄,添加OPC Item时由服务器分配
- Dim TempServerHandles(1) As Long
- '事务标志符,由客户端产生,它包含的信息提供给OnReadComplete事件
- Dim TransactionID As Long
- '取消标志符,服务器端产生,用于操作需要被取消的时候
- Dim CancelID As Long
- '包含读取每个OPC Item时返回的信息
- Dim ErrorNr() As Long
- TempServerHandles(1) = ServerHandles(1) '对应第一个OPC Item
- GroupObj.AsyncRead 1, TempServerHandles, ErrorNr, TransactionID, CancelID
- 第一个参数是要读的OPC Item的个数,这里只含有一个OPC Item。读取的结果由OPC服务器通过IconnectionPointContainer接口配合IOPCDataCallback接口反调用应用程序的事务处理程序:
- Private Sub GroupObj_AsyncReadComplete(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date, Errors() As Long)
- 这里的参数ClientHandles和AddItems方法中的ClientHandles是对应的,用于判断哪一个OPC Item在被读取。其它参数的说明如下:
- TransactionID:客户端自由使用,应用程序开发商自定义;
- NumItems:表示读取的OPC Item的个数;
- ItemValues():各个OPC Item连接的数据源的值,类型为Variant;
- Qualities():OPC Item的品质值;
- TimeStamps():时间戳;
- Errors():记录服务器返回的信息。
- 2.3.3 异步数据写入
- Dim TempServerHandles (1) As Long
- Dim VValue(1) As Variant
- Dim ErrorNr() As Long
- Dim TransactionID As Long
- Dim CancelID As Long
- TempServerHandles(1)=ServerHandles(2)
- VValue(1)=1'假设要将“1”写入ClientHandle为2的OPC Item
- GroupObj.AsyncWrite 1,TempServerHandles,VValue, ErrorNr, TransactionID, CancelID
-
- 同样,AsyncWrite也对应一个事务处理程序:
- Private Sub groupObj_AsyncWriteComplete(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, Errors() As Long)
- 它的参数的含义和AsuncReadComplete中的含义是类似的,这里一般需要处理的是写数据之后的返回状态,这里不再赘述。
- 2.3.4断开与服务器的连接
- ItemsObj.Remove ItemsObj.Count,ServerHandles, Errors '清除OPC Item
- Set ItemsObj = Nothing '释放资源,下同
- If Not GroupObj Is Nothing Then
- GroupsObj.Remove GroupObj.ServerHandle '删除组
- End If
- If Not GroupsObj Is Nothing Then
- Set GroupsObj = Nothing
- End If
- If Not ServerObj Is Nothing Then
- If ServerObj.ServerState <> OPCDisconnected Then
- ServerObj.Disconnect '断开与服务器的连接
- End If
- Set ServerObj = Nothing
- End If
复制代码
|