前些日子做个项目 用的是组态王 和罗克韦尔PLC 其先用的是组态王提供以太网驱动 出现错误 组态王答复 ; 得 买驱动 3500 元。 太贵了 后来 改为OPC通讯 现在工作良好 。这次项目过后 觉得 OPC将是未来发展趋势 。我打算用 VB编写 可是不知道opcdaauto.dll文件在那下载 。需要付费吗 ?多少银子 。方便的话 可以发给我
13332231836@126.com 电话 13332231836
/*---------------------------------------------------*
* OPC客户端BCB6调用子程序 OPCClient.h V1.5 *
*---------------------------------------------------*/
#ifndef OPC_CLIENT_CLASS
#define OPC_CLIENT_CLASS
#include <ComObj.hpp> // OleCheck
#include <atlbase.h> // CComPtr
#include <opcda_i.c> // OPC 头文件-
#include <OPCDA.h> // OPC 头文件
这是C++BUILDER 调用OPC涉及的头定义文件,
不需要自已配置 , opcdaauto.dll
也不要假想要调用哪一个.dll,因为OPC是利用DCOm技术,只要类的ID号就能调用
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 Item_Id(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位开关量输出
Item_Id(1) = "S7:[S7 connection_1]IB0"
Item_Id(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