VBOPC控件設(shè)計(jì)說明文檔_第1頁
VBOPC控件設(shè)計(jì)說明文檔_第2頁
VBOPC控件設(shè)計(jì)說明文檔_第3頁
VBOPC控件設(shè)計(jì)說明文檔_第4頁
VBOPC控件設(shè)計(jì)說明文檔_第5頁
已閱讀5頁,還剩54頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

VBOPC控件設(shè)計(jì)說明文檔裝配與檢測自動(dòng)化事業(yè)部如何建立OPC服務(wù)器與PLC的S7連接以及如何使用VB版OPC控件的說明書1軟硬件環(huán)境1(1軟件環(huán)境:1,Windows2000或WindowXP操作系統(tǒng)2)SIMATICNETPCSOFTWAREV6.2及授權(quán)3)STEP7V5.3+SP3或以上版本及授權(quán)4,VisualBasic6.0編程軟件注:以上軟件安裝順序無要求。1.2硬件:1)CP1613或普通10/100自適應(yīng)以太網(wǎng)卡2)普通網(wǎng)線3,PS307(6ES7307-1EA00-0AA0)4)CPU315-2DP(6ES7315-2AG10-0EX0)5)CP343-1Lean,6GK7343-1CX10-0XE0,2(OPC服務(wù)器配臵2.1配臵PC站的硬件機(jī)架,當(dāng)SIMATICNET軟件成功安裝后~在PC機(jī)桌面上可看到StationConfigurator的快捷圖標(biāo)~同時(shí)在任務(wù)欄(Taskbar)中也會(huì)有StationConfigurationEditor的圖標(biāo)。圖1:StationConfigurator桌面快捷圖標(biāo)雙擊StationConfigurationEditor圖標(biāo)~打開配臵窗口1裝配與檢測自動(dòng)化事業(yè)部圖2StationConfigurationEditor配臵窗口1)在1#槽中插入OPCServer圖3:添加OPCServer2)在3#槽中插入IE-General,插入IEGeneral后~即彈出其屬性對話框。2裝配與檢測自動(dòng)化事業(yè)部圖4:添加IE-General3)點(diǎn)擊NetworkProperties~進(jìn)行網(wǎng)卡參數(shù)配臵,如IP地址~子網(wǎng)掩碼等。圖5:配置IE-General屬性3裝配與檢測自動(dòng)化事業(yè)部圖6配臵網(wǎng)絡(luò)屬性圖7配臵Internet屬性4)當(dāng)網(wǎng)卡配臵完成后~點(diǎn)擊StationConfigurationEditor中的“StationName”按鈕~指定PC站的名稱~這里命名為ethernetopc。點(diǎn)擊“OK”確認(rèn)即完成了PC站的硬件組態(tài)。4裝配與檢測自動(dòng)化事業(yè)部圖8:命名PC站名稱2(2配臵控制臺,ConfigurationConsole,的使用與設(shè)臵1)配臵控制臺,ConfigurationConsole,是組態(tài)設(shè)臵和診斷的核心工具~用于PC硬件組件和PC應(yīng)用程序的組態(tài)和診斷。2)正確完成PC站的硬件組態(tài)后~打開配臵控制臺~在控制臺檢測到OPC服務(wù)器的配臵后~就可以看到所用以太網(wǎng)卡的模式已從PGmode切換到Configurationmode,插槽號,Index,也自動(dòng)指向3。如下圖。1.5裝配與檢測自動(dòng)化事業(yè)部圖9配臵控制臺,ConfigurationConsole,3)在AccessPoints設(shè)定窗口中~將S7ONLINE指向PCinternal(local)。此設(shè)定是為PC站組態(tài)的下載做準(zhǔn)備。圖10:PCStation配置控制臺AccessPoint2(3在STEP7中組態(tài)PCStation1)打開SIMATICManager~通過File->New創(chuàng)建一個(gè)新項(xiàng)目。通過Insert->Station->SimaticPcStation插入一個(gè)PC站。圖11在STEP7中插入PCStation6裝配與檢測自動(dòng)化事業(yè)部2)在硬件組態(tài)中~從硬件目錄窗口選擇與已安裝的Simaticnet軟件版本相符的硬件插入到與在StationConfigurationEditor配臵的PC硬件機(jī)架相對應(yīng)的插槽中。圖12配臵PCStation3)分配普通以太網(wǎng)絡(luò)參數(shù)點(diǎn)擊IEGeneral屬性對話框中Properties按鈕打開以太網(wǎng)接口參數(shù)設(shè)臵對話框,按要求設(shè)臵以太網(wǎng)卡的IP地址和相應(yīng)的子網(wǎng)掩碼。IP地址應(yīng)與實(shí)際硬件所設(shè)以太網(wǎng)卡IP地址一致。并用New按鈕建立一個(gè)ethernet網(wǎng)絡(luò)。確認(rèn)所有組態(tài)參數(shù)~完成網(wǎng)卡設(shè)臵。7裝配與檢測自動(dòng)化事業(yè)部圖13在PCStation中配臵IE-General屬性4)完成PC站組件設(shè)臵后~按下編譯存盤按鈕確定且存儲(chǔ)當(dāng)前組態(tài)配臵5)插入一個(gè)S7300站,通過Insert->Station->Simatic300Station,在相應(yīng)的槽中插入,電源模塊、CPU、cp343,1等~并cp343,1的屬性窗口中配臵ip地址~子網(wǎng)掩碼等參數(shù)~完成硬件組態(tài).圖14配臵S7-300站6)編譯無誤后~點(diǎn)擊“ConfigureNetwork”按鈕~進(jìn)入NetPro配臵窗口。7)在NetPro網(wǎng)絡(luò)配臵中~用鼠標(biāo)選擇OPCServer后在連接表第一行鼠標(biāo)右鍵插入一個(gè)新的連接或通過“Insert>NewConnection”也可建立一個(gè)新連接。8裝配與檢測自動(dòng)化事業(yè)部圖15在NetPro網(wǎng)絡(luò)配臵中加入一個(gè)新連接如果在同一STEP7項(xiàng)目中~所要連接的PLC站已經(jīng)組態(tài)完成~即PLC以太網(wǎng)通訊處理器,CP343-1orCP443-1,網(wǎng)絡(luò)已經(jīng)使能~在選擇“InsertNewConnection”后~連接會(huì)自動(dòng)創(chuàng)建。圖16S7連接屬性8)確認(rèn)所有配臵后~已建好的S7連接就會(huì)顯示在連接列表中。點(diǎn)擊編譯存盤按9裝配與檢測自動(dòng)化事業(yè)部鈕或選擇Network>SaveandCompile~如得到Noerror的編譯結(jié)果~則正確組態(tài)完成。這里編譯結(jié)果信息非常重要~如果有警告信息,Warning,顯示在編譯結(jié)果對話框中~這僅僅是一條信息。但如果有錯(cuò)誤信息,errorMessage,~說明組態(tài)不正確~是不能下載到PCStation中的。圖17組態(tài)編譯存盤2(4完成PC站組態(tài)后~即可在NetPro窗口點(diǎn)擊功能按鈕欄中下載按鈕將組態(tài)下載到PC站中。需注意的是~下載過程中會(huì)刪除已有相關(guān)組件的數(shù)據(jù)~新的組態(tài)數(shù)據(jù)將被下載到PC機(jī)。點(diǎn)擊OK執(zhí)行下載。下載完成后~可以打開StationConfigurationEditor窗口Conn一欄一定要有連接圖標(biāo)~檢查組件狀態(tài)。下圖為正確狀態(tài)顯示畫面。OPCServer插槽此項(xiàng)說明連接激活。10裝配與檢測自動(dòng)化事業(yè)部圖18PCStation運(yùn)行狀態(tài)3(OPC控件說明OPC(OLEforProcessControl—用于過程控制的對象連接與嵌入)是一套以微軟對象連接與嵌入OLE、組件對象模型COM、分布式組件對象模型DCOM(DistributedCOM)技術(shù)為基礎(chǔ)~基于Windows操作平臺~為工業(yè)應(yīng)用程序之間提供高效的信息集成和交互功能的組件對象模型接口標(biāo)準(zhǔn)。OPC實(shí)際上是提供了一種機(jī)制~通過這種機(jī)制~系統(tǒng)能夠以服務(wù)器/客戶端標(biāo)準(zhǔn)方式從服務(wù)器獲取數(shù)據(jù)并將其傳遞給任何客戶應(yīng)用程序。這樣~只要生產(chǎn)商開發(fā)一套遵循OPC規(guī)范的服務(wù)器與數(shù)據(jù)進(jìn)行通信~其他任何客戶應(yīng)用程序便能通過服務(wù)器訪問設(shè)備。OPC服務(wù)器有兩類接口:定制接口和自動(dòng)化接口。定制接口為C++程序服務(wù)~自動(dòng)化接口為VB這一類可使用自動(dòng)化對象的程序服務(wù)。定制接口是服務(wù)商必須提供的~而自動(dòng)化接口則是可選的~不過OPC基金會(huì)提供了一個(gè)叫做“自動(dòng)化包裝器”的動(dòng)態(tài)連接庫~用于在兩者間轉(zhuǎn)換。OPC數(shù)據(jù)存取規(guī)范規(guī)定的基本對象有三類:服務(wù)器(server)、組(group)和數(shù)據(jù)項(xiàng)(item)。服務(wù)器對象包含服務(wù)器的所有信息~也是組對象的容器~一個(gè)服務(wù)器對應(yīng)于一個(gè)OPCserver~即一種設(shè)備的驅(qū)動(dòng)程序。組對象除了包含它自身信息外~還負(fù)責(zé)管理數(shù)據(jù)項(xiàng)。每一個(gè)數(shù)據(jù)項(xiàng)代表到數(shù)據(jù)源的一個(gè)連接~但它沒有提供外部接口~客戶端程序無法對數(shù)據(jù)項(xiàng)直接進(jìn)行操作~應(yīng)用程序必須依靠數(shù)據(jù)項(xiàng)的容器組對象來對它進(jìn)行操作。該控件的主要屬性有OPCServerName、OPCGroupName、OPCBufferSize、OpcLinkStatus、OPCstartAddress~其中~OPCServerName用于配臵服務(wù)器(server)名稱,OPCGroupName用于配臵組(group)名稱,OPCstartAddress用于配臵連接到控件的PLC變量的起始地址,OPCBufferSize用于配臵PLC變量的長度,OpcLinkStatus用于顯示OPC控件的連接狀態(tài)~連接正?!珓t該參數(shù)為0~若該參數(shù)不為0~則連接出現(xiàn)問題~在該情況下~可通過編程先11裝配與檢測自動(dòng)化事業(yè)部調(diào)用OPCDisconnect,,斷開與OPC服務(wù)器的連接~再調(diào)用OPCLink,,重新連接OPC服務(wù)器。該控件的方法主要有OPCLink,,、OPCGetData,ByrefData,,asVarriant~ByvalLenasInteger,、OPCSentData,ByrefData,,asVarriant~ByvalLenasInteger,、OPCDisconnect,,~其中~OPCLink用于連接服務(wù)器(server)添加組,GROUP,和數(shù)據(jù)項(xiàng)(ITEM),OPCGetData,ByrefData,,asVarriant~ByvalLenasInteger,用于讀取OPC服務(wù)器的數(shù)據(jù)~數(shù)組Data用于接受數(shù)據(jù)~Len指定數(shù)據(jù)長度,OPCSentData,ByrefData,,asVarriant~ByvalLenasInteger,用于向OPC服務(wù)器發(fā)送數(shù)據(jù)~數(shù)組Data用于存放被發(fā)送的數(shù)據(jù)~Len指定數(shù)據(jù)長度,OPCDisconnect,,用于斷開與OPC服務(wù)器的連接。4(OPC控件使用舉例4(1添加控件在VB環(huán)境中~按“工程”的子菜單“控件…”后~彈出對話框圖19添加工程部件對話框12裝配與檢測自動(dòng)化事業(yè)部圖20添加Opclinker控件點(diǎn)擊瀏覽按鈕在添加ACTIVEX控件窗口中找到C:\WINNT\SYSTWM32下的OPCLINKER.OCX文件~點(diǎn)擊打開~后點(diǎn)擊部件窗口中的確定按鈕~即加入控件。加入后效果如下圖所示:13裝配與檢測自動(dòng)化事業(yè)部圖21添加控件后的效果4(2應(yīng)用例程:PrivateSubCommand1_Click()Dimrecv(9)AsVariantOPCLinker1.OpcGetDatarecv,8Text1.Text=CStr(recv(1))Text2.Text=CStr(recv(2))Text3.Text=CStr(recv(3))Text4.Text=CStr(recv(4))Text5.Text=CStr(recv(5))Text6.Text=CStr(recv(6))Text7.Text=CStr(recv(7))Text8.Text=CStr(recv(8))EndSubPrivateSubCommand2_Click()Dimsent(9)AsVariantsent(1)=Val(Text1.Text)sent(2)=Val(Text2.Text)sent(3)=Val(Text3.Text)sent(4)=Val(Text4.Text)sent(5)=Val(Text5.Text)sent(6)=Val(Text6.Text)sent(7)=Val(Text7.Text)sent(8)=Val(Text8.Text)OPCLinker1.OpcSendDatasent,8EndSubPrivateSubForm_Load()OPCLinker1.LinkEnble=TrueOPCLinker1.OpcLinkEndSub附錄1:網(wǎng)絡(luò)文章《ActiveX控件的創(chuàng)建》,web地址:www_xiameng_net.htm,作者:互聯(lián)網(wǎng)文章來源:互聯(lián)網(wǎng)點(diǎn)擊數(shù):1097更新時(shí)間:2005-10-1414裝配與檢測自動(dòng)化事業(yè)部1,概述ActiveX是一個(gè)Microsoft的術(shù)語~它指的是一組包括控件~DLL和ActiveX文檔的組件~它通常是以動(dòng)態(tài)鏈接庫的形式存在,因此必須在一個(gè)叫容器的獨(dú)立執(zhí)行軟件中運(yùn)行。這樣的容器包括Authorware、Delphi~VisualBasic~VisualC,,~I(xiàn)nternetExplorer和Access等等。ActiveX控件數(shù)據(jù)輸入和函數(shù)功能執(zhí)行都必須通過容器~因此ActiveX控件和容器都必須支持一些特定的接口協(xié)議。根據(jù)Microsoft相應(yīng)的規(guī)格標(biāo)準(zhǔn)~ActiveX控件應(yīng)具備如下的性能機(jī)制。屬性和方法:ActiveX控件必須提供屬性的名稱、方法的名稱及參數(shù),通過這項(xiàng)機(jī)制容器可以存取和改變ActiveX控件的屬性參數(shù)。事件:ActiveX控件由這項(xiàng)機(jī)制通知容器在ActiveX控件中發(fā)生的事件~比如屬性參數(shù)的改變~用戶按下鼠標(biāo)左鍵等。存儲(chǔ):容器由這項(xiàng)機(jī)制通知ActiveX控件存儲(chǔ)和提取有關(guān)信息數(shù)據(jù)等。ActiveX控件只要在Windows的Registry數(shù)據(jù)庫中注冊后~就可以像其他Windows應(yīng)用程序一樣發(fā)揮各自的功能。ActiveX控件是一個(gè)模塊化的靈活對象,如果某個(gè)應(yīng)用程序或網(wǎng)頁需要增加一項(xiàng)特殊的功能~無須重寫整個(gè)程序~只要靈活地插入一個(gè)具有此項(xiàng)功能的ActiveX控件即可實(shí)現(xiàn)。ActiveX的優(yōu)勢還在于它的動(dòng)態(tài)可交互性~用戶可以動(dòng)態(tài)地在使用過程中~通過改變它的屬性和參數(shù)~在應(yīng)用程序中實(shí)現(xiàn)自己的特殊要求。也許有的讀者會(huì)問:目前在市面上可以找到各種各樣現(xiàn)成的ActiveX控件~還有沒有必要自己創(chuàng)建ActiveX控件呢,關(guān)于這個(gè)問題很容易解釋~現(xiàn)有的控件種類是很多~功能也比較齊全~問題是有許多時(shí)候會(huì)遇到這種情況:使用現(xiàn)成的控件雖能完成任務(wù)~但自己需要的一些特性,屬性、事件或方法,該控件卻沒有提供~還需要自己手工寫代碼來實(shí)現(xiàn)~而這些特性偏偏在自己的應(yīng)用系統(tǒng)中又經(jīng)常會(huì)用到~為了避免大量的重復(fù)勞動(dòng)~一勞永逸的辦法就是在創(chuàng)建自己的ActiveX控件。目前可以使用VisualBasic或其它開發(fā)工具創(chuàng)建ActiveX控件。無論按照哪種標(biāo)準(zhǔn)~VisualBasic都是計(jì)算機(jī)歷史上最為成功的,同時(shí)也是最流行的,編程語言~其中最令人興奮的特性就是可以創(chuàng)建用戶自己的控件并可以像其他控件一樣應(yīng)用于支持ActiveX控件技術(shù)的應(yīng)用程序中。下面通過一個(gè)具體實(shí)例來闡述如何在VisualBasic6.0,中文企業(yè)版,下進(jìn)行ActiveX控件創(chuàng)建。2,創(chuàng)建ActiveX控件的步驟15裝配與檢測自動(dòng)化事業(yè)部使用VisualBasic編程語言編寫過應(yīng)用程序的用戶~一定非常熟悉諸如TextBox、Label和Data等控件。要利用這些控件~可以將它們繪制在窗體中~通過屬性~方法和事件控制它們的行為。當(dāng)用戶創(chuàng)建自己的ActiveX控件時(shí)~除了確定屬性、方法和事件以外~用戶是在創(chuàng)建一個(gè)相似的對象。當(dāng)創(chuàng)建了自己的ActiveX控件以后~就可以在其他VisualBasic工程中使用它~就像使用TextBox控件一樣??梢栽谀苁褂肁ctiveX控件的任何應(yīng)用程序或開發(fā)工具,包括其他VisualBasic工程、Authorware或者M(jìn)icrosoftInternetExplorer,中使用自己的控件。在VisualBasic中創(chuàng)建一個(gè)ActiveX控件不同于創(chuàng)建一個(gè)StandardEXE應(yīng)用程序。因此當(dāng)創(chuàng)建一個(gè)新控件時(shí)~一般應(yīng)遵循的步驟是:,1,確定控件將要提供的功能。因?yàn)锳ctiveX控件類似于一個(gè)獨(dú)立的對象~所以需要明確這個(gè)對象的目的~希望它在屏幕上有什么樣的外觀,使用此控件時(shí)~需要什么屬性、方法以及事件用于應(yīng)用程序中,,2,設(shè)計(jì)控件的外觀。,3,設(shè)計(jì)控件的接口~即屬性、事件和方法。,4,創(chuàng)建由控件工程和測試工程組成的工程組。,5,通過把控件和或代碼添加到UserControl對象中來實(shí)現(xiàn)控件的外觀。,6,實(shí)現(xiàn)控件的接口和功能。,7,編譯控件部件,.ocx文件,。下面按照上述步驟建立一個(gè)可直接顯示數(shù)據(jù)庫內(nèi)容的DataListView控件。3,具體實(shí)現(xiàn)方法,1,確定DataListView控件的功能標(biāo)準(zhǔn)的ListView控件在顯示數(shù)據(jù)庫記錄時(shí)還存在一些不足~如必須編寫大量的代碼等~DataListView通過在ListView的基礎(chǔ)上添加部分功能而彌補(bǔ)了ListView的不足~因此它除了本身固有的屬性、方法和事件外~添加了如下成員:?DataServerName屬性--確定所操作的數(shù)據(jù)庫服務(wù)器。?DataBaseName屬性--確定所操作的數(shù)據(jù)庫。?AdministratorName屬性--確定操作數(shù)據(jù)庫的管理員名稱。?PasswordName屬性--確定操作數(shù)據(jù)庫的管理員口令。?ShowDataBase方法--顯示Select命令所執(zhí)行的數(shù)據(jù)庫操作結(jié)果。?ErrorDataBase事件--當(dāng)遇到錯(cuò)誤的數(shù)據(jù)庫操作時(shí)引發(fā)該事件。,2,設(shè)計(jì)控件的外觀DataListView由于僅包含一個(gè)ListView控件~所以其外觀沒有太多需要考慮的問題。16裝配與檢測自動(dòng)化事業(yè)部如果要?jiǎng)?chuàng)建的控件是多個(gè)控件構(gòu)成~或新控件不包括任何現(xiàn)存控件即完全從頭開始創(chuàng)建一個(gè)全新的控件的話~則外觀問題是一個(gè)很重要的問題。,3,設(shè)計(jì)控件的接口~即屬性、事件和方法對ListView控件所作的改進(jìn)是為了讓ListView控件支持?jǐn)?shù)據(jù)庫的內(nèi)容顯示,以便在所有能支持ActiveX控件的應(yīng)用程序中使用。通過添加用戶自己的屬性DataServername、DataBaseName、AdministratorName、PasseordName和方法ShowDataBase等可以實(shí)現(xiàn)這項(xiàng)功能。DataListView的其他屬性、事件和方法都和標(biāo)準(zhǔn)ListView一樣。,4,創(chuàng)建由控件工程和測試工程組成的工程組?啟動(dòng)一個(gè)新的ActiveX控件工程。?按下CTRL+T組合鍵或者選擇【工程】|【部件】菜單選項(xiàng)~顯示【部件】對話框~在【控件】選擇框中選擇MicrosoftWindowsCommonControls6.0。?選擇【工程】|【引用】菜單選項(xiàng)~顯示【引用】對話框~在【可用的引用】選擇框中選擇MicrosoftActiveXDataObjects2.0Library。?在UserControl窗口中添加一ListView控件~ListView控件的左上角位臵為0~0。?設(shè)臵ActiveX工程和UserControl控件屬性值~如下表所示。條目設(shè)臵工程類型ActiveX控件工程名稱DataLV工程描述通過ADO~使得ListView控件能夠直接操作數(shù)據(jù)庫UserControl的Name屬性DataListViewUserControl的Public屬性True?保存這個(gè)工程。?選擇【文件】|【添加工程】菜單選項(xiàng)。然后添加一個(gè)標(biāo)準(zhǔn)EXE工程。建立該工程的目的是為了在創(chuàng)建ActiveX控件時(shí)不斷地進(jìn)行測試。此時(shí)已建立了一個(gè)由控件工程和測試工程組成的工程組~下面就可以正式開始創(chuàng)建DataListView控件。,5,實(shí)現(xiàn)控件的外觀確定控件外觀的方式取決于當(dāng)前控件的創(chuàng)建模型。如果要?jiǎng)?chuàng)建一個(gè)用戶繪制控件~那么必須自己在UserControl_Paint事件過程編寫代碼來完成所有的繪制工作~同時(shí)還需要確定何時(shí)繪制控件~以便在需要的時(shí)候調(diào)用UserControl的Refresh方法來產(chǎn)生Paint事件。如果是改進(jìn)一個(gè)現(xiàn)有控件~那么只需正確地將組成控件放臵在UserControl上即可。由于DataListView控件僅包含ListView一個(gè)組成控件~那么只需簡單地在17裝配與檢測自動(dòng)化事業(yè)部UserControl1上繪出一個(gè)標(biāo)準(zhǔn)ListView控件~控件名為缺省的ListView1~即可完成外觀繪制工作。為了在使用控件時(shí)~使ListView控件和自己繪制的空間相匹配~必須建立UserControl的Resize事件過程。Resize事件過程的代碼如下:PrivateSubUserControl_Resize()ListView1.Left=0ListView1.Top=0ListView1.Width=UserControl.WidthListView1.Height=UserControl.HeightEndSub僅四行代碼的Resize事件過程是簡單控件的用戶界面的所有必須的代碼~其目的是使ListView控件和UserControl對象有相同的尺寸。,6,實(shí)現(xiàn)控件的接口和功能這是整個(gè)創(chuàng)建過程中最核心、最重要也是最復(fù)雜的步驟。對于創(chuàng)建控件的每一屬性、事件和方法均需逐一實(shí)現(xiàn)。?創(chuàng)建DataServerName屬性要?jiǎng)?chuàng)建DataServerName屬性值~首先需要添加一個(gè)在內(nèi)部存貯屬性值的局部變量。要做到這一點(diǎn)~在UserControl對象的GenaralDeclarations通用聲明語句中創(chuàng)建此變量。如下所示:Dimm_DataServerNameAsString接著需要?jiǎng)?chuàng)建稱為DataServerName的新屬性~可以通過手工輸入Get和Let過程~或者選擇【工具】|【添加過程】|【類型】創(chuàng)建這個(gè)新屬性。DataServerName屬性的代碼相當(dāng)容易理解。當(dāng)臵DataServerName屬性的值時(shí)~PropertyGet過程僅將局部變量的存貯內(nèi)容取出來。當(dāng)設(shè)臵DataServerName屬性值時(shí)~PropertyLet過程將為局部變量賦予一個(gè)有效值。以下是兩個(gè)Property過程的代碼:PublicPropertyGetDataServername()AsStringDataServername=m_DataServerNameEndPropertyPublicPropertyLetDataServername(ByValNew_DataServerNameAsString)m_DataServerName=New_DataServerNamePropertyChanged"DataServerName"EndProperty18裝配與檢測自動(dòng)化事業(yè)部需要注意的是在PropertyLet過程中~有一個(gè)PropertyChanged方法~它的功能是通知容器,可以理解為存放所有屬性的單元,屬性值已變更~需產(chǎn)生一個(gè)WriteProperties事件~來保存新屬性值。事實(shí)上不僅在PropertyLet過程需要調(diào)用PropertyChanged方法~在UserControl的代碼模塊中無論何時(shí)改變了ActiveX控件的某個(gè)屬性值~均需調(diào)用該過程,以保存屬性的變化。注意PropertyDataServerName方法的用法~此方法與ReadProperties和WriteProperties事件在一起使用。此時(shí)需要使用用戶控件的InitProperties事件指定此屬性的初始值:PrivateSubUserControl_InitProperties()m_DataServerName=m_def_DataServerNameEndSub即使用戶沒有設(shè)臵初始值~這些代碼也會(huì)確保設(shè)臵了一個(gè)初始值。至于DataBaseName、AdministratorName、PasseordName屬性的創(chuàng)建過程跟DataServername屬性的創(chuàng)建過程完全一樣~這里就不再重復(fù)敘述。?使用PropertyBag對象用戶還需要為WriteProperties和ReadProperties事件創(chuàng)建代碼,從而保護(hù)DataServername、DataBaseName、AdministratorName、PasseordName屬性在設(shè)計(jì)階段的屬性值。這兩個(gè)事件都使用PropertyBag對象保存和檢索DataServername、DataBaseName、AdministratorName、PasseordName屬性的值。PropertyBag對象能夠保持DataServername、DataBaseName、AdministratorName、PasseordName的設(shè)計(jì)值。具體實(shí)現(xiàn)代碼如下:PrivateSubUserControl_ReadProperties(PropBagAsPropertyBag)m_DataServerName=PropBag.ReadProperty("DataServerName",m_def_DataServerName)m_DataBaseName=PropBag.ReadProperty("DataBaseName",m_def_DataBaseName)m_AdministratorName=PropBag.ReadProperty("AdministratorName",m_def_AdministratorName)m_PasswordName=PropBag.ReadProperty("PasswordName",m_def_PasswordName)EndSubPrivateSubUserControl_WriteProperties(PropBagAsPropertyBag)CallPropBag.WriteProperty("DataServerName",m_DataServerName,19裝配與檢測自動(dòng)化事業(yè)部m_def_DataServerName)CallPropBag.WriteProperty("DataBaseName",m_DataBaseName,m_def_DataBaseName)CallPropBag.WriteProperty("AdministratorName",m_AdministratorName,m_def_AdministratorName)CallPropBag.WriteProperty("PasswordName",m_PasswordName,m_def_PasswordName)EndSub由于這兩個(gè)過程是針對"容器"對象的~因此所有屬性值的保存和讀取都通過這兩個(gè)過程來實(shí)現(xiàn)~而不是每個(gè)屬性都需要單獨(dú)的兩個(gè)過程。其中~PropertyBag就是"容器對象"的名稱。WriteProperty方法有三個(gè)參數(shù):第一個(gè)字符串標(biāo)識需要保存的屬性~第二個(gè)參數(shù)是需要保存的值~最后的參數(shù)是屬性的缺省值。ReadProperty方法需要兩個(gè)參數(shù):一個(gè)字符串用來保存屬性的名稱~另一個(gè)為缺省值。在窗體上繪制ActiveX控件的那一刻~就會(huì)開始執(zhí)行ActiveX控件的代碼。在控件設(shè)計(jì)過程中~將DataServername、DataBaseName、AdministratorName、PasseordName屬性的默認(rèn)值設(shè)臵為:Constm_def_DataServerName="lyc"Constm_def_DataBaseName="pubs"Constm_def_AdministratorName="sa"Constm_def_PasswordName=""當(dāng)然~也可以在程序運(yùn)行時(shí)多次修改它??丶恼P袨槭钱?dāng)程序終止時(shí)恢復(fù)其默認(rèn)值~這樣增加了保持屬性的兩種獨(dú)立狀態(tài)的要求。簡言之~如果在設(shè)計(jì)階段改變了一個(gè)屬性值~那么控件必須得到這個(gè)新值~而不是使用默認(rèn)值。相反~如果在程序運(yùn)行時(shí)改變屬性值~那么當(dāng)返回設(shè)計(jì)狀態(tài)時(shí)~控件必須檢索此屬性值。PropertyBag對象允許ActiveX控件存貯有關(guān)它自己的屬性值~使它能執(zhí)行這個(gè)動(dòng)作。PropertyChanged方法會(huì)通知用戶已經(jīng)改變了一個(gè)屬性。通過了解程序的狀態(tài)以及是否調(diào)用了PropertyChanged方法~VB就可以激發(fā)WriteProperties和ReadProperties事件。?為ShowDataBase方法編寫代碼ShowDataBase方法實(shí)現(xiàn)在ListView控件中顯示Select命令所執(zhí)行的數(shù)據(jù)庫操作結(jié)果。在其具體實(shí)現(xiàn)過程中采用了ADO,ActiveXDataObjects,的數(shù)據(jù)存取方法。ADO的主要特點(diǎn)是使用更加容易~訪問速度更快,而對磁盤和存儲(chǔ)容量的要求更小,ADO支持建立各種客戶20裝配與檢測自動(dòng)化事業(yè)部/服務(wù)器模式與基于Web的應(yīng)用程序~具有遠(yuǎn)程數(shù)據(jù)服務(wù)RDS,RemoteDataService,的特性~通過RDS能夠在一次往返中將服務(wù)器端的數(shù)據(jù)傳送到客戶端的應(yīng)用程序或Web頁面中~并在客戶端對數(shù)據(jù)進(jìn)行處理后~立即更新服務(wù)器端的數(shù)據(jù)。采用ADO所基于的OLEDB技術(shù)~可以對電子郵件、文本文件、數(shù)據(jù)表格等各類數(shù)據(jù)通過統(tǒng)一的接口API接口進(jìn)行存取~是遠(yuǎn)程數(shù)據(jù)存取的一個(gè)主要發(fā)展方向。ShowDataBase方法具有一個(gè)字符串參數(shù)~但無任何返回值~具體代碼如下所示:PublicSubshowdatabase(ssqlAsString)DimAdoDatabaseAsNewADODB.ConnectionDimAdoTableAsNewADODB.RecordsetDimscnnAsStringDimresponseAsStringDimIAsIntegerOnErrorGoToerrorhandlescnn="Provider=SQLOLEDB;DataSource="&Trim(m_DataServerName)&";InitialCatalog="&Trim(m_DataBaseName)&";UserId="&Trim(m_AdministratorName)&";Password="&Trim(m_PasswordName)&";"AdoDatabase.OpenscnnAdoTable.CursorType=adOpenKeysetAdoTable.LockType=adLockOptimisticAdoTable.CursorLocation=adUseClientAdoTable.Openssql,AdoDatabase,,,adCmdTextIfAdoTable.BOFAndAdoTable.EOFThenresponse=MsgBox("沒有符合條件的記錄::",vbOKOnly+vbInformation,"數(shù)據(jù)庫控件")AdoTable.CloseSetAdotable=NothingAdoDatabase.CloseSetAdoDataBase=NothingExitSubEndIfListView1.ColumnHeaders.ClearListView1.ListItems.ClearDimclmXAsColumnHeaderForI=0ToAdoTable.Fields.Count-1SetclmX=ListView1.ColumnHeaders.Add()WithclmX.Text=AdoTable.Fields(I).NameEndWithNextDimitmXAsListItemAdoTable.MoveFirst21裝配與檢測自動(dòng)化事業(yè)部DoWhileNotAdoTable.EOFSetitmX=ListView1.ListItems.Add()WithitmXIfIsNull(AdoTable.Fields(0).Value)Then.Text="NULL"Else.Text=AdoTable.Fields(0).ValueEndIfEndWithForI=1ToAdoTable.Fields.Count-1IfIsNull(AdoTable.Fields(I).Value)ThenitmX.SubItems(I)="NULL"ElseitmX.SubItems(I)=AdoTable.Fields(I).ValueEndIfNextAdoTable.MoveNextLoopListView1.View=lvwReportAdoTable.CloseSetAdotable=NothingAdoDatabase.CloseSetAdoDataBase=NothingExitSuberrorhandle:RaiseEventErrordatabaseEndSub當(dāng)對數(shù)據(jù)庫的操作發(fā)生錯(cuò)誤后~除了不能正常顯示以外~還應(yīng)通知宿主程序用戶??梢酝ㄟ^創(chuàng)建一個(gè)叫做Errordatabase的事件實(shí)現(xiàn)上述功能。要?jiǎng)?chuàng)建這個(gè)事件~把下述代碼添加到UserControl對象的GeneralDeclarations段中。PublicEventErrordatabase()此事件的工作像其他控件的事件一樣。使用控件的用戶可以將代碼放到這個(gè)事件中~用戶要做的唯一的事情就是用RaiseEvent方法激發(fā)此事件。,7,編譯控件部件,.ocx文件,。現(xiàn)在已經(jīng)完成了DataListView控件的創(chuàng)建工作~為了在DataLV工程外也可以使用該控件~只需將DataLV工程編譯.ocx控件部件即可。22裝配與檢測自動(dòng)化事業(yè)部在【工程組】窗口單擊【DataLV】以選擇該工程~在【文件】菜單上單擊【生成DataLV.ocx】~在【生成工程】對話框中選擇控件存放的目錄后~單擊【確定】即可創(chuàng)建.ocx文件。一旦生成了.ocx文件的控件~就可以象使用其它控件一樣來隨心所欲地使用它了。4,結(jié)束語ActiveX技術(shù)可以靈活、高效的實(shí)現(xiàn)可交互、重入、重用、完全分布式、與語言無關(guān)的各種應(yīng)用。隨著ActiveX技術(shù)的發(fā)展~ActiveX控件在應(yīng)用程序中的作用將會(huì)顯得越來越重要~那么創(chuàng)建一個(gè)功能完善、具有自己特色的ActiveX控件就非常具有現(xiàn)實(shí)意義。只要掌握了創(chuàng)建ActiveX控件的基本方法~就不難創(chuàng)建自定制的可在各種應(yīng)用領(lǐng)域使用的ActiveX控件。但是~ActiveX技術(shù)也有一些明顯缺點(diǎn)~ActiveX技術(shù)依賴于Windows平臺~對廣泛應(yīng)用的UNIX平臺目前仍不兼容~另外ActiveX在許多方面的性能還較弱~ActiveX技術(shù)仍需要不斷完善和發(fā)展。附錄2:網(wǎng)絡(luò)文章《OPC異步客戶程序》,1,建立新工程或項(xiàng)目~在“工程”菜單下選擇“引用”~如圖5-3所示。只有引用OPCDAAuoto.DLL后~在程序中才能創(chuàng)建服務(wù)器對象~然后進(jìn)行一系列的操作。,2,在彈出的引用窗口里單擊“瀏覽(B)…”按鈕~彈出添加引用窗口~選擇OPCDAAuoto.DLL文件。,3,在引用窗口里的OPCAutomation2.0前面打鉤~按“確定”按鈕。,4,定義全局變量~這樣可以在窗體的任何方法的代碼內(nèi)應(yīng)用。變量類型應(yīng)該指定為對象型。這些對象最好在窗體的通用部分聲明加上“OptionExplicit”語句~表示模塊里的所有變量都需要顯式聲明。由于OPC自動(dòng)化接口的數(shù)組的索引要求必須從1開始~而系統(tǒng)默認(rèn)是從0開始~為了避免錯(cuò)誤最好在代碼的最初加上“OptionBase1”語句。為了使對象可以處理事件~必須將objTestGrp和objServer的聲明中加上“WithEvents”語句~表示聲明的對象可以響應(yīng)事件。OptionExplicitOptionBase1DimWithEventsobjServerAsOPCServerDimobjGroupsAsOPCGroupsDimWithEventsobjTestGrpAsOPCGroupDimobjItemsAsOPCItems,5,連接OPC服務(wù)器和建立OPC組考慮到代碼的可反復(fù)使用性~采用子程序進(jìn)行編程。SubConnect(strProgIDAsString,OptionalstrNodeAsString)IfobjServerIsNothingThen23裝配與檢測自動(dòng)化事業(yè)部'建立一個(gè)OPC服務(wù)器對象SetobjServer=NewOPCServerEndIf服務(wù)器狀態(tài)ServerState屬性一共有OPCRunning、OPCFailed、OPCNoconfig、OPCSuspended、OPCTest和OPCDisconnected六個(gè)值~分別表示正在運(yùn)行、失敗、沒有配臵、暫停、測試和沒有連接六種OPC服務(wù)器當(dāng)前的狀態(tài)。如果OPC服務(wù)器沒有連接~我們才執(zhí)行objServer.ConnectstrProgID,strNode語句。strProgID就是ProgID~strNode就是用于遠(yuǎn)程通信的IP地址。IfobjServer.ServerState=OPCDisconnectedThen'連接OPC服務(wù)器objServer.ConnectstrProgID,strNodeEndIf在VisualBasic中~通過執(zhí)行一個(gè)Set操作實(shí)現(xiàn)調(diào)用其它接口的方法。IfobjGroupsIsNothingThen'建立一個(gè)OPC組集合SetobjGroups=objServer.OPCGroupsEndIfIfobjTestGrpIsNothingThen'添加一個(gè)OPC組SetobjTestGrp=objGroups.Add("Group")EndIfEndSub,6,添加OPC標(biāo)簽對服務(wù)器進(jìn)行訪問前~必須先在OPC組里添加要訪問的OPC標(biāo)簽。OPC客戶端程序要按照用戶指定的標(biāo)簽或者從組態(tài)文件里讀取需要添加的OPC標(biāo)簽。SubAddItem()DimstrItemIDs(17)AsStringDimlClientHandles(17)AsLongDimlErrors()AsLongDimIAsIntegerIfobjTestGrpIsNothingThenExitSubEndIfIfNotobjItemsIsNothingThenIfobjItems.Count>0ThenExitSubEndIfEndIf'設(shè)臵組活動(dòng)狀態(tài)。只有處于活動(dòng)狀態(tài)的OPC才進(jìn)行定期的數(shù)據(jù)更新。非活動(dòng)狀態(tài)的OPC組~除了在接到顯然的數(shù)據(jù)讀寫要求外~并不收集任何數(shù)據(jù)。IfmnuSubscribtion.Checked=TrueThenobjTestGrp.IsActive=True24裝配與檢測自動(dòng)化事業(yè)部ElseobjTestGrp.IsActive=FalseEndIf'啟動(dòng)組異步通知。進(jìn)行訂閱的OPC組可以自動(dòng)收到從服務(wù)器送來的數(shù)據(jù)變化通知。objTestGrp.IsSubscribed=True'建立OPC項(xiàng)集合SetobjItems=objTestGrp.OPCItems'生成從TAG1到TAG17的項(xiàng)標(biāo)識符ForI=1To17strItemIDs(I)="Server.Group.TAG"&IlClientHandles(I)=INext'添加OPC項(xiàng)CallobjItems.AddItems(17,strItemIDs,lClientHandles,lServerHandles,lErrors)EndSub,7,異步讀取代碼的實(shí)現(xiàn)在定時(shí)器事件內(nèi)進(jìn)行執(zhí)行AsyncRead子程序的讀取代碼~而在讀取完成事件處理返回的數(shù)據(jù)訪問結(jié)果。SubAsyncRead()DimlErrors()AsLongIfobjTestGrpIsNothingThenExitSubEndIfIfobjTestGrp.OPCItems.Count>0Then'異步讀取lTransID_Rd=lTransID_Rd+1objTestGrp.AsyncRead17,lServerHandles,lErrors,lTransID_Rd,lCancelID_RdEndIfEndSubPrivateSubobjTestGrp_AsyncReadComplete(_ByValTransactionIDAsLong,ByValNumItemsAsLong,_ClientHandles()AsLong,ItemValues()AsVariant,_Qualities()AsLong,TimeStamps()AsDate,Errors()AsLong)……Sub,8,在按鈕中執(zhí)行AsyncWrite子程序~完成異步寫的操作。SubAsyncWrite(nIndexAsInteger,ByRefvtItemValues()AsVariant,_ByReflErrors()AsLong)DimlHandle(1)AsLongIfobjTestGrpIsNothingThenExitSub25裝配與檢測自動(dòng)化事業(yè)部EndIfIfobjTestGrp.OPCItems.Count>0ThenlHandle(1)=lServerHandles(nIndex)'異步寫入lTransID_Wt=lTransID_Wt+1objTestGrp.AsyncWrite1,lHandle(),vtItemValues,_lErrors,lTransID_Wt,lCancelID_WtEndIfEndSub,9,斷開OPC服務(wù)器連接著OPC服務(wù)器的OPC客戶應(yīng)用程序~在退出前必須斷開和OPC服務(wù)器的連接。因?yàn)镺PC服務(wù)器并不知道OPC客戶應(yīng)用程序的退出。如果不先斷開連接~那么OPC服務(wù)器使用的計(jì)算機(jī)資源就不會(huì)被釋放。如果這樣的問題反復(fù)發(fā)生~久而久之~連續(xù)運(yùn)轉(zhuǎn)的自動(dòng)控制系統(tǒng)可能會(huì)計(jì)算機(jī)資源漸漸枯竭從而發(fā)生嚴(yán)重問題~可以顯式地把它設(shè)臵為“Nothing”。SubDisconnect()DimlErrors()AsLongIfNotobjItemsIsNothingThenIfobjItems.Count>0ThenobjItems.Remove17,lServerHandles,lErrors'清除OPC項(xiàng)EndIfSetobjItems=NothingEndIfIfNotobjTestGrpIsNothingThenobjGroups.Remove"Group"'清除OPC組SetobjTestGrp=NothingEndIfIfNotobjGroupsIsNothingThenSetobjGroups=NothingEndIfIfNotobjServerIsNothingThenIfobjServer.ServerState<>OPCDisconnectedThenobjServer.Disconnect'斷開OPC服務(wù)器.EndIfSetobjServer=NothingEndIfEndSub附錄3:OPC客戶程序,VB篇——同步,來源網(wǎng)絡(luò)建立如下窗體:引用如下:26裝配與檢測自動(dòng)化事業(yè)部代碼如下:OptionExplicitDimWithEventsServerObjAsOPCServerDimWithEventsGroupObjAsOPCGroupDimItemObjAsOPCItemPrivateSubCommand_Start_Click()DimOutTextAsStringOnErrorGoToErrorHandlerCommand_Start.Enabled=FalseCommand_Read.Enabled=TrueCommand_Write.Enabled=TrueCommand_Exit.Enabled=TrueOutText="連接OPC服務(wù)器"SetServerObj=NewOPCServerServerObj.Connect("XXXSERVER")'XXXSERVER為某OPC服務(wù)器名稱OutText="添加組"SetGroupObj=ServerObj.OPCGroups.Add("Group")OutText="AddinganItemtothegroup"SetItemObj=GroupObj.OPCItems.AddItem("XXXITEM",1)'XXXITEM為添加的ITEM名稱ExitSubErrorHandler:'如果出現(xiàn)異?!珓t報(bào)出錯(cuò)誤。MsgBoxErr.Description+Chr(13)+_OutText,vbCritical,"ERROR"EndSubPrivateSubCommand_Read_Click()'同步讀DimOutTextAsStringDimmyValueAsVariantDimmyQualityAsVariant27裝配與檢測自動(dòng)化事業(yè)部DimmyTimeStampAsVariantOnErrorGoToErrorHandlerOutText="讀ITEM值"ItemObj.ReadOPCDevice,myValue,myQuality,myTimeStampEdit_ReadVal=myValueEdit_ReadQu=GetQualityText(myQuality)Edit_ReadTS=myTimeStampExitSubErrorHandler:MsgBoxErr.Description+Chr(13)+_OutText,vbCritical,"ERROR"EndSubPrivateSubCommand_Write_Click()'同步寫DimOutTextAsStringDimServerhandles(1)AsLongDimMyValues(1)AsVariantDimMyErrors()AsLongOutText="寫值"OnErrorGoToErrorHandlerServerhandles(1)=ItemObj.ServerHandleMyValues(1)=Edit_WriteValGroupObj.SyncWrite1,Serverhandles,MyValues,MyErrorsEdit_WriteRes=ServerObj.GetErrorString(MyErrors(1))ExitSubErrorHandler:MsgBoxErr.Description+Chr(13)+_OutText,vbCritical,"ERROR"EndSub28裝配與檢測自動(dòng)化事業(yè)部PrivateSubCommand_Exit_Click()'停止~刪除ITEM,刪除GROUP~刪除SERVER。DimOutTextAsStringOnErrorGoToErrorHandlerCommand_Start.Enabled=TrueCommand_Read.Enabled=FalseCommand_Write.Enabled=FalseCommand_Exit.Enabled=FalseOutText="刪除對象"SetItemObj=NothingServerObj.OPCGroups.RemoveAllSetGroupObj=NothingServerObj.DisconnectSetServerObj=NothingExitSubErrorHandler:MsgBoxErr.Description+Chr(13)+_OutText,vbCritical,"ERROR"EndSubPrivateFunctionGetQualityText(Quality)AsStringSelectCaseQualityCase0:GetQualityText="BAD"Case64:GetQualityText="UNCERTAIN"Case192:GetQualityText="GOOD"Case8:GetQualityText="NOT_CONNECTED"Case13:GetQualityText="DEVICE_FAILURE"Case16:GetQualityText="SENSOR_FAILURE"Case20:GetQualityText="LAST_KNOWN"Case24:GetQualityText="COMM_FAILURE"Case28:GetQualityText="OUT_OF_SERVICE"Case132:GetQualityText="LAST_USABLE"Case144:GetQualityText="SENSOR_CAL"Case148:GetQualityText="EGU_EXCEEDED"29裝配與檢測自動(dòng)化事業(yè)部Case152:GetQualityText="SUB_NORMAL"Case216:GetQualityText="LOCAL_OVERRIDE"CaseElse:GetQualityText="UNKNOWNERROR"EndSelectEndFunction控件程序清單:OptionExplicitOptionBase1PrivateMyOPCServerAsOPCServerPrivateWithEventsMyOPCGroupAsOPCGroupPrivateMyOPCItems(32767)AsOPCItemPrivateItemsAsOPCItemConstm_def_OpcServerName="OPC.SimaticNET"Constm_def_OpcGroupName="Group"Constm_def_OpcStartAddress="MB0"Constm_def_OpcBufferSize=16'Constm_def_OpcBufStartAddr=0Constm_def_OpcLinkStatus=0Constm_def_LinkEnble=FalseConstm_def_ConnectionType="S7CONNECTION_1"Dimm_OpcServerNameAsStringDimm_OpcGroupNameAsStringDimm_OpcStartAddressAsStringDimm_OpcBufferSizeAsIntegerDimm_LinkEnbleAsBoolean'Dimm_OpcBufStartAddrAsIntegerDimm_OpcLinkStatusAsIntegerDimm_ConnectionTypeAsString'PublicEventOpcDataExchage()PublicPropertyGetOpcServerName()AsVariantOpcServerName=m_OpcServerNameEndProperty30裝配與檢測自動(dòng)化事業(yè)部PublicPropertyLetOpcServerName(ByValvNewValueAsVariant)m_OpcServerName=vNewValuePropertyChanged"OpcServerName"EndPropertyPrivateSubUserControl_InitProperties()m_OpcServerName=m_def_OpcServerNamem_OpcGroupName=m_def_OpcGroupNamem_OpcStartAddress=m_def_OpcStartAddressm_OpcBufferSize=m_def_OpcBufferSizem_LinkEnble=m_def_LinkEnble'm_OpcBufStartAddr=m_def_OpcBufStartAddrm_OpcLinkStatus=m_def_OpcLinkStatusm_ConnectionType=m_def_ConnectionTypeEndSubPublicPropertyGetOpcGroupName()AsVariantOpcGroupName=m_OpcGroupNameEndPropertyPublicPropertyLetOpcGroupName(ByValvNewGroupValueAsVariant)m_OpcGroupName=vNewGroupValuePropertyChanged"OpcGroupName"EndPropertyPrivateSubUserControl_Paint()UserControl.Height=675UserControl.Width=825EndSubPrivateSubUserControl_ReadProperties(PropBagAsPropertyBag)m_OpcServerName=PropBag.ReadProperty("OpcServerName",m_def_OpcServerName)m_OpcGroupName=PropBag.ReadProperty("OpcGroupName",m_def_OpcGroupName)m_OpcStartAddress=PropBag.ReadProperty("OpcStartAddress",m_def_OpcStartAddress)m_OpcBufferSize=PropBag.ReadProperty("OpcBufferSize",m_def_OpcBufferSize)m_LinkEnble=PropBag.ReadProperty("LinkEnble",m_def_LinkEnble)'m_OpcBufStartAddr=PropBag.ReadProperty("OpcBufStartAddr",31裝配與檢測自動(dòng)化事業(yè)部m_def_OpcBufStartAddr)m_OpcLinkStatus=PropBag.ReadProperty("OpcLinkStatus",m_def_OpcLinkStatus)m_ConnectionType=PropBag.ReadProperty("ConnectionType",m_def_ConnectionType)EndSubPrivateSubUserControl_WriteProperties(PropBagAsPropertyBag)CallPropBag.WriteProperty("OpcServerName",m_OpcServerName,m_def_OpcServerName)CallPropBag.WriteProperty("OpcGroupName",m_OpcGroupName,m_def_OpcGroupName)CallPropBag.WriteProperty("OpcStartAddress",m_OpcStartAddress,m_def_OpcStartAddress)CallPropBag.WriteProperty("OpcBufferSize",m_OpcBufferSize,m_def_OpcBufferSize)CallPropBag.WriteProperty("LinkEnble",m_LinkEnble,m_def_LinkEnble)'CallPropBag.WriteProperty("OpcBufStartAddr",m_OpcBufStartAddr,m_def_OpcBufStartAddr)CallPropBag.WriteProperty("OpcLinkStatus",m_OpcLinkStatus,m_def_OpcLinkStatus)CallPropBag.WriteProperty("ConnectionType",m_ConnectionType,m_def_ConnectionType)EndSubPublicPropertyGetOpcStartAddress()AsVariantOpcStartAddress=m_OpcStartAddressEndPropertyPublicPropertyLetOpcStartAddress(ByValvNewAddressAsVariant)m_OpcStartAddress=vNewAddressPropertyChanged"OpcStartAddress"EndPropertyPublicPropertyGetOpcBufferSize()AsIntegerOpcBufferSize=m_OpcBufferSizeEndPropertyPublicPropertyLetOpcBufferSize(ByValvNewDataLenAsInteger)m_OpcBufferSize=vNewDataLenPropertyChanged"OpcBufferSize"EndProperty32裝配與檢測自動(dòng)化事業(yè)部PublicPropertyGetLinkEnble()AsBooleanLinkEnble=m_LinkEnbleEndPropertyPublicPropertyLetLinkEnble(ByValvEnbleAsBoolean)m_LinkEnble=vEnblePropertyChanged"LinkEnble"EndPropertyPublicSubOpcLink()DimItemName(32767)AsStringDimSHandles(32767)AsLong'parametervalueDimValues()AsVariant'returnvalueDimErrors()AsLong'returnvalueDimQualAsVariant'returnvalueDimTSAsVariant'returnvalueDimiAsIntegerDimItemName1,BufferType,strAddrIndexNoDot,strAddrIndexDotAsStringDimstrAddress,strAddressConverted,strAddrIndexAsStringDimCharInputAsStringDimAddrStrTotalLen,BufferTypeLen,AddrIndexLenAsIntegerDimiStep0,iStep1,iStep2,iAddrIndex,iIndexDotPosAsIntegerDimIsBitTypeAsBooleanDimstrIndexIntPart,strIndexDecPartAsStringDimiIndexIntPart,iIndexDecPartAsIntegerDimstrDBNo,strDBBufType,strVarTypeAsStringDimstrItemName(32767)AsStringDimCountAsIntegerCount=1IsBitType=False'm_OpcStartAddress=Text1.Text'獲得OPC起始地址字符AddrStrTotalLen=Len(m_OpcStartAddress)'獲得OPC起始地址字符長度'------------------獲得寄存器類型字符------------------------'ForiStep2=1ToAddrStrTotalLenCharInput=Mid(m_OpcStartAddress,iStep2,1)If((Asc(CharInput)>=65AndAsc(CharInput)<=90)Or(Asc(CharInput)>=97AndAsc(CharInput)<=122))ThenBufferType=BufferType+CharInputElse33裝配與檢測自動(dòng)化事業(yè)部BufferTypeLen=iStep2-1ExitForEndIfNextiStep2BufferType=UCase(BufferType)'寄存器類型字符變大寫'----------------------獲得地址數(shù)據(jù)字符---------------------'ForiStep0=AddrStrTotalLenTo1Step-1CharInput=Mid(m_OpcStartAddress,iStep0,1)If((Asc(CharInput)>=48AndAsc(CharInput)<=57)OrAsc(CharInput)=46)ThenstrAddrIndexDot=CharInput+strAddrIndexDotElseAddrIndexLen=AddrStrTotalLen-iStep0ExitForEndIfNextiStep0ForiStep1=1ToAddrIndexLenCharInput=Mid(strAddrIndexDot,iStep1,1)If((Asc(CharInput)>=48AndAsc(CharInput)<=57))ThenstrAddrIndexNoDot=strAddrIndexNoDot+CharInputElseIsBitType=TrueEndIfNextiStep1IfIsBitType=TrueTheniIndexDecPart=Val(Right(strAddrIndexNoDot,1))

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論