VBA中操作OPC

部署运行你感兴趣的模型镜像

'Author     :warrior
'Date       :2009-6-01
'Description:OPC Data Access Class
'Version    :1.0
'=========================================================

Private Node As String
Private ProgId As String
Public OPCDAServer As OPCAutomation.OPCServer
Private Const sleepingTime = 500
Private Const retryTimesWriteItem = 7

'API function
Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)


Public Function InitialConfig()
If Node = "" Then
    Node = Application.Range(BcpcConst.Node).Cells.Value        //Computer Name
    ProgId = Application.Range(BcpcConst.ProgId).Cells.Value   //Yokogawa.ExaopcDACS1.1
End If
End Function

Public Function ConnectionOPC()
Call InitialConfig
Set OPCDAServer = New OPCAutomation.OPCServer
    Call OPCDAServer.Connect(ProgId, Node)
    If Err.Number <> 0 Then
       MsgBox "Connect OPC error,description:" & Err.Description, vbOKOnly, "Error Prmpt"
       Exit Function
    End If
End Function

Public Function DisconnectOPC()

If OPCDAServer.ServerState = OPCAutomation.OPCServerState.OPCRunning Then
    Call OPCDAServer.Disconnect
    Set OPCDAServer = Nothing
End If

End Function

'Write a value to OPC
'=================================
Public Function WriteValueToDCS(ByVal groupName As String, ByRef itemPath() As String, ByRef strValue() As String) As Boolean
   On Error GoTo Error_Hander
   Call ConnectionOPC
   Dim oneOpcGroup As OPCAutomation.OPCGroup
   Set oneOpcGroup = OPCDAServer.OPCGroups.Add(groupName)
   Dim oneOpcItem(1) As OPCItem
   Set oneOpcItem(0) = oneOpcGroup.opcItems.AddItem(itemPath(0), 1)
   oneOpcItem(0).Write (strValue(0))
   WriteValueToDCS = True
   Call DisconnectOPC
   Exit Function
Error_Hander:
   WriteValueToDCS = False
   Call DisconnectOPC
End Function

'Read a item from OPC
'=============================
Public Function ReadValueFromDCS(ByVal groupName As String, ByVal itemPath As String) As String
Dim oneOpcGroup As OPCAutomation.OPCGroup
Dim oneOpcItem As OPCAutomation.OPCItem

Dim returnValue As Variant
Dim myValue As Variant
Dim myQuality, myTimeStamp As Variant
On Error Resume Next
If OPCDAServer Is Nothing Then
   Exit Function
End If

If OPCDAServer.ServerState = OPCAutomation.OPCServerState.OPCRunning Then
    Set oneOpcGroup = OPCDAServer.OPCGroups.Add(groupName)
    Set oneOpcItem = oneOpcGroup.opcItems.AddItem(itemPath, 1)
    If Err.Number <> 0 Then
       ReadValueFromDCS = ""
       GoTo EXIT_FUNCTION
    End If
    oneOpcItem.Read OPCDevice, myValue, myQuality, myTimeStamp
    If IsNull(myValue) Then
       ReadValueFromDCS = ""
    Else
       ReadValueFromDCS = CStr(myValue)
    End If
    Call OPCDAServer.OPCGroups.RemoveAll
    Set newGroup = Nothing
    Set oneOpcItem = Nothing
End If
EXIT_FUNCTION:
    Set oneOpcGroup = Nothing
    Set oneOpcItem = Nothing
    Exit Function
End Function
'Read a array from OPC
'Remind,ServerHdls start index is 1
'ItemPath index from 1 to begin
'==================================
Public Function ReadValueFromDCSEx(ByRef itemPath() As String) As Variant()
    Dim iLoopCounter As Long
    Dim lBufferSize As Long
    Dim ServerHdls() As Long
    Dim ClientHdls() As Long
    Dim AccessError() As Long
    Dim valueVariant() As Variant
    Dim MyOPCGroup As OPCAutomation.OPCGroup
    OPCAccessBL.ConnectionOPC
    If OPCDAServer.ServerState = OPCAutomation.OPCServerState.OPCRunning Then
    Set MyOPCGroup = OPCDAServer.OPCGroups.Add()
        MyOPCGroup.IsActive = False
    lBufferSize = UBound(itemPath)
    ReDim ServerHdls(lBufferSize), ClientHdls(lBufferSize)
    For iLoopCounter = 1 To UBound(itemPath)
        ClientHdls(iLoopCounter) = iLoopCounter
    Next
    Call MyOPCGroup.opcItems.AddItems(lBufferSize, itemPath, ClientHdls, ServerHdls, AccessError)
    Call MyOPCGroup.SyncRead(0, lBufferSize, ServerHdls, valueVariant, AccessError)
    ReadValueFromDCSEx = valueVariant()
    Call MyOPCGroup.opcItems.Remove(lBufferSize, ServerHdls, AccessError)
    Call OPCDAServer.OPCGroups.RemoveAll
    Set MyOPCGroup = Nothing
    OPCAccessBL.DisconnectOPC
End If
End Function

'Write a arry to OPC
'==============================
Public Function WriteValueToDCSEx(ByRef itemPath() As String, ByRef itemValue() As Variant) As Integer

    Dim iLoopCounter As Long
    Dim lBufferSize As Long
    Dim ServerHdls() As Long
    Dim ClientHdls() As Long
    Dim AccessError() As Long
    Dim valueVariant() As Variant
   
    On Error GoTo Error_Hander
    Dim MyOPCGroup As OPCAutomation.OPCGroup
    OPCAccessBL.ConnectionOPC
    If OPCDAServer.ServerState = OPCAutomation.OPCServerState.OPCRunning Then
    Set MyOPCGroup = OPCDAServer.OPCGroups.Add()
        MyOPCGroup.IsActive = False
    lBufferSize = UBound(itemPath)
    ReDim ServerHdls(lBufferSize), ClientHdls(lBufferSize)
    For iLoopCounter = 1 To UBound(itemPath)
        ClientHdls(iLoopCounter) = iLoopCounter
    Next
    Call MyOPCGroup.opcItems.AddItems(lBufferSize, itemPath, ClientHdls, ServerHdls, AccessError)
    Call MyOPCGroup.SyncWrite(lBufferSize, ServerHdls, itemValue, AccessError)
    Call MyOPCGroup.opcItems.Remove(lBufferSize, ServerHdls, AccessError)
    Call OPCDAServer.OPCGroups.RemoveAll
    Set MyOPCGroup = Nothing
    OPCAccessBL.DisconnectOPC
    WriteValueToDCSEx = 1
    Exit Function
   
Error_Hander:
    WriteValueToDCSEx = -1
End If
End Function

您可能感兴趣的与本文相关的镜像

Wan2.2-I2V-A14B

Wan2.2-I2V-A14B

图生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值