找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
小程序查看
手机扫码追踪该问题
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
Private MyOPCServer As OPCServer ' 建立OPC服务器对象
Private MyGroups As OPCGroups ' 建立OPC组集合对象
Private WithEvents MyGroup As OPCGroup ' 建立OPC组对象,WithEvents 可以响应MyGroup事件
Private MyItems As OPCItems ' 建立OPC标签集合对象
Private MyItemServerHandles() As Long ' 建立OPC服务器返回OPC标签的服务器句柄
Dim MyTID As Long ‘OPC事务标识符,用于异步数据访问
本人最近也在研究学习用VB开发OPC客户端程序,可以将我的一些程序和思想跟你一起分享,大家一起进步吧!
MyOPCServer.Connect ServerName,
NodeName
Set MyOPCGroupColl =
MyOPCServer.OPCGroups
MyOPCGroupColl.DefaultGroupIsActive =
True
Set MyOPCGroup =
MyOPCGroupColl.Add(GroupName)
Set MyOPCItemColl = MyOPCGroup.OPCItems
进行OPC标签连接
For i = 1 To Num
ClientHandlesl(i) = i
ItemIDs(i) = "DBB" + CStr(i - 1)
初始化OPC连接
MyOPCItemColl.AddItems Num,ItemIDs, ClientHandlesl,ServerHandles,
Errors
Next i
MyOPCGroup.IsSubscribed = True
StatusBar1.Panels(2).Text ="通讯正常"
Exit Sub
ErrorHandler:
StatusBar1.Panels(2).Text = "通讯断开"+ Err.Description
End Sub
3)OPC的标签读取
对OPC标签的读通过MyOPCGroup组的DataChange事件来读取。该事件有多个参数:其中NumItems是指标签改变值的个数,ClientHandles是改变值的标签索引,ItemValues为改变值的数据,即ClientHandles(i)的值是其对应的标签数组的索引,其所对应的OPC标签的值在ItemValues (i)中。刚连接上时,该事件会把所有要求访问的OPC标签值全部读取过来。此后只有数据发生变化时才会触发该事件,也只会传输发生了变化的数据,没有变化的数据则不会出现在本事件的ItemValues中。
Private Sub
MyOPCGroup_DataChange(ByVal
TransactionID As Long, ByVal NumItems AsLong, ClientHandles() As Long,ItemValues() As Variant, Qualities() AsLong, TimeStamps() As Date)
Dim i As Long
Dim j As Integer
Dim c(1 To Num) As Variant
For i = 1 To NumItems / Num
ItemIDsValue(ClientHandles(i)) =ItemValues(i)
c(ClientHandles(i))=
ItemIDsValue(ClientHandles(i))
Next i
End Sub
4)OPC连接断开
OPC客户端连接后要占用服务器资源,所以如果不需要使用OPC时,必须进行OPC连接断开,释放资源。
Private Sub StopClient()
On Error Resume Next
释放组和服务器对象
MyOPCGroupColl.RemoveAll
与服务器断开连接并且清除
MyOPCServer.Disconnect
Set MyOPCItemColl = Nothing
Set MyOPCGroup = Nothing
Set MyOPCGroupColl = Nothing
Set MyOPCServer = Nothing
End Sub
当OPC服务器由于某种原因关闭时会触发ServerShutDown事件。该事件被触发时也要进行OPC连接断开,释放资源。
Private Sub MyOPCServer_ServerShutDown(ByVal Reason As String)
StopClient
StatusBar1.Panels(2).Text = "通讯断
开" + Err.Description
End Sub
例子2:
一个OPC通讯的代码
Option Explicit
Option Base 1
Const ServerName = "OPCServer.WinCC"
Const nodename = "computer"
Private objServer As OPCServer //定义OPC服务器
Private objGroup As OPCGroup //定义OPC 服务器中的组
Private objGroups As OPCGroups
Private objItems As OPCItems //定义OPC 服务器中的项目名
Dim StrItemIDs(10) As String
Dim ClientHandles(6) As Long
Dim Serverhandles() As Long
Dim i As Integer
Dim DataType(1000) As Integer
Dim errors() As Long
Dim accpath(1000) As String
Private Sub Form_Load() //VB初始页面程序
Set objServer = New OPCServer
objServer.Connect ServerName, nodename //连接服务器,设定OPC 服务器的地址
Set objGroups = objServer.OPCGroups
Set objGroup = objGroups.Add("huangjie") //连接组
Dim i As Integer
For i = 1 To 3
StrItemIDs(i) = Text1(i).Text //连接变量
ClientHandles(i) = i
Next
DataType(1) = vbVString
DataType(2) = vbVString
DataType(3) = vbVString
accpath(1) = ""
accpath(2) = ""
accpath(3) = ""
Set objItems = objGroup.OPCItems
objItems.AddItems 3, StrItemIDs, ClientHandles, Serverhandles, errors, DataType, accpath
MsgBox "ok"
End Sub
Private Sub Command1_Click() //读WinCC 中变量 读按钮
Dim plcVal() As Variant
Call objGroup.SyncRead(OPCCache, 3, Serverhandles, plcVal, errors)
Text1(0).Text = plcVal(1)
Text2.Text = plcVal(2)
Text3.Text = plcVal(3)
End Sub
Private Sub Command2_Click() // //写WinCC 中变量 写按钮
Dim plcVal(3) As Variant
plcVal(1) = Text1(0).Text
plcVal(2) = Text2.Text
plcVal(3) = Text3.Text
objGroup.SyncWrite 3, Serverhandles, plcVal, errors
End Sub
例子3:
VB读写WINCC变量
直接调用WINCC的组件进行标签的读写操作.这样可以省去很多事,不用使用OPC了,自己想把什么写到组态里,从组态里读出来数据都非常的方便
读写函数如下
Private Sub Command1_Click()
Dim prtrun
Dim tag0
Dim WinCC As Object '定义wincc为对象
Set WinCC = CreateObject("WinCC-Runtime-Project")
prtrun = WinCC.SetValue("NewTag_1", Text1(0).Text)
prtrun = WinCC.SetValue("NewTag_2", Text1(1).Text)
prtrun = WinCC.SetValue("NewTag_3", Text1(2).Text)
prtrun = WinCC.SetValue("NewTag_4", Text1(3).Text)
prtrun = WinCC.SetValue("NewTag_5", Text1(4).Text)
prtrun = WinCC.SetValue("NewTag_6", Text1(5).Text)
prtrun = WinCC.SetValue("NewTag_7", Text1(6).Text)
prtrun = WinCC.SetValue("NewTag_8", Text1(7).Text)
'先写入一个值,再读回它,判断有没有写进去,由此来判断WINCC是不是在运行之中
prtrun = WinCC.GetValue("NewTag_1")
If prtrun = 111 Then
MsgBox ("与WinCC通讯成功!")
Set WinCC = Nothing
Else
MsgBox ("与WinCC通讯失败!请将WinCC设置为运行状态!")
Set WinCC = Nothing
End If
End Sub
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
找答案微信小程序
提问
搜索
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!