版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 課程設計(軟件設計)</p><p><b> 報告</b></p><p> 班 級: </p><p> 姓 名: </p><p> 學 號: </p>
2、<p> 指導教師: </p><p> 日 期: 2014 年 10 月 28 日</p><p><b> 目 錄</b></p><p><b> 1設計內容1</b></p><p> 2應用程序總體分析與設計
3、1</p><p> 2.1訪問老師提供的服務器的VB客戶端1</p><p> 2.2訪問WINCC服務器的VB客戶端1</p><p> 3應用程序各功能模塊分析與設計2</p><p> 3.1訪問老師提供的服務器的VB客戶端2</p><p> 3.1.1變量聲明2</p>&
4、lt;p> 3.1.2連接OPC服務器和建立OPC組2</p><p> 3.1.3添加OPC標簽2</p><p> 3.1.4斷開OPC服務器3</p><p> 3.1.5窗體設計3</p><p> 3.2訪問WINCC服務器的VB客戶端3</p><p> 3.2.1 OPC連接
5、3</p><p> 3.2.2 OPC的標簽讀寫4</p><p> 3.2.3 OPC連接斷開4</p><p> 3.2.4建立窗體4</p><p><b> 4程序測試5</b></p><p><b> 4.1測試過程5</b></p&g
6、t;<p><b> 4.2測試結果5</b></p><p> 4.2.1 VB客戶端訪問老師提供的服務器5</p><p> 4.2.2 VB客戶端訪問WINCC服務器6</p><p><b> 5程序文檔9</b></p><p><b> 5.1使
7、用說明9</b></p><p> 5.1.1 VB客戶端訪問老師提供的服務器9</p><p> 5.1.2 VB客戶端訪問WINCC服務器9</p><p><b> 5.2程序說明9</b></p><p> 5.2.1 VB客戶端訪問老師提供的服務器的源程序9</p>
8、<p> 5.2.2 VB客戶端訪問WINCC服務器的源程序16</p><p><b> 6 總結19</b></p><p><b> 1設計內容</b></p><p> 通過VB編程,編寫一個OPC客戶端程序,實現對任意OPC服務器的訪問讀取。本設計涉及到老師提供的服務器、WINCC服務器、V
9、B客戶端、OPC Scout V10客戶端、Matlab客戶端。</p><p> 我們組在兩個服務器,三個客戶端的基礎上進行了多種組合,并一一實現。</p><p> 包括:(1)VB客戶端訪問老師提供的服務器。</p><p> (2)VB客戶端訪問WINCC服務器。</p><p> ?。?)VB客戶端、OPC Scout V10
10、客戶端對WINCC服務器的同步讀取。</p><p> ?。?)VB客戶端、MATLAB客戶端對WINCC服務器的同步讀取。</p><p> 2應用程序總體分析與設計</p><p> 2.1訪問老師提供的服務器的VB客戶端</p><p> VB客戶端需要完成的操作有:</p><p><b>
11、(1)變量聲明</b></p><p> ?。?)連接OPC服務器和建立OPC組</p><p> ?。?)添加OPC標簽</p><p> ?。?)斷開OPC服務器</p><p><b> ?。?)窗體設計</b></p><p> ?。?)命令按鈕的事件處理</p>
12、<p><b> ?。?)同步數據讀取</b></p><p> 2.2訪問WINCC服務器的VB客戶端</p><p> VB客戶端需要完成的操作有:</p><p><b> (1)OPC連接</b></p><p> ?。?)OPC的標簽讀寫</p><p
13、> ?。?)OPC連接斷開</p><p><b> ?。?)建立窗體</b></p><p> 3應用程序各功能模塊分析與設計</p><p> 3.1訪問老師提供的服務器的VB客戶端</p><p><b> 3.1.1變量聲明</b></p><p> 變
14、量的數據類型應該指定為對象型。這些對象變量在窗體代碼的(General)部分聲明。因為在(General)部分聲明的變量,可以在窗體的任何方法的代碼內引用。</p><p> 有關定義OPC對象的聲明及其說明列于表3-1-1</p><p> 表3-1-1 OPC對象變量的聲明</p><p> 3.1.2連接OPC服務器和建立OPC組</p>
15、<p> 考慮到代碼的可反復使用性,這里采用子程序進行編程。</p><p> 這里用“NEW”關鍵詞生成OPC服務器的對象,然后調用OPC服務器對象的“Connect”方法,和OPC服務器連接。在連接遠程服務器的時候,需要指定作為選用參數的遠程計算機名。</p><p> 3.1.3添加OPC標簽</p><p> 對OPC服務器進行訪問前,必須
16、先在OPC組里添加要訪問的OPC標簽。</p><p> 這里添加OPC標簽的標識符和數目是固定的,但是實際的OPC應用程序往往要按照用戶的指定或讀取組態(tài)文件取得和處理需要添加OPC標簽。</p><p> 3.1.4斷開OPC服務器</p><p> 連接著OPC服務器的OPC應用程序,在退出前必須斷開和OPC服務器的連接。因為OPC服務器并不知道OPC應用
17、程序的退出,如果不先斷開連接,那么OPC服務器使用的計算機資源就不被釋放。如果這樣的問題反復發(fā)生,久而久之,連續(xù)運轉的自動控制系統可能會使計算機資源漸漸枯竭從而發(fā)生嚴重問題。</p><p><b> 3.1.5窗體設計</b></p><p> 圖3.1.5 VB客戶端(1)窗體設計</p><p> 3.2訪問WINCC服務器的VB客
18、戶端</p><p> 3.2.1 OPC連接</p><p> 先在工具欄中“工程\引用”將近 Siemens OPC DAAutomation 2.0加入,然后開始定義全局變量。在本程序中,我使用了一個OPC組進行OPC訪問,所以定義了全局變量。首先定義OPC服務類型與計算機結點名。定義OPC組與OPC標簽組。并定義OPC的標簽數組與值數,值數組設為Variant。</p&g
19、t;<p> 在定義所有變量后,我們就要進行OPC連接了,要進行OPC連接之前,先要配置要訪問的OPC標簽名(即WinCC內部變量名),我們ItemIDs中加入相應的標簽名,注意:這數組必須由1開始,不能由0開始。 </p><p> 配置好標簽后就要進行OPC連接了。如下面子程序:①先配置名柄索引,這將在讀取OPC標簽的值時可要用到。②生成OPC對象,③ 進行OPC標簽連接,至此OPC連接就成
20、功了,我們可以對OPC進行讀與寫的操作了。</p><p> 3.2.2 OPC的標簽讀寫</p><p> 對OPC標簽的讀可以通過ItemIDsValue(4)組的DataChange事件來讀取。該事件有多個參數:其中NumItems是指標簽改變值的個數,ClientHandles是改變值的標簽索引,ItemValues為改變值的數據,具體的意思是ClientHandles(ii)
21、的值是其對應的標簽數組的索引,其所指的OPC標簽的值在ItemValues(ii)中。一般來說,剛連接上時,該事件會把全部所要求訪問的OPC標簽值全部讀取過來(順序不一,要通過ClientHandles索引),此后只有數據發(fā)生變化時才會觸發(fā)該事件。也只會傳輸發(fā)生了變化的數據,沒有變化的數據不會出現在本事件的ItemValues中。</p><p> 對OPC的寫可以有同步與異步之分,對于大量的數據傳輸,異步是更
22、佳的選擇,但對少量的數據傳輸,同步表現得更好。</p><p> 3.2.3 OPC連接斷開</p><p> OPC客戶端連接后要占用服務器資源,所以如果不需要使用OPC時,必須進行OPC連接斷開。斷開的程序相當簡單,釋放資源即可。</p><p><b> 3.2.4建立窗體</b></p><p> 圖3.
23、2.4 VB客戶端(2)窗體設計</p><p><b> 4程序測試</b></p><p><b> 4.1測試過程</b></p><p> 程序測試前必須在工程/引用中添加相應組件,老師提供的服務器要添加OPC Automation 2.0組件,WINCC服務器要添加Siemens OPC DAAutomat
24、ion 2.0組件。編輯好窗體和程序點擊保存運行即可。對于VB客戶端(1),先點擊連接,再點擊加項即可實現OPC服務器的變量讀取。對于VB客戶端(2),可以在Text1中輸入主機名稱,設定WINCC服務器所在電腦,再點擊連接實現服務器訪問。此時,變量值列將顯示對應變量的變量值,在變量值更改列輸入0~200任意值即可對相應變量賦值。此時服務器端的變量值會相應更改。</p><p> 通過OPC SCOUT V10
25、實現WINCC/VB/OPC SCOUT V10的連接:</p><p> OPC SCOUT V10作為客戶端對WINCC SERVER進行讀寫,通過寫操作實現WINCC內部變量的函數變化,VB程序作為另一個客戶端同步讀取WINCC SERVER的數據。</p><p> 同理,VB程序也可以作為客戶端對WINCC SERVER進行讀寫,通過寫操作實現WINCC內部變量的賦值,OPC
26、 SCOUT V10作為另一個客戶端同步讀取WINCC SERVER的數據。</p><p> 反之可以通過WINCC畫面對變量進行賦值,兩個客戶端同步讀取WINCC變量。</p><p> 同樣還可以通過MATLAB實現對WINCC SERVER進行讀寫操作。詳見測試結果。</p><p><b> 4.2測試結果</b></p&
27、gt;<p> 4.2.1 VB客戶端訪問老師提供的服務器</p><p> 圖4.2.1 VB客戶端訪問老師提供的服務器</p><p> 4.2.2 VB客戶端訪問WINCC服務器</p><p> 4.2.2-1 VB客戶端訪問WINCC服務器-讀操作</p><p> 4.2.2-2 VB客戶端訪問WINCC服
28、務器-寫操作</p><p> 4.2.2-3 OPC SCOUT V10讀取WINCC變量并修改變量值,返回服務器,VB讀?。?)</p><p> 4.2.2-4 OPC SCOUT V10讀取WINCC變量并修改變量值,返回服務器,VB讀?。?)</p><p> 4.2.2-5 MATLAB讀取WINCC變量并修改變量值,返回服務器,VB讀?。?)&l
29、t;/p><p> 4.2.2-6 MATLAB讀取WINCC變量并修改變量值,返回服務器,VB讀取(2)</p><p><b> 5程序文檔</b></p><p><b> 5.1使用說明</b></p><p> 5.1.1 VB客戶端訪問老師提供的服務器</p><
30、p> 對于VB客戶端(1),先點擊連接,再點擊加項即可實現OPC服務器的變量讀取。棒圖可以直觀的顯示當前的變量值。點擊退出,退出客戶端應用程序。</p><p> 5.1.2 VB客戶端訪問WINCC服務器</p><p> 對于VB客戶端(2),可以在Text1中輸入主機名稱,設定WINCC服務器所在電腦,再點擊連接實現服務器訪問。此時,狀態(tài)顯示圖標(復選框)將變?yōu)檫x中狀態(tài),
31、變量值列將顯示對應變量的變量值,在變量值更改列輸入0~200任意值即可對相應變量賦值。此時服務器端的變量值會相應更改。點擊斷開即可斷開服務器的連接,此時狀態(tài)顯示圖標(復選框)將變?yōu)槲催x中狀態(tài)。點擊退出按鈕,關閉客戶端應用程序。</p><p><b> 5.2程序說明</b></p><p> 5.2.1 VB客戶端訪問老師提供的服務器的源程序</p>
32、<p><b> ‘定義全局變量</b></p><p> Option Base 1</p><p> Option Explicit</p><p> Dim WithEvents objServer As OPCServer</p><p> Dim objGroups As OPCGrou
33、ps</p><p> Dim objTestGrp As OPCGroup</p><p> Dim objItems As OPCItems</p><p> Dim lServerHandles() As Long</p><p><b> ‘連接服務器</b></p><p>
34、Sub Connect(strProgID As String, Optional strNode As String)</p><p> If objServer Is Nothing Then</p><p> ' 建立一個OPC服務器對象</p><p> Set objServer = New OPCServer</p><
35、p><b> End If</b></p><p> If objServer.ServerState = OPCDisconnected Then</p><p> ' 連接OPC服務器</p><p> objServer.Connect strProgID, strNode</p><p>&
36、lt;b> End If</b></p><p> If objGroups Is Nothing Then</p><p> ' 建立一個OPC組集合</p><p> Set objGroups = objServer.OPCGroups</p><p><b> End If</b&g
37、t;</p><p> If objTestGrp Is Nothing Then</p><p> ' 添加一個OPC組</p><p> Set objTestGrp = objGroups.Add("TestGrp")</p><p><b> End If</b></p&
38、gt;<p><b> End Sub</b></p><p><b> ‘斷開服務器連接</b></p><p> Sub Disconnect()</p><p> Dim lErrors() As Long</p><p> If Not objItems Is Not
39、hing Then</p><p> If objItems.Count > 0 Then</p><p><b> ' 清除OPC項</b></p><p> objItems.Remove 2, lServerHandles, lErrors</p><p><b> End If&l
40、t;/b></p><p> Set objItems = Nothing</p><p><b> End If</b></p><p> If Not objTestGrp Is Nothing Then</p><p><b> ' 清除OPC組</b></p>
41、;<p> objGroups.Remove "TestGrp"</p><p> Set objTestGrp = Nothing</p><p><b> End If</b></p><p> If Not objGroups Is Nothing Then</p><p>
42、; Set objGroups = Nothing</p><p><b> End If</b></p><p> If Not objServer Is Nothing Then</p><p> If objServer.ServerState <> OPCDisconnected Then</p>&l
43、t;p> ' 斷開OPC服務器.</p><p> objServer.Disconnect</p><p><b> End If</b></p><p> Set objServer = Nothing</p><p><b> End If</b></p>
44、<p><b> End Sub</b></p><p><b> ’添加變量</b></p><p> Sub AddItem()</p><p> Dim strItemIDs(2) As String</p><p> Dim lClientHandles(2) As L
45、ong</p><p> Dim lErrors() As Long</p><p> Dim I As Integer</p><p> If objTestGrp Is Nothing Then</p><p><b> Exit Sub</b></p><p><b>
46、End If</b></p><p> If Not objItems Is Nothing Then</p><p> If objItems.Count > 0 Then</p><p><b> Exit Sub</b></p><p><b> End If</b>
47、</p><p><b> End If</b></p><p><b> ' 設置組活動狀態(tài)</b></p><p> objTestGrp.IsActive = True</p><p> ' 取消組非同期通知</p><p> objTestG
48、rp.IsSubscribed = False</p><p> ' 建立OPC項集合</p><p> Set objItems = objTestGrp.OPCItems</p><p> ' 生成標簽的項標識符</p><p> strItemIDs(1) = "Tag1.value"<
49、/p><p> strItemIDs(2) = "Tag2.value"</p><p> lClientHandles(1) = 1</p><p> lClientHandles(2) = 2</p><p><b> ' 添加OPC項</b></p><p>
50、 Call objItems.AddItems(2, strItemIDs, _</p><p> lClientHandles, lServerHandles, lErrors)</p><p><b> End Sub</b></p><p> ‘加項按鈕的動作函數</p><p> Private Sub
51、 btnAddItem_Click()</p><p> ' 調用AddItem子程序</p><p> Call AddItem</p><p> If Not objTestGrp Is Nothing Then</p><p> If objTestGrp.OPCItems.Count > 0 Then</p
52、><p><b> ' 啟動定時器</b></p><p> TmUpdate.Enabled = True</p><p><b> Else</b></p><p><b> End If</b></p><p><b> E
53、nd If</b></p><p><b> End Sub</b></p><p><b> ’連接按鈕動作函數</b></p><p> Private Sub btnConnect_Click()</p><p> ' 調用Connect子程序</p>
54、<p> Call Connect("OPCJ.SampleServer.1")</p><p><b> End Sub</b></p><p><b> ‘退出按鈕動作函數</b></p><p> Private Sub btnQuit_Click()</p>&
55、lt;p><b> ' 卸載窗體</b></p><p> Unload FmMain</p><p><b> End Sub</b></p><p><b> ’退出</b></p><p> Private Sub Form_Unload(Canc
56、el As Integer)</p><p> ' 調用Disconnect子程序</p><p> Call Disconnect</p><p><b> End Sub</b></p><p><b> ‘讀取周期定義</b></p><p> Pri
57、vate Sub tmUpdate_Timer()</p><p> Dim vtItemValues() As Variant</p><p> Dim lErrors() As Long</p><p> Dim strBuf As String</p><p> Dim nWidth As Integer</p>
58、<p> Dim nHeight As Integer</p><p> Dim nDrawHeight As Integer</p><p> Dim sglScale As Single</p><p> Dim I As Integer</p><p><b> ' 同期讀取</b>&l
59、t;/p><p> SyncRead OPCCache, vtItemValues, lErrors</p><p><b> ' 棒圖的表示</b></p><p> For I = 1 To 2</p><p><b> ' 數據的格式化</b></p><
60、;p> strBuf = Format(vtItemValues(I), "###.000")</p><p><b> ' 表示數據字符串</b></p><p> lbBar(I).Caption = strBuf</p><p><b> ' 計算棒的寬和高</b>&
61、lt;/p><p> nWidth = picBar(I).ScaleWidth</p><p> nHeight = picBar(I).ScaleHeight</p><p> sglScale = vtItemValues(I) / 700</p><p> nDrawHeight = CInt(nHeight * sglScale
62、)</p><p><b> ' 清除現棒圖</b></p><p> picBar(I).Cls</p><p><b> ' 繪制棒圖</b></p><p> picBar(I).Line (0, nHeight - nDrawHeight)-(nWidth, nHei
63、ght), _</p><p> RGB(255, 0, 0), BF</p><p><b> Next</b></p><p><b> End Sub</b></p><p><b> ‘讀取變量</b></p><p> Sub Syn
64、cRead(nSource As Integer, ByRef vtItemValues() As Variant, _</p><p> ByRef lErrors() As Long)</p><p> Dim lServerHandlesTemp(2) As Long</p><p> Dim j As Integer</p><p&
65、gt; If objTestGrp Is Nothing Then</p><p><b> Exit Sub</b></p><p><b> End If</b></p><p> If objTestGrp.OPCItems.Count > 0 Then</p><p><
66、b> ' 同期讀取</b></p><p> objTestGrp.SyncRead nSource, 2, lServerHandles, _</p><p> vtItemValues, lErrors</p><p><b> End If</b></p><p><b>
67、; End Sub</b></p><p><b> ‘啟動畫面</b></p><p> Private Sub Form_Load()</p><p> TmUpdate.Enabled = False</p><p> TmUpdate.Interval = 100</p>&l
68、t;p><b> End Sub</b></p><p> 5.2.2 VB客戶端訪問WINCC服務器的源程序</p><p><b> ‘定義全局變量</b></p><p> Option Explicit</p><p> Option Base 1 '這數組必須由1開
69、始,不能由0開始</p><p> Const ServerName = "OPCServer.WinCC.1" 'OPC的類型</p><p> Dim NodeName As String '結點名,即計算機名</p><p> Dim WithEvents MyOPCServer As OPCServer 'O
70、PC服務</p><p> Dim WithEvents MyOPCGroup As OPCGroup ' OPC組</p><p> Dim MyOPCGroupColl As OPCGroups</p><p> Dim MyOPCItemColl As OPCItems 'OPC標簽組</p><p> Dim
71、MyOPCItems As OPCItems</p><p> Dim MyOPCItem As OPCItem</p><p> Dim ClientHandles(1) As Long '句柄</p><p> Dim ServerHandles() As Long</p><p> Dim Errors() As Lon
72、g</p><p> Dim ItemIDs(4) As String '記錄OPC的標簽</p><p> Dim ItemIDsValue(4) As Variant '存放OPC的值</p><p> Dim GroupName As Variant</p><p><b> ‘連接按鈕動作函數<
73、/b></p><p> Private Sub Command1_Click()</p><p> Dim ii As Integer</p><p> Dim ClientHandles1(4) As Long</p><p> For ii = 1 To 4</p><p> ClientHand
74、les1(ii) = ii</p><p> ItemIDs(ii) = Text4(ii).Text '指明WinCC內部變量名稱</p><p><b> Next ii</b></p><p> On Error GoTo ErrorHandler</p><p> GroupName = &quo
75、t;MyGroup"</p><p> NodeName = Text1.Text ' 結點名,即計算機名</p><p> Set MyOPCServer = New OPCServer</p><p> MyOPCServer.Connect ServerName, NodeName</p><p> Set M
76、yOPCGroupColl = MyOPCServer.OPCGroups</p><p> MyOPCGroupColl.DefaultGroupIsActive = True</p><p> Set MyOPCGroup = MyOPCGroupColl.Add(GroupName)</p><p> Set MyOPCItemColl = MyOPCG
77、roup.OPCItems</p><p> For ii = 1 To 4</p><p> ClientHandles1(ii) = ii</p><p> ItemIDs(ii) = Text4(ii).Text</p><p> MyOPCItemColl.AddItems 4, ItemIDs, ClientHandles1
78、, ServerHandles, Errors '初始化OCP連接</p><p><b> Next ii</b></p><p> MyOPCGroup.IsSubscribed = True</p><p> Option1.Value = True '連接成功標志</p><p><b
79、> Exit Sub</b></p><p> ErrorHandler:</p><p> MsgBox "Error: " & Err.Description, vbCritical, "ERROR" '連接發(fā)生錯誤</p><p><b> End Sub</b&
80、gt;</p><p><b> ’退出按鈕動作函數</b></p><p> Private Sub Command3_Click()</p><p> Unload Form1</p><p><b> End Sub</b></p><p><b>
81、 ‘從服務器讀取變量</b></p><p> Private Sub MyOPCGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Dat
82、e)</p><p> Dim ii As Long</p><p> For ii = 1 To 4</p><p> ItemIDsValue(ClientHandles(ii)) = ItemValues(ii) '對改變的值讀入本數組</p><p> Text5(ClientHandles(ii)).Text = I
83、temIDsValue(ClientHandles(ii))</p><p><b> Next ii</b></p><p><b> End Sub</b></p><p><b> '寫入</b></p><p> Private Sub Text8_Ch
84、ange(Index As Integer)</p><p> Dim valuess(4) As Variant</p><p> Dim ii As Long</p><p> For ii = 1 To 4</p><p> valuess(ii) = Text8(ii).Text</p><p> M
85、yOPCGroup.SyncWrite 4, ServerHandles, valuess, Errors</p><p><b> Next</b></p><p><b> End Sub</b></p><p><b> ‘斷開服務器連接</b></p><p>
86、 Private Sub Command2_Click()</p><p> On Error Resume Next</p><p> MyOPCGroupColl.RemoveAll '釋放組和服務器對象</p><p> MyOPCServer.Disconnect '與服務器斷開連接并且清除</p><p>
87、Set MyOPCItemColl = Nothing</p><p> Set MyOPCGroup = Nothing</p><p> Set MyOPCGroupColl = Nothing</p><p> Set MyOPCServer = Nothing</p><p> Option1.Value = False
88、39;連接成功標志</p><p><b> End Sub</b></p><p><b> 6 總結</b></p><p> 通過這次課程設計,我收獲頗豐。對于OPC這個名詞,我以前只是聽說過,現在我才發(fā)現OPC的強大和重要性所在。OPC作為一種通用的通訊協議接口,他為工業(yè)現場解決了很多復雜的問題,在廣泛支持工
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論