• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    用VB編寫OPC客戶端訪問WINCC

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 191次 | 進入軟件測試論壇討論

    領測軟件測試網 OPC是一個工業標準,它是由一些世界上著名的自動化系統和硬件、軟件公司和Microsoft(微軟)緊密合作而建立的!睴代表OLE(對象鏈接和嵌入),P (process過程),C (control控制)。OLE已從面向對象重新定義為基于對象并更名為Active X〕。

    WinCC是西門子公司在自動化領域采用最先進的技術與微軟公司在共同開發的居于世界領先地位的工控軟件。WinCC即WINDOWS CONTROL CENTER(視窗控制中心)。WinCC是一個功能強大的全面開放的監控系統,既可以用來完成小規模的簡單的過程監控應用,也可以用來完成復雜的應用。在任何情況下WinCC都可以生成漂亮而便捷的人機對話接口,使操作員能夠清晰地管理和優化生產過程。它集成的OPC(OLE for process control)服務器使得過程數據可由其它應用程序(OPC客戶機)訪問。

    WinCC在安裝時提供了OPC的客戶端控件: Siemens OPC DAAutomation 2.0( SOPCDAAuto.dll),這個控件就是我們在VB中要用到的控件,我們也可以使用通用的OPC客戶端控件: OPC Automation 2.0.

    在WINCC的幫助中,有Siemens OPC DAAutomation 2.0使用的簡略幫助,但說得不很詳細,我在使用中碰到不少問題,現一并寫出來,與大家共享。

    一、OPC的連接
       先在“引用”將近 Siemens OPC DAAutomation 2.0加入,然后開始定義全局變量。在本程序中,我使用了兩個OPC組進行OPC訪問,所以定義了全局變量。我們要首先定義OPC服務類型與計算機結點名。定義OPC組與OPC標簽組。并定義OPC的標簽數組與值數,注意,值數組一定要設為Variant。

    'OPC處理:只對WINCC

    Const ServerName = "OPCServer.WinCC"                 ‘OPC的類型

    Const NodeName = "GUK"                                       ‘結點名,即計算機名

    ‘Dim NodeName As String

    Dim WithEvents MyOPCServer As OPCServer           ‘OPC服務     

    Dim MyOPCGroupColl As OPCGroups                  ‘

    Dim WithEvents MyOPCGroupOut As OPCGroup      ‘OPC組,本程序用兩個組進行OPC連接

    Dim WithEvents MyOPCGroupIn As OPCGroup

    Dim MyOPCItemCollIn As OPCItems                       ‘OPC標簽組

    Dim MyOPCItemCollOut As OPCItems

    Dim ServerHandlesIn() As Long                                ‘句柄

    Dim ServerHandlesOut() As Long

    Dim ErrorsIn() As Long                                           ‘錯誤句柄

    Dim ErrorsOut() As Long

    Dim WatchDataReadItem(100) As String        '記錄OPC的標簽

    Dim WatchDataReadValue(100) As Variant      '存放OPC的值



    Dim WatchDataWriteItem(100) As String       '記錄OPC的標簽

    Dim WatchDataWriteValue(100) As Variant     '存放OPC的值

       

      在定義所有變量后,我們就要進行OPC連接了,要進行OPC連接之前,先要配置要訪問的OPC標簽名,我們WatchDataReadItem、WatchDataWriteItem中加入相應的標簽名,注意:這兩個數組必須由1開始,不能由0開始。

       配置好標簽后就要進行OPC連接了。如下面子程序:

    1、  ClientHandles1先配置名柄索引,這將在讀取OPC標簽的值時可要用到

    2、  生成OPC對象,

    3、  進行OPC標簽連接

       至此:OPC連接就成功了,我們可以對OPC進行讀與寫的操作了。

    '---------------------------------------------------------------------

    ' Sub StartClient()

    ' 目的:連接至OPC_server,創建組和添加條目

    '---------------------------------------------------------------------

    Private Sub StartClient()

        Dim ItemNum As Integer

        Dim TarnscationID As Long

        Dim CanceID As Long

        Dim ClientHandles1(100) As Long

        Dim ii As Integer

        

    On Error GoTo HANDLEeRROR

        For ii = 0 To 100

            ClientHandles1(ii) = ii                   先配置名柄索引,這將在讀取OPC標簽的值時可要用到             

        Next ii



        TarnscationID = 1

    ‘    NodeName = xProfile.GetValue("SYSTEM", "NodeName")

        

        ‘生成OPC對象,

        Set MyOPCServer = New OPCServer

        MyOPCServer.Connect ServerName, NodeName

        Set MyOPCGroupColl = MyOPCServer.OPCGroups

        MyOPCGroupColl.DefaultGroupIsActive = True

        Set MyOPCGroupIn = MyOPCGroupColl.Add("MYGROUPIN")

        Set MyOPCGroupOut = MyOPCGroupColl.Add("MYGROUPOUT")

        Set MyOPCItemCollIn = MyOPCGroupIn.OPCItems

        Set MyOPCItemCollOut = MyOPCGroupOut.OPCItems

        

        ‘進行OPC標簽連接

        If WriteItemIdex > 0 Then

        MyOPCItemCollOut.AddItems WriteItemIdex, WatchDataWriteItem, ClientHandles1, ServerHandlesOut, ErrorsOut         '初始化OCP連接

        MyOPCGroupOut.IsSubscribed = True

        End If

        

        If ReadItemIdex > 0 Then

        MyOPCItemCollIn.AddItems ReadItemIdex, WatchDataReadItem, ClientHandles1, ServerHandlesIn, ErrorsIn        '初始化OCP連接

        MyOPCGroupIn.IsSubscribed = True

    End If



        Exit Sub

    HANDLEeRROR:

        needOPCRestart = True

        xLog1.log "OPCl連接發生錯誤"

    End Sub

    二、OPC的標簽讀寫
    對OPC標簽的讀可以通過MyOPCGroupIn組與MyOPCGroupOut的DataChange事件來讀取。該事件有多個參數:其中NumItems是指標簽改變值的個數,ClientHandles是改變值的標簽索引,ItemValues為改變值的數據,具體的意思是ClientHandles(1)的值是其對應的標簽數組的索引,其所指的OPC標簽的值在ItemValues(1)中。一般來說,剛連接上時,該事件會把全部所要求訪問的OPC標簽值全部讀取過來(順序不一,要通過ClientHandles索引),此后只有數據發生變化時才會觸發該事件。也只會傳輸發生了變化的數據,沒有變化的數據不會出現在本事件的ItemValues中。



    Private Sub MyOPCGroupOut_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)

    '產生要通知下一級的數據變化,根椐不再的控件有不同的處理



       For ii = 1 To NumItems

        WatchDataWriteValue(ClientHandles(ii) - 1) = ItemValues(ii) '對改變的值讀入本數組

       Next ii

    End Sub

    對OPC的寫可以有同步與異步之分,對于大量的數據傳輸,異步是更佳的選擇,但對少量的數據傳輸,同步表現得更好。

       要進行數據傳輸,先要將值數據進行賦值,注意:值數據要由0開始,也就是說,值數組與標簽數據不是一、一對應,值要比標簽前一位,這一點,在WINCC說明中沒有,但在我的實際的使用中一直要這樣,不然數據就產生錯位,看下面程序。

    這是一個拔號完畢后返回的數據進行OPC傳遞的程序。包含解包過程,

    Private Sub showSuccess(msg As String)

        Dim location As String

        Dim nowTime As String

        Dim logStr As String

        Dim Value() As String

        Dim ii, temp As Integer

        Dim isPack As Boolean

        Dim sHead, sDelimited, sTail As String

        

        location = xProfile.GetValue(WatchPoint(nowRunID), "LOCATION")

        nowTime = Now

        logStr = "拔" & location & "取數成功" & msg

        xLog1.log logStr

        logStr = " " & msg

        xLog2.log logStr               '記錄數據

        '數據上傳

        '如果有包結構,則顯示包結構,

        isPack = xProfile.GetValue(WatchPoint(nowRunID), "ISRECHEAD")

        If WatchPointRBegin(nowRunID) < 0 Then Exit Sub

        If isPack Then

           sHead = xProfile.GetValue(WatchPoint(nowRunID), "RECHEAD")

           sDelimited = xProfile.GetValue(WatchPoint(nowRunID), "RECDELIMITER")

           sTail = xProfile.GetValue(WatchPoint(nowRunID), "RECEND")

            Value = Split(msg, sDelimited)

            For ii = 0 To UBound(Value) - 1

               temp = WatchPointRBegin(nowRunID) + ii

               If temp > WatchPointREnd(nowRunID) Then Exit For

               WatchDataReadValue(temp - 1) = Value(ii + 1)                       'VALUE要從0開始,比ITEM少1,所以減一。  有包頭,占去一位,向后延一

            Next ii

        Else

            WatchDataReadValue(WatchPointREnd(nowRunID) - 1) = msg

        End If

        MyOPCGroupIn.SyncWrite ReadItemIdex, ServerHandlesIn, WatchDataReadValue, ErrorsIn          '數據上傳

        '記錄上次成功執行的時間

        xProfile.SetValue WatchPoint(nowRunID), "LASTTIME", nowTime

    End Sub

    三、OPC連接斷開。
    OPC客戶端連接后要占用服務器資源,所以如果不需要使用OPC時,必須進行OPC連接斷開。

    斷開的程序相當簡單,釋放資源即可。如下,

    Sub StopClient()

        On Error Resume Next

      

      '----------- 釋放組和服務器對象



      MyOPCGroupColl.RemoveAll



      '----------- 與服務器斷開連接并且清除



      MyOPCServer.Disconnect



      Set MyOPCItemCollIn = Nothing

      Set MyOPCItemCollOut = Nothing



      Set MyOPCGroupIn = Nothing

      Set MyOPCGroupOut = Nothing



      Set MyOPCGroupColl = Nothing



      Set MyOPCServer = Nothing



    End Sub

    但在實際的使用中發現,頻繁的連接與斷開,將使服務器的資源被大量的消耗,最終讓服務器出錯。所以盡量減少無謂的OPC連接與斷開。

    結語:
       OPC的使用是作為一個DCOM在使用,所以OPC客戶端可以網絡上任一計算機運行,但你必須配置DCOM的訪問權限,如果你不想費神,把服務器與客戶端都用相同的用戶名與密碼登錄就成了。如果想配置DCOM,請參看DCOM的配置。


    參考資料:

      《WinCC在線幫助》

    作者簡介:

    顧愷,高級程序員,湖南大學畢業,曾從事過LINUX的內核研究,從事過企業信息化平臺的開發,當前從事SCADA的開發,主要將各種不同類型的遠程設備通過同一手段進行數據采集,并集成到企業信息化平臺中去。喜歡將工作中的一些積累形成文字。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>