14使用VBNET創(chuàng)建應(yīng)用程序_第1頁
14使用VBNET創(chuàng)建應(yīng)用程序_第2頁
14使用VBNET創(chuàng)建應(yīng)用程序_第3頁
14使用VBNET創(chuàng)建應(yīng)用程序_第4頁
14使用VBNET創(chuàng)建應(yīng)用程序_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、使用使用VB.Net創(chuàng)建一個應(yīng)用程序創(chuàng)建一個應(yīng)用程序概述概述 使用我們之前保存的CogJobManager(CJM)可以在6個簡單的步驟中開發(fā)我們的應(yīng)用程序。 每個步驟將教您VisionPro編程的一個方面的內(nèi)容q步驟1:創(chuàng)建并且運行最簡單的應(yīng)用程序。q步驟2: 處理CJM“停止”事件。q步驟3: 正確地處理CJM 事件。q步驟4: 獲取CJM結(jié)果。q步驟5: 使用一個顯示控件。q步驟6: 執(zhí)行自定義行為。步驟步驟1 重要的事情先做重要的事情先做 打開VisualStudio 2005 創(chuàng)建一個VB.NET Windows應(yīng)用程序并命名為 “VBSampleApp”。 添加參數(shù)到.NET 集:

2、qCognex.VisionPro 定義低級別對象qCognex.VisionPro.Core 更多低級別的東西qCognex.VisionPro.QuickBuild.Core CogJobManager 位于此處。步驟步驟1 回顧參數(shù)回顧參數(shù)我們?yōu)槭裁刺砑幽切﹨?shù)?因為您必須明確地引用定義您想要使用的VisionPro類對象的任何集。您需要知道哪些集包含哪些對象。有兩種方式可以幫助您了解:q文件:每個類頁列出所需要的集。q常識:用于斑點工具的對象在Cognex.VisionPro.Blob.dll中。用于斑點的控件在Cognex.VisionPro.Blob.Controls.dll中步驟

3、步驟1 名稱空間名稱空間記住所有.NET對象在名稱空間中定義 。例如,低級別的VisionPro對象在 Cognex.VisionPro名稱空間中。CogJobManager 位于Cognex.VisionPro.QuickBuild名稱空間中。要了解VisionPro名稱空間有多種方法:q文件:每個類頁列出所有的名稱空間。qVisualStudio 對象瀏覽器顯示所有的名稱空間。q常識:用于斑點類和控件的名稱空間是Cognex.VisionPro.Blob。步驟步驟1 導(dǎo)入您的名稱空間導(dǎo)入您的名稱空間 我們將“導(dǎo)入”我們想要使用的對象的名稱空間。 這會減少輸入并且使得代碼更清潔。 在Visu

4、alStudio中打開“Form1.vb”的代碼窗口并在頂部鍵入:Imports Cognex.VisionProImports Cognex.VisionPro.QuickBuildPublic Class Form1End Class步驟步驟1 聲明對象變量聲明對象變量 另外在您的 “Form1”類中鍵入三個實例變量的聲明:Public Class Form1 Private myJobManager As CogJobManager Private myJob As CogJob Private myIndependentJob As CogJobIndependentEnd Class

5、 很快將使用到這些變量。步驟步驟1 準(zhǔn)備加載一個文件準(zhǔn)備加載一個文件 復(fù)制AE_QBSample.vpp文件到您的“VBSampleApp”目錄下。 我們的應(yīng)用程序?qū)⒃陂_始時加載該文件并且萃取所保存的CogJobManager。 以下為實現(xiàn)方法:q回到VisualStudio,切換標(biāo)簽到 GUI 設(shè)計器并在您的窗體上雙擊。q這會創(chuàng)建一個“Form1_Load()”方法,當(dāng)首次加載您的應(yīng)用程序時會調(diào)用。q在迅速復(fù)習(xí)事件操作者之后,我們會在該函數(shù)中加載我們的.vpp文件。步驟步驟1 復(fù)習(xí)事件操作者復(fù)習(xí)事件操作者記住 .NET事件允許對象在發(fā)生特殊事情時通知其他對象。事件作為一個函數(shù)調(diào)用來執(zhí)行。要接

6、受通知的對象必須:q定義一個方法在事件發(fā)生時調(diào)用。q為該“操作者”提供一個指針指向發(fā)出通知的對象。Form1_Load() 是一個事件操作者: 它處理窗體的加載事件。當(dāng)您在窗體上雙擊時,VisualStudio自動執(zhí)行必要的動作:q定義Form1_Load()操作者,并且q告知窗體在加載時調(diào)用該方法。步驟步驟1 加載您的加載您的.vpp文件文件 現(xiàn)在讓我們填寫新的操作者。 將以下代碼添加到Form1_Load: Depersist通過QuickBuild保存CogJobManagermyJobManager = CType(CogSerializer.LoadObjectFromFile( _

7、 .AE_QBSample.vpp), CogJobManager) 該代碼使用CogSerializer加載給定的.vpp文件作為一個.NET對象。 我們知道返回的對象實際上是一個CogJobManager,而且我們在將其賦予我們的局部變量之前使用 “CType” 將其適當(dāng)?shù)貜?qiáng)制轉(zhuǎn)換。步驟步驟1 變量初始化變量初始化 另外將以下代碼也添加到Form1_Load:myJob = myJobManager.Job(0)myIndependentJob = myJob.OwnedIndependent 第一行初始化變量“myJob”引用CogJobManager中的(并且只限)第一件工作。 第二行

8、初始化一個參數(shù)引用包含更多關(guān)于CogJobManager的信息的一個不同對象。 現(xiàn)在不必?fù)?dān)心“獨立的”東西。其為需要的但不是很重要。步驟步驟1 刷新所有刷新所有CJM隊列隊列 現(xiàn)在將以下代碼添加到Form1_Load: 刷新隊列myJobManager.UserQueueFlush()myJobManager.FailureQueueFlush()myJob.ImageQueueFlush()myIndependentJob.RealTimeQueueFlush() 這些行代碼清空所有CogJobManager隊列,刷新陳舊的圖像和結(jié)果。 將這些行作為樣板代碼處理:只是將它們逐字地添加到使用所

9、存儲的CogJobManager的任何應(yīng)用程序。 Form1_Load方法現(xiàn)在已經(jīng)完成 。步驟步驟1 完美地關(guān)閉完美地關(guān)閉在窗體加載時我們只是初始化了我們的CJM,現(xiàn)在當(dāng)關(guān)閉窗體時我們也需要關(guān)閉CJM。以下為操作步驟:q在VisualStudio中,從位于代碼窗口頂部的右手下拉框中選擇 “FormClosing”事件。q這會創(chuàng)建一個Form1_FormClosing方法,在關(guān)閉窗體時調(diào)用。q將以下代碼添加到方法中: 確信關(guān)閉了CogJobManager!myJobManager.Shutdown()將該代碼添加到使用CogJobManager的任何應(yīng)用程序。步驟步驟1 無聲的試驗無聲的試驗 #

10、1現(xiàn)在您已經(jīng)建立一個加載所保存的CogJobManager并且能適當(dāng)?shù)仃P(guān)閉它的應(yīng)用程序。進(jìn)行實驗時:q在命令行中添加一個調(diào)用LoadObjectFromFile()的斷點。q運行您的應(yīng)用程序。q(現(xiàn)在可以是調(diào)整任何編譯錯誤的最佳時間。)q當(dāng)達(dá)到斷點時,瀏覽“線程”窗口。q有多少線程?q將調(diào)試程序進(jìn)行到代碼的下一行。q現(xiàn)在您能看到多少線程?步驟步驟1 為什么能完美地關(guān)閉?為什么能完美地關(guān)閉? 正如您所看到的,CJM 建立了多個線程:CJM線程 您必須調(diào)用您必須調(diào)用CJM Shutdown()方法將它們適當(dāng)?shù)厍宄椒▽⑺鼈冞m當(dāng)?shù)厍宄?。掉。步驟步驟1 創(chuàng)建您的創(chuàng)建您的GUI運行您的應(yīng)用程序?有點煩

11、,嗯?決不要運行CJM。停止運行應(yīng)用程序,添加一個“運行一次(Run Once)”按鈕。以下為實現(xiàn)方法:q在VisualStudio中瀏覽 GUI設(shè)計器窗口。q 將一按鈕從工具箱的”常用控件”處拖到窗體上。q將按鈕的文本改為“運行一次”。q修改按鈕的名稱為“運行一次按鈕(RunOnceButton)”。q在按鈕上雙擊自動生成RunOnceButton_Click 方法。步驟步驟1 添加按鈕代碼添加按鈕代碼 我們想要RunOnceButton_Click運行的CogJobManager。 因此需要添加以下代碼:Try myJobManager.Run()Catch ex As Exception

12、 MessageBox.Show(ex.Message)End Try 注意使用一個Try/Catch代碼塊以確保錯誤被適當(dāng)?shù)靥幚?。步驟步驟1 完成完成我們現(xiàn)在已經(jīng)完成了步驟1。我們建立了一個簡單的應(yīng)用程序,使用我們保存的CJM并且可以自行運行。運行您的應(yīng)用程序來測試它。點擊“運行一次”按鈕。享受成功帶來的喜悅吧?,F(xiàn)在盡可能快地點擊運行一次按鈕注意您很快會從 “CogJobManager1”得到一個錯誤。享受夠了吧。在步驟2中,我們將學(xué)習(xí)這是什么樣的錯誤,以及使用來自CJM的事件來校正它。步驟步驟2 校正錯誤校正錯誤在步驟1中我們通過調(diào)用以下函數(shù)運行我們的CJM: myJobManager.R

13、un()問題在于我們忘記閱讀一下手冊:qRun() 是一個非同步方法:它開始運行我們的工作并且立即返回。q如果您試圖運行一個還沒有完成的工作,Run() 會拋出一個錯誤。校正方法:我們的應(yīng)用程序應(yīng)該使得“運行一次”按鈕失效,直到完成此前的運行。要使得該按鈕失效,在調(diào)用Run()之前需添加以下這行代碼:RunOnceButton.Enabled = False步驟步驟2 CJM停止事件停止事件 當(dāng)所有工作已經(jīng)完成運行時,CJM啟動一個“停止”事件。 當(dāng)該事件啟動時我們將再次激活該按鈕。 以下為實現(xiàn)方法:q在我們級別的最后,鍵入以下停止事件的操作者:Private Sub myJobManager

14、_Stopped(ByVal sender As Object, _ ByVal e As CogJobManagerActionEventArgs) RunOnceButton.Enabled = TrueEnd Sub End Class步驟步驟2 注冊操作者注冊操作者 除了聲明我們的操作者之外,我們還必須確保我們的CJM能調(diào)用它。 按照以下方法注冊操作者:q在Form1_Load()的最后鍵入: 為停止事件注冊操作者 AddHandler myJobManager.Stopped, _ AddressOf myJobManager_StoppedEnd SubqAddHandler的第一

15、個參數(shù)是我們想要處理的事件。q其第二個參數(shù)是指向操作者的指針。步驟步驟2 注銷操作者注銷操作者 在關(guān)閉之前注銷CJM事件操作者總是個好主意。 按照以下方法注銷操作者:q在Form1_FormClosing()的頂部鍵入:為停止事件注銷操作者RemoveHandler myJobManager.Stopped, _ AddressOf myJobManager_Stopped 確保關(guān)閉CogJobManager!步驟步驟2 關(guān)于關(guān)于VB.NET的一個警告的一個警告一些VB用戶不使用添加/刪除操作者。VisualStudio為VB應(yīng)用程序中的事件提供不同的方法創(chuàng)建和注冊操作者。如果您聲明一個變量為

16、“WithEvents”,VisualStudio將顯示該對象可用的事件下拉列表。從列表中選擇一個事件將自動:q為其定義一個操作者,并且q注冊操作者和該對象。這種技巧很“容易”但是不允許您控制注冊或者注銷操作者的時間。在我們的應(yīng)用程序中,停止事件必須在關(guān)閉CogJobManager之前注銷。步驟步驟2 完成完成現(xiàn)在我們完成了步驟2。我們使用了CJM 停止事件確保用戶不會運行工作,除非其已被停止。運行您的應(yīng)用程序測試一下。點擊“運行一次”按鈕。您會立即得到一個無效操作異常( InvalidOperationException )提示“交叉線程運算無效” 。開始對本課程的教員持有嚴(yán)重的懷疑。在步驟

17、3中我們將學(xué)習(xí)這是什么錯誤以及如何使用標(biāo)準(zhǔn).NET函數(shù)來校正它。步驟步驟3 現(xiàn)在什么出錯了呢?現(xiàn)在什么出錯了呢?我們又一次忘記閱讀文件了。這次我們需要看看微軟的文件: 文件中說:每個Windows窗體控件只可以通過創(chuàng)建它的線程來訪問。還記得CJM創(chuàng)建的所有那些線程嗎?它們沒有在您的GUI上創(chuàng)建按鈕,但是它們中的一個調(diào)用了您的停止事件操作者。并且您的事件操作者正在訪問該按鈕。因此:出現(xiàn)一項錯誤。步驟步驟3 校正大綱校正大綱Microsoft有一個標(biāo)準(zhǔn)技巧用于校正該問題。以下為其工作的方法:q將其添加到您的停止事件操作者的頂部:If InvokeRequired Then 創(chuàng)建一個指針指向該函數(shù)

18、在正確的線程上調(diào)用同一個函數(shù) ReturnEnd Ifq很快我們將使用真實代碼替換注釋。q現(xiàn)在,注意“InvokeRequired”是每個控件的魔術(shù)屬性。如果您處于錯誤的線程上它會返回到“正確( True)”。q如果我們處于錯誤的線程上,其計劃是切換到適當(dāng)?shù)木€程并且遞歸調(diào)用同一個函數(shù)。步驟步驟3 創(chuàng)建一個委托創(chuàng)建一個委托在.NET中有一個被稱為“委托(delegate)”的函數(shù)指針。在我們可以在正確的線程上調(diào)用我們的事件操作者之前,必須創(chuàng)建一個指向它的委托。以下為實現(xiàn)方法:q就在您的停止事件操作者之前添加該委托: 簽名必須匹配CJM事件的委托。Delegate Sub myJobManager

19、Delegate(ByVal sender As Object, _ ByVal e As CogJobManagerActionEventArgs)q這定義了一個有預(yù)期簽名的委托。q在您的事件操作者中適當(dāng)?shù)奈恢蒙蟿?chuàng)建該委托的一個實例:創(chuàng)建一個指向該函數(shù)的指針Dim myDel As New myJobManagerDelegate( _ AddressOf myJobManager_Stopped)步驟步驟3 使用適當(dāng)?shù)木€程使用適當(dāng)?shù)木€程 我們最終的方法是在適當(dāng)?shù)木€程上調(diào)用我們的委托實例(即我們的事件操作者)。 以下為實現(xiàn)方法::q在您的事件操作者的正確地方添加以下這兩行代碼:在正確的線程上

20、調(diào)用同一個函數(shù)Dim eventArgs() As Object = sender, eInvoke(myDel, eventArgs)q第一行為調(diào)用定義了一個數(shù)組參數(shù)。q第二行使用控件的魔術(shù)“調(diào)用( Invoke )”方法在GUI線程上調(diào)用我們的委托。步驟步驟3 完成完成現(xiàn)在我們完成了步驟3。我們使用不到10行的代碼確保我們的按鈕只可由創(chuàng)建它的線程訪問。我們使用的技巧是一個標(biāo)準(zhǔn)的微軟做法。您應(yīng)該徹底學(xué)習(xí)它,并且在GUI項目可能被非適當(dāng)線程調(diào)用的地方使用。運行您的應(yīng)用程序測試一下。點擊“運行一次”按鈕。注意不會有更多的錯誤。對本課程開始感覺好些了吧。在步驟4中我們將開始讓我們的GUI更加有意思

21、。步驟步驟4 優(yōu)化優(yōu)化GUI在步驟4中我們將以兩種方式更新GUI:q我們將添加一個“連續(xù)運行”按鈕,并且q我們將在我們工作運行時顯示其運行狀態(tài)。我們先從“連續(xù)運行”按鈕開始。我們想要該按鈕在兩個狀態(tài)之間切換:“按下”和“未按”。在“按下”狀態(tài)我們的CJM應(yīng)該處于運行中,而在“未按”狀態(tài)我們的CJM應(yīng)該被停止。得到這一動作的好辦法是使用復(fù)選框控件來制作該按鈕。步驟步驟4 連續(xù)運行連續(xù)運行以下為實現(xiàn)方法: 添加復(fù)選框:q在設(shè)計器中,將復(fù)選框拖放到您的窗體上。q修改“外觀”屬性為“按鈕”。q修改按鈕文本為“連續(xù)運行”。q修改按鈕名稱為“運行內(nèi)容檢驗盒( RunContCheckBox )”。q在復(fù)選

22、框上雙擊并且在其創(chuàng)建的“CheckedChanged”方法中鍵入下列各行代碼:If (RunContCheckBox.Checked) Then Try RunOnceButton.Enabled = False myJobManager.RunContinuous() Catch ex As Exception MessageBox.Show(ex.Message) End TryElse . . . 下頁幻燈片繼續(xù). . .步驟步驟4連續(xù)運行(續(xù))連續(xù)運行(續(xù))q繼續(xù)鍵入:另外 Try RunContCheckBox.Enabled = False myJobManager.Stop()

23、Catch ex As Exception MessageBox.Show(ex.Message) End TryEnd If該代碼告訴我們CJM在復(fù)選框被勾選時,執(zhí)行RunContinuous() 或者Stop() 。在我們開始運行時,它還使得“運行一次”按鈕失效,而在我們等待CJM停止時使得“連續(xù)運行”按鈕失效。步驟步驟4 連續(xù)運行(結(jié)束)連續(xù)運行(結(jié)束) 我們只需要再添加兩行代碼:q在停止事件操作者底部添加一行:RunOnceButton.Enabled = TrueRunContCheckBox.Enabled = True 在停止時激活q在RunOnceButton_Clicked方

24、法添加另一行如下代碼:RunOnceButton.Enabled = FalseRunContCheckBox.Enabled = False 如果運行就失效 我們的新按鈕已經(jīng)完成。 花一分鐘時間測試一下。步驟步驟4避免死鎖避免死鎖 注意:我們現(xiàn)在可以在應(yīng)用程序運行期間關(guān)閉它。 但很快如果用戶關(guān)閉正在運行的應(yīng)用程序,我們添加的代碼將會死鎖。 要避免死鎖,我們將防止用戶在應(yīng)用程序運行時關(guān)閉它。 在運行時,我們將刪除允許用戶關(guān)閉應(yīng)用程序的“X”按鈕。 以下為實現(xiàn)方法::q在RunOnceButton_Click() 中添加:ControlBox = FalseRunOnceButton.Enabl

25、ed = Falseq在RunContCheckBox_CheckedChanged()中添加:ControlBox = FalseRunOnceButton.Enabled = Falseq在myJobManager_Stopped()中添加:ControlBox = True RunOnceButton.Enabled = True “ControlBox”是您窗體的一個屬性。它控件名稱欄按鈕是否可見。步驟步驟4 避免死鎖(續(xù))避免死鎖(續(xù))步驟步驟4 顯示運行狀態(tài)(顯示運行狀態(tài)( RunStatus )現(xiàn)在我們將更新 GUI顯示運行狀態(tài)。在您的窗體上添加一個文本框控件,將其命名為“Run

26、StatusTextBox”。現(xiàn)在GUI 可能看起來有如下圖:步驟步驟4 運行狀態(tài)在使用者列隊中運行狀態(tài)在使用者列隊中步驟步驟4 事件和線程處理事件和線程處理 我們要從使用者列隊中調(diào)取運行狀態(tài)并在我們的新文本框中顯示。 這一切必須在我們將要編寫的新事件操作者中將進(jìn)行。 該操作者將用于UserResultAvailable事件。 什么線程會激活該事件? 什么線程被允許接觸文本框? 沒有關(guān)系。我們將不得不使用標(biāo)準(zhǔn)技巧避免交叉線程調(diào)用。步驟步驟4 編寫操作者的代碼編寫操作者的代碼在我們級別的最后,添加一個新操作者:Private Sub myJobManager_UserResultAvailabl

27、e( _ ByVal sender As Object, _ ByVal e As CogJobManagerActionEventArgs) If InvokeRequired Then 創(chuàng)建一個指針指向該函數(shù) Dim myDel As New myJobManagerDelegate( _ AddressOf myJobManager_UserResultAvailable) 在正確的線程上調(diào)用同一個函數(shù) Dim eventArgs() As Object = sender, e Invoke(myDel, eventArgs) Return End IfEnd Sub End Class

28、這確保適當(dāng)?shù)木€程處理(但是沒有作用)。現(xiàn)在給操作者添加“真實”代碼:Dim topRecord As Cognex.VisionPro.ICogRecord = _ myJobManager.UserResultRunStatusTextBox.Text = _ topRecord.SubRecords(UserResultTag).Content & : _ & topRecord.SubRecords(JobName).Content & - _ & topRecord.SubRecords(RunStatus).Content.ToString在第一行調(diào)取下一個結(jié)果包。注意您必須完全給予

29、ICogRecord資格。其他行代碼創(chuàng)建包含以下內(nèi)容的字符串:q結(jié)果包的序列號,q公布該包的工作的名稱,以及q目標(biāo)運行狀態(tài)(作為一個字符串)。該字符串被放置在文本框中。步驟步驟4編寫操作者的代碼(續(xù))編寫操作者的代碼(續(xù))步驟步驟4 注冊操作者注冊操作者如以前一樣,我們需要注冊操作者:q在Form1_Load()的底部鍵入: 為UserResultAvailable事件注冊操作者 AddHandler myJobManager.UserResultAvailable, _ AddressOf myJobManager_UserResultAvailableEnd Sub按照以下方法注銷操作者:

30、q在Form1_FormClosing() 中鍵入: 為UserResultAvailable事件注銷操作者 RemoveHandler myJobManager.UserResultAvailable, _ AddressOf myJobManager_UserResultAvailable 確保關(guān)閉CogJobManager! 現(xiàn)在我們完成了步驟4。 我們更新了我們的GUI使其更加“真實”。 我們學(xué)習(xí)了如何從使用者結(jié)果列隊獲得運行狀態(tài) (以及其他信息)。 我們再次看到在編寫GUI應(yīng)用程序代碼時必須細(xì)心考慮線程。 運行您的應(yīng)用程序測試一下。 在步驟5中,我們將使GUI更好。步驟步驟4 完成完

31、成在步驟5將通過添加一個顯示圖像的控件來改進(jìn)我們應(yīng)用程序的GUI。這將是我們第一個非微軟的控件。共有四個 VisionPro顯示控件可供選擇: CogToolDisplay CogRecordsDisplay CogRecordDisplay CogDisplay1)讓我們看看它們每個都能做些什么。步驟步驟5 添加一個顯示控件添加一個顯示控件CogToolDisplay:這是您在QuickBuild中能夠看見的“標(biāo)準(zhǔn)”控件。 它是四個控件中最復(fù)雜的一個。它知道如何連接到VisionPro工具以及如何調(diào)取該工具的所有檢查記錄。它通過顯示區(qū)上方的一個下列框允許用戶選擇瀏覽哪些圖像記錄。步驟步驟5

32、CogToolDisplayCogRecordsDisplay:該控件看起來與CogToolDisplay相同。和CogToolDisplay一樣,它允許用戶通過下拉列表選擇一個圖像記錄。而且和CogToolDisplay一樣, 它顯示所選圖像的任何圖形子記錄。但是它對VisionPro工具一無所知。該控件不能從相關(guān)的VisionPro工具獲得一 個CogRecords樹;您必須使用編程的方法提供。步驟步驟5 CogRecordsDisplayCogRecordDisplay:該控件將顯示單個圖像記錄及其圖形的子記錄。該控件沒有下拉列表框,不允許用戶選擇圖像。CogRecordDisplay對

33、 VisionPro 工具一無所知。您必須為該控件提供一個包含單個圖像的CogRecord樹。步驟步驟5 CogRecordDisplayCogDisplay:CogDisplay是最低級別的顯示控件。由所有其他顯示控件來使用。該控件對VisionPro工具或 CogRecords一無所知。它不允許用戶選擇不同的圖像。該控件只顯示一個圖像和一組圖形。圖像和圖形必須通過編程來提供。步驟步驟5 CogDisplay 對于我們自定義的應(yīng)用程序我們將使用CogRecordDisplay。 沒有下拉框,因此我們的代碼將控制在顯示區(qū)顯示的內(nèi)容。 我們將顯示 “LastRun.CogFixtureTool1

34、.OutputImage”記錄,因為它含有距離圖形。 在VisualStudio中我們的第一步是引用包含我們控件的集: Cognex.VisionPro.Controls,和Cognex.VisionPro.Display.Controls步驟步驟5 選擇選擇CogRecordDisplay步驟步驟5 添加添加CogRecordDisplay 現(xiàn)在:q將CogRecordDisplay拖放到窗體上。q在它正下方放置CogDisplayStatusBar。記住在關(guān)閉應(yīng)用程序時要處理所有VisionPro控件q在Form1_FormClosing() 底部添加: 明確地處理所有VisionPro控

35、件 CogDisplayStatusBar1.Dispose() CogRecordDisplay1.Dispose()End Sub連接CogDisplayStatusBar 到顯示區(qū):q在Form1_Load() 的底部鍵入: 連接狀態(tài)欄 CogDisplayStatusBar1.Display = CogRecordDisplay1End Sub步驟步驟5 開始編碼開始編碼 在UserResultAvailable操作者的最后添加: Dim tmpRecord As Cognex.VisionPro.ICogRecord 假定所需記錄存在并且取得。 tmpRecord = topReco

36、rd.SubRecords(ShowLastRunRecordForUserQueue) tmpRecord = tmpRecord.SubRecords(LastRun) tmpRecord = tmpRecord.SubRecords(CogFixtureTool1.OutputImage) CogRecordDisplay1.Record = tmpRecord CogRecordDisplay1.Fit(True) End Sub 這些代碼進(jìn)入結(jié)果包取得我們想要的圖像記錄。 然后記錄被傳遞到顯示區(qū)。步驟步驟5 完成編碼完成編碼 現(xiàn)在我們完成了步驟5。 我們學(xué)習(xí)了顯示控件并在我們應(yīng)用程序

37、GUI中添加了一個。 運行您的應(yīng)用程序測試一下。 在步驟6中我們將添加更多的功能。步驟步驟5 完成完成步驟步驟6 定制您的應(yīng)用程序定制您的應(yīng)用程序 在VisualStudio中創(chuàng)建應(yīng)用程序的主要原因在于提供自定義動作。 我們將定制我們的應(yīng)用程序這樣用戶可以從GUI中重新訓(xùn)練PatMax 模型。 我們將添加一個復(fù)選框式按鈕,允許用戶看見訓(xùn)練圖像并操縱訓(xùn)練區(qū)域。 我們將添加一個單獨的“重新訓(xùn)練”按鈕,可以在顯示訓(xùn)練圖像的時候按下。您已經(jīng)知道:每個Windows窗體控件只可以通過創(chuàng)建它的線程來訪問。 在您執(zhí)行自定義動作時您還必須記?。海◣缀酰┟總€VisionPro 對象每次只能由一個線程使用。例如,

38、這意味著在視覺工具的工作運行期間您不得試圖訪問它。您不可以讀寫屬性或者調(diào)用方法。這條規(guī)則的一個顯著例外是:CogJob和CogJobManager中的隊列可以“同時”由多個線程使用。步驟步驟6 再說說線程再說說線程 我們需要確保我們的應(yīng)用程序遵守VisionPro的線程要求。 我們的計劃是確保用戶在應(yīng)用程序運行期間不能重新訓(xùn)練PatMax圖案。 并且確保用戶在他們重新訓(xùn)練圖案時不能運行應(yīng)用程序。 我們一次將只激活一組按鈕。步驟步驟6 關(guān)于線程關(guān)于線程 首先添加一個新的復(fù)選框到您的窗體上:q修改其“外觀”屬性為“按鈕”。q修改按鈕的文本為“顯示訓(xùn)練圖像”。q修改按鈕名稱為“顯示訓(xùn)練檢查盒( Sh

39、owTrainCheckBox )”。 另外還添加一個新按鈕到您的窗體上:q修改按鈕的文本為“重新訓(xùn)練”。q修改按鈕名稱為“ 再訓(xùn)練按鈕( RetrainButton )”。q修改“激活”屬性為“錯誤( False )”。 默認(rèn)狀態(tài)下我們已經(jīng)使得我們的重新訓(xùn)練按鈕失效。步驟步驟6 添加自定義按鈕添加自定義按鈕 現(xiàn)在我們來添加一些代碼,這樣我們的復(fù)選框在運行CJM時會失效:q在RunOnceButton_Click()中添加:RunContCheckBox.Enabled = False Disable if runningShowTrainCheckBox.Enabled = Falseq在R

40、unContCheckBox_CheckedChanged()中添加:RunOnceButton.Enabled = FalseShowTrainCheckBox.Enabled = Falseq在myJobManager_Stopped()中添加:RunContCheckBox.Enabled = True Enable when stoppedShowTrainCheckBox.Enabled = True步驟步驟6 在運行時失效在運行時失效步驟步驟6 更多的按鈕邏輯更多的按鈕邏輯下一步,我們將確保用戶在他們?yōu)g覽訓(xùn)練圖像時不能運行CJM。在“顯示訓(xùn)練圖像”復(fù)選框上雙擊并且添加以下代碼:If (ShowTrainCheckBox.Checked) Then RunOnceButton.Enabled = False RunContCheckBox.Enabled = False RetrainButton.Enabled = TrueElse RunOnceButton.Enabled = True RunContCheckBox.Enabled = True Retrain

溫馨提示

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

評論

0/150

提交評論