收藏 分享(赏)

vp14-1-buildingapp-cn.pptx

上传人:无敌 文档编号:21581 上传时间:2018-03-04 格式:PPTX 页数:63 大小:515.94KB
下载 相关 举报
vp14-1-buildingapp-cn.pptx_第1页
第1页 / 共63页
vp14-1-buildingapp-cn.pptx_第2页
第2页 / 共63页
vp14-1-buildingapp-cn.pptx_第3页
第3页 / 共63页
vp14-1-buildingapp-cn.pptx_第4页
第4页 / 共63页
vp14-1-buildingapp-cn.pptx_第5页
第5页 / 共63页
点击查看更多>>
资源描述

1、使用VB.Net创建一个应用程序,概述,使用我们之前保存的CogJobManager(CJM)可以在6个简单的步骤中开发我们的应用程序。每个步骤将教您VisionPro编程的一个方面的内容步骤1:创建并且运行最简单的应用程序。步骤2: 处理CJM“停止”事件。步骤3: 正确地处理CJM 事件。步骤4: 获取CJM结果。步骤5: 使用一个显示控件。步骤6: 执行自定义行为。,步骤1 重要的事情先做,打开VisualStudio 2005创建一个VB.NET Windows应用程序并命名为 “VBSampleApp”。添加参数到.NET 集:Cognex.VisionPro 定义低级别对象Cogn

2、ex.VisionPro.Core 更多低级别的东西Cognex.VisionPro.QuickBuild.Core CogJobManager 位于此处。,步骤1 回顾参数,我们为什么添加那些参数?因为您必须明确地引用定义您想要使用的VisionPro类对象的任何集。您需要知道哪些集包含哪些对象。有两种方式可以帮助您了解:文件:每个类页列出所需要的集。常识:用于斑点工具的对象在Cognex.VisionPro.Blob.dll中。用于斑点的控件在Cognex.VisionPro.Blob.Controls.dll中,步骤1 名称空间,记住所有.NET对象在名称空间中定义 。例如,低级别的Vi

3、sionPro对象在 Cognex.VisionPro名称空间中。CogJobManager 位于Cognex.VisionPro.QuickBuild名称空间中。要了解VisionPro名称空间有多种方法:文件:每个类页列出所有的名称空间。VisualStudio 对象浏览器显示所有的名称空间。常识:用于斑点类和控件的名称空间是Cognex.VisionPro.Blob。,步骤1 导入您的名称空间,我们将“导入”我们想要使用的对象的名称空间。这会减少输入并且使得代码更清洁。在VisualStudio中打开“Form1.vb”的代码窗口并在顶部键入:Imports Cognex.VisionP

4、roImports Cognex.VisionPro.QuickBuildPublic Class Form1End Class,步骤1 声明对象变量,另外在您的 “Form1”类中键入三个实例变量的声明:Public Class Form1 Private myJobManager As CogJobManager Private myJob As CogJob Private myIndependentJob As CogJobIndependentEnd Class很快将使用到这些变量。,步骤1 准备加载一个文件,复制AE_QBSample.vpp文件到您的“VBSampleApp”目录

5、下。我们的应用程序将在开始时加载该文件并且萃取所保存的CogJobManager。以下为实现方法:回到VisualStudio,切换标签到 GUI 设计器并在您的窗体上双击。这会创建一个“Form1_Load()”方法,当首次加载您的应用程序时会调用。在迅速复习事件操作者之后,我们会在该函数中加载我们的.vpp文件。,步骤1 复习事件操作者,记住 .NET事件允许对象在发生特殊事情时通知其他对象。事件作为一个函数调用来执行。要接受通知的对象必须:定义一个方法在事件发生时调用。为该“操作者”提供一个指针指向发出通知的对象。Form1_Load() 是一个事件操作者: 它处理窗体的加载事件。当您在

6、窗体上双击时,VisualStudio自动执行必要的动作:定义Form1_Load()操作者,并且告知窗体在加载时调用该方法。,步骤1 加载您的.vpp文件,现在让我们填写新的操作者。将以下代码添加到Form1_Load: Depersist通过QuickBuild保存CogJobManagermyJobManager = CType(CogSerializer.LoadObjectFromFile( _ .AE_QBSample.vpp), CogJobManager)该代码使用CogSerializer加载给定的.vpp文件作为一个.NET对象。我们知道返回的对象实际上是一个CogJobM

7、anager,而且我们在将其赋予我们的局部变量之前使用 “CType” 将其适当地强制转换。,步骤1 变量初始化,另外将以下代码也添加到Form1_Load:myJob = myJobManager.Job(0)myIndependentJob = myJob.OwnedIndependent第一行初始化变量“myJob”引用CogJobManager中的(并且只限)第一件工作。第二行初始化一个参数引用包含更多关于CogJobManager的信息的一个不同对象。现在不必担心“独立的”东西。其为需要的但不是很重要。,步骤1 刷新所有CJM队列,现在将以下代码添加到Form1_Load: 刷新队列

8、myJobManager.UserQueueFlush()myJobManager.FailureQueueFlush()myJob.ImageQueueFlush()myIndependentJob.RealTimeQueueFlush()这些行代码清空所有CogJobManager队列,刷新陈旧的图像和结果。将这些行作为样板代码处理:只是将它们逐字地添加到使用所存储的CogJobManager的任何应用程序。Form1_Load方法现在已经完成 。,步骤1 完美地关闭,在窗体加载时我们只是初始化了我们的CJM,现在当关闭窗体时我们也需要关闭CJM。以下为操作步骤:在VisualStudio

9、中,从位于代码窗口顶部的右手下拉框中选择 “FormClosing”事件。这会创建一个Form1_FormClosing方法,在关闭窗体时调用。将以下代码添加到方法中: 确信关闭了CogJobManager!myJobManager.Shutdown()将该代码添加到使用CogJobManager的任何应用程序。,步骤1 无声的试验 #1,现在您已经建立一个加载所保存的CogJobManager并且能适当地关闭它的应用程序。进行实验时:在命令行中添加一个调用LoadObjectFromFile()的断点。运行您的应用程序。(现在可以是调整任何编译错误的最佳时间。)当达到断点时,浏览“线程”窗口

10、。有多少线程?将调试程序进行到代码的下一行。现在您能看到多少线程?,步骤1 为什么能完美地关闭?,正如您所看到的,CJM 建立了多个线程:,CJM线程,您必须调用CJM Shutdown()方法将它们适当地清除掉。,步骤1 创建您的GUI,运行您的应用程序?有点烦,嗯?决不要运行CJM。停止运行应用程序,添加一个“运行一次(Run Once)”按钮。以下为实现方法:在VisualStudio中浏览 GUI设计器窗口。 将一按钮从工具箱的”常用控件”处拖到窗体上。将按钮的文本改为“运行一次”。修改按钮的名称为“运行一次按钮(RunOnceButton)”。在按钮上双击自动生成RunOnceBut

11、ton_Click 方法。,步骤1 添加按钮代码,我们想要RunOnceButton_Click运行的CogJobManager。因此需要添加以下代码:Try myJobManager.Run()Catch ex As Exception MessageBox.Show(ex.Message)End Try注意使用一个Try/Catch代码块以确保错误被适当地处理。,步骤1 完成,我们现在已经完成了步骤1。我们建立了一个简单的应用程序,使用我们保存的CJM并且可以自行运行。运行您的应用程序来测试它。点击“运行一次”按钮。享受成功带来的喜悦吧。现在尽可能快地点击运行一次按钮注意您很快会从 “Co

12、gJobManager1”得到一个错误。享受够了吧。在步骤2中,我们将学习这是什么样的错误,以及使用来自CJM的事件来校正它。,步骤2 校正错误,在步骤1中我们通过调用以下函数运行我们的CJM: myJobManager.Run()问题在于我们忘记阅读一下手册:Run() 是一个非同步方法:它开始运行我们的工作并且立即返回。如果您试图运行一个还没有完成的工作,Run() 会抛出一个错误。校正方法:我们的应用程序应该使得“运行一次”按钮失效,直到完成此前的运行。要使得该按钮失效,在调用Run()之前需添加以下这行代码:RunOnceButton.Enabled = False,步骤2 CJM停止

13、事件,当所有工作已经完成运行时,CJM启动一个“停止”事件。当该事件启动时我们将再次激活该按钮。以下为实现方法:在我们级别的最后,键入以下停止事件的操作者:Private Sub myJobManager_Stopped(ByVal sender As Object, _ ByVal e As CogJobManagerActionEventArgs) RunOnceButton.Enabled = TrueEnd Sub End Class,步骤2 注册操作者,除了声明我们的操作者之外,我们还必须确保我们的CJM能调用它。按照以下方法注册操作者:在Form1_Load()的最后键入: 为停止

14、事件注册操作者 AddHandler myJobManager.Stopped, _ AddressOf myJobManager_StoppedEnd SubAddHandler的第一个参数是我们想要处理的事件。其第二个参数是指向操作者的指针。,步骤2 注销操作者,在关闭之前注销CJM事件操作者总是个好主意。按照以下方法注销操作者:在Form1_FormClosing()的顶部键入:为停止事件注销操作者RemoveHandler myJobManager.Stopped, _ AddressOf myJobManager_Stopped 确保关闭CogJobManager!,步骤2 关于VB

15、.NET的一个警告,一些VB用户不使用添加/删除操作者。VisualStudio为VB应用程序中的事件提供不同的方法创建和注册操作者。如果您声明一个变量为“WithEvents”,VisualStudio将显示该对象可用的事件下拉列表。从列表中选择一个事件将自动:为其定义一个操作者,并且注册操作者和该对象。这种技巧很“容易”但是不允许您控制注册或者注销操作者的时间。在我们的应用程序中,停止事件必须在关闭CogJobManager之前注销。,步骤2 完成,现在我们完成了步骤2。我们使用了CJM 停止事件确保用户不会运行工作,除非其已被停止。运行您的应用程序测试一下。点击“运行一次”按钮。您会立即

16、得到一个无效操作异常( InvalidOperationException )提示“交叉线程运算无效” 。开始对本课程的教员持有严重的怀疑。在步骤3中我们将学习这是什么错误以及如何使用标准.NET函数来校正它。,步骤3 现在什么出错了呢?,我们又一次忘记阅读文件了。这次我们需要看看微软的文件: http:/ 校正大纲,Microsoft有一个标准技巧用于校正该问题。以下为其工作的方法:将其添加到您的停止事件操作者的顶部:If InvokeRequired Then 创建一个指针指向该函数 在正确的线程上调用同一个函数 ReturnEnd If很快我们将使用真实代码替换注释。现在,注意“Invo

17、keRequired”是每个控件的魔术属性。如果您处于错误的线程上它会返回到“正确( True)”。如果我们处于错误的线程上,其计划是切换到适当的线程并且递归调用同一个函数。,步骤3 创建一个委托,在.NET中有一个被称为“委托(delegate)”的函数指针。在我们可以在正确的线程上调用我们的事件操作者之前,必须创建一个指向它的委托。以下为实现方法:就在您的停止事件操作者之前添加该委托: 签名必须匹配CJM事件的委托。Delegate Sub myJobManagerDelegate(ByVal sender As Object, _ ByVal e As CogJobManagerActi

18、onEventArgs)这定义了一个有预期签名的委托。在您的事件操作者中适当的位置上创建该委托的一个实例:创建一个指向该函数的指针Dim myDel As New myJobManagerDelegate( _ AddressOf myJobManager_Stopped),步骤3 使用适当的线程,我们最终的方法是在适当的线程上调用我们的委托实例(即我们的事件操作者)。以下为实现方法::在您的事件操作者的正确地方添加以下这两行代码:在正确的线程上调用同一个函数Dim eventArgs() As Object = sender, eInvoke(myDel, eventArgs)第一行为调用定

19、义了一个数组参数。第二行使用控件的魔术“调用( Invoke )”方法在GUI线程上调用我们的委托。,步骤3 完成,现在我们完成了步骤3。我们使用不到10行的代码确保我们的按钮只可由创建它的线程访问。我们使用的技巧是一个标准的微软做法。您应该彻底学习它,并且在GUI项目可能被非适当线程调用的地方使用。运行您的应用程序测试一下。点击“运行一次”按钮。注意不会有更多的错误。对本课程开始感觉好些了吧。在步骤4中我们将开始让我们的GUI更加有意思。,步骤4 优化GUI,在步骤4中我们将以两种方式更新GUI:我们将添加一个“连续运行”按钮,并且我们将在我们工作运行时显示其运行状态。我们先从“连续运行”按

20、钮开始。我们想要该按钮在两个状态之间切换:“按下”和“未按”。在“按下”状态我们的CJM应该处于运行中,而在“未按”状态我们的CJM应该被停止。得到这一动作的好办法是使用复选框控件来制作该按钮。,步骤4 连续运行,以下为实现方法: 添加复选框:在设计器中,将复选框拖放到您的窗体上。修改“外观”属性为“按钮”。修改按钮文本为“连续运行”。修改按钮名称为“运行内容检验盒( RunContCheckBox )”。在复选框上双击并且在其创建的“CheckedChanged”方法中键入下列各行代码:If (RunContCheckBox.Checked) Then Try RunOnceButton.E

21、nabled = False myJobManager.RunContinuous() Catch ex As Exception MessageBox.Show(ex.Message) End TryElse . . . 下页幻灯片继续. . .,步骤4连续运行(续),继续键入:另外 Try RunContCheckBox.Enabled = False myJobManager.Stop() Catch ex As Exception MessageBox.Show(ex.Message) End TryEnd If该代码告诉我们CJM在复选框被勾选时,执行RunContinuous()

22、或者Stop() 。在我们开始运行时,它还使得“运行一次”按钮失效,而在我们等待CJM停止时使得“连续运行”按钮失效。,步骤4 连续运行(结束),我们只需要再添加两行代码:在停止事件操作者底部添加一行:RunOnceButton.Enabled = TrueRunContCheckBox.Enabled = True 在停止时激活在RunOnceButton_Clicked方法添加另一行如下代码:RunOnceButton.Enabled = FalseRunContCheckBox.Enabled = False 如果运行就失效我们的新按钮已经完成。花一分钟时间测试一下。,步骤4避免死锁,注

23、意:我们现在可以在应用程序运行期间关闭它。但很快如果用户关闭正在运行的应用程序,我们添加的代码将会死锁。要避免死锁,我们将防止用户在应用程序运行时关闭它。在运行时,我们将删除允许用户关闭应用程序的“X”按钮。,步骤4 避免死锁(续),以下为实现方法::在RunOnceButton_Click() 中添加:ControlBox = FalseRunOnceButton.Enabled = False在RunContCheckBox_CheckedChanged()中添加:ControlBox = FalseRunOnceButton.Enabled = False在myJobManager_St

24、opped()中添加:ControlBox = True RunOnceButton.Enabled = True“ControlBox”是您窗体的一个属性。它控件名称栏按钮是否可见。,步骤4 显示运行状态( RunStatus ),现在我们将更新 GUI显示运行状态。在您的窗体上添加一个文本框控件,将其命名为“RunStatusTextBox”。现在GUI 可能看起来有如下图:,步骤4 运行状态在使用者列队中,步骤4 事件和线程处理,我们要从使用者列队中调取运行状态并在我们的新文本框中显示。这一切必须在我们将要编写的新事件操作者中将进行。该操作者将用于UserResultAvailable事

25、件。什么线程会激活该事件?什么线程被允许接触文本框?没有关系。我们将不得不使用标准技巧避免交叉线程调用。,步骤4 编写操作者的代码,在我们级别的最后,添加一个新操作者:Private Sub myJobManager_UserResultAvailable( _ ByVal sender As Object, _ ByVal e As CogJobManagerActionEventArgs) If InvokeRequired Then 创建一个指针指向该函数 Dim myDel As New myJobManagerDelegate( _ AddressOf myJobManager_Us

26、erResultAvailable) 在正确的线程上调用同一个函数 Dim eventArgs() As Object = sender, e Invoke(myDel, eventArgs) Return End IfEnd Sub End Class这确保适当的线程处理(但是没有作用)。,步骤4编写操作者的代码(续),现在给操作者添加“真实”代码:Dim topRecord As Cognex.VisionPro.ICogRecord = _ myJobManager.UserResultRunStatusTextBox.Text = _ topRecord.SubRecords(User

27、ResultTag).Content & : _ & topRecord.SubRecords(JobName).Content & - _ & topRecord.SubRecords(RunStatus).Content.ToString在第一行调取下一个结果包。注意您必须完全给予ICogRecord资格。其他行代码创建包含以下内容的字符串:结果包的序列号,公布该包的工作的名称,以及目标运行状态(作为一个字符串)。该字符串被放置在文本框中。,步骤4 注册操作者,如以前一样,我们需要注册操作者:在Form1_Load()的底部键入: 为UserResultAvailable事件注册操作者 A

28、ddHandler myJobManager.UserResultAvailable, _ AddressOf myJobManager_UserResultAvailableEnd Sub按照以下方法注销操作者:在Form1_FormClosing() 中键入: 为UserResultAvailable事件注销操作者 RemoveHandler myJobManager.UserResultAvailable, _ AddressOf myJobManager_UserResultAvailable 确保关闭CogJobManager!,步骤4 完成,现在我们完成了步骤4。我们更新了我们的G

29、UI使其更加“真实”。我们学习了如何从使用者结果列队获得运行状态 (以及其他信息)。我们再次看到在编写GUI应用程序代码时必须细心考虑线程。运行您的应用程序测试一下。在步骤5中,我们将使GUI更好。,步骤5 添加一个显示控件,在步骤5将通过添加一个显示图像的控件来改进我们应用程序的GUI。这将是我们第一个非微软的控件。共有四个 VisionPro显示控件可供选择:CogToolDisplayCogRecordsDisplayCogRecordDisplayCogDisplay让我们看看它们每个都能做些什么。,步骤5 CogToolDisplay,CogToolDisplay:这是您在Quick

30、Build中能够看见的“标准”控件。 它是四个控件中最复杂的一个。它知道如何连接到VisionPro工具以及如何调取该工具的所有检查记录。它通过显示区上方的一个下列框允许用户选择浏览哪些图像记录。,步骤5 CogRecordsDisplay,CogRecordsDisplay:该控件看起来与CogToolDisplay相同。和CogToolDisplay一样,它允许用户通过下拉列表选择一个图像记录。而且和CogToolDisplay一样, 它显示所选图像的任何图形子记录。但是它对VisionPro工具一无所知。该控件不能从相关的VisionPro工具获得一 个CogRecords树;您必须使用

31、编程的方法提供。,步骤5 CogRecordDisplay,CogRecordDisplay:该控件将显示单个图像记录及其图形的子记录。该控件没有下拉列表框,不允许用户选择图像。CogRecordDisplay对 VisionPro 工具一无所知。您必须为该控件提供一个包含单个图像的CogRecord树。,步骤5 CogDisplay,CogDisplay:CogDisplay是最低级别的显示控件。由所有其他显示控件来使用。该控件对VisionPro工具或 CogRecords一无所知。它不允许用户选择不同的图像。该控件只显示一个图像和一组图形。图像和图形必须通过编程来提供。,步骤5 选择Co

32、gRecordDisplay,对于我们自定义的应用程序我们将使用CogRecordDisplay。没有下拉框,因此我们的代码将控制在显示区显示的内容。我们将显示 “LastRun.CogFixtureTool1.OutputImage”记录,因为它含有距离图形。在VisualStudio中我们的第一步是引用包含我们控件的集: Cognex.VisionPro.Controls,和Cognex.VisionPro.Display.Controls,步骤5 添加CogRecordDisplay,现在:将CogRecordDisplay拖放到窗体上。在它正下方放置CogDisplayStatusBa

33、r。,步骤5 开始编码,记住在关闭应用程序时要处理所有VisionPro控件在Form1_FormClosing() 底部添加: 明确地处理所有VisionPro控件 CogDisplayStatusBar1.Dispose() CogRecordDisplay1.Dispose()End Sub连接CogDisplayStatusBar 到显示区:在Form1_Load() 的底部键入: 连接状态栏 CogDisplayStatusBar1.Display = CogRecordDisplay1End Sub,步骤5 完成编码,在UserResultAvailable操作者的最后添加: Di

34、m tmpRecord As Cognex.VisionPro.ICogRecord 假定所需记录存在并且取得。 tmpRecord = topRecord.SubRecords(ShowLastRunRecordForUserQueue) tmpRecord = tmpRecord.SubRecords(LastRun) tmpRecord = tmpRecord.SubRecords(CogFixtureTool1.OutputImage) CogRecordDisplay1.Record = tmpRecord CogRecordDisplay1.Fit(True) End Sub这些代

35、码进入结果包取得我们想要的图像记录。然后记录被传递到显示区。,步骤5 完成,现在我们完成了步骤5。我们学习了显示控件并在我们应用程序GUI中添加了一个。运行您的应用程序测试一下。在步骤6中我们将添加更多的功能。,步骤6 定制您的应用程序,在VisualStudio中创建应用程序的主要原因在于提供自定义动作。我们将定制我们的应用程序这样用户可以从GUI中重新训练PatMax 模型。我们将添加一个复选框式按钮,允许用户看见训练图像并操纵训练区域。我们将添加一个单独的“重新训练”按钮,可以在显示训练图像的时候按下。,步骤6 再说说线程,您已经知道:每个Windows窗体控件只可以通过创建它的线程来访

36、问。 在您执行自定义动作时您还必须记住:(几乎)每个VisionPro 对象每次只能由一个线程使用。例如,这意味着在视觉工具的工作运行期间您不得试图访问它。您不可以读写属性或者调用方法。这条规则的一个显著例外是:CogJob和CogJobManager中的队列可以“同时”由多个线程使用。,步骤6 关于线程,我们需要确保我们的应用程序遵守VisionPro的线程要求。我们的计划是确保用户在应用程序运行期间不能重新训练PatMax图案。并且确保用户在他们重新训练图案时不能运行应用程序。我们一次将只激活一组按钮。,步骤6 添加自定义按钮,首先添加一个新的复选框到您的窗体上:修改其“外观”属性为“按钮

37、”。修改按钮的文本为“显示训练图像”。修改按钮名称为“显示训练检查盒( ShowTrainCheckBox )”。另外还添加一个新按钮到您的窗体上:修改按钮的文本为“重新训练”。修改按钮名称为“ 再训练按钮( RetrainButton )”。修改“激活”属性为“错误( False )”。默认状态下我们已经使得我们的重新训练按钮失效。,步骤6 在运行时失效,现在我们来添加一些代码,这样我们的复选框在运行CJM时会失效:在RunOnceButton_Click()中添加:RunContCheckBox.Enabled = False Disable if runningShowTrainChec

38、kBox.Enabled = False在RunContCheckBox_CheckedChanged()中添加:RunOnceButton.Enabled = FalseShowTrainCheckBox.Enabled = False在myJobManager_Stopped()中添加:RunContCheckBox.Enabled = True Enable when stoppedShowTrainCheckBox.Enabled = True,步骤6 更多的按钮逻辑,下一步,我们将确保用户在他们浏览训练图像时不能运行CJM。在“显示训练图像”复选框上双击并且添加以下代码:If (Sh

39、owTrainCheckBox.Checked) Then RunOnceButton.Enabled = False RunContCheckBox.Enabled = False RetrainButton.Enabled = TrueElse RunOnceButton.Enabled = True RunContCheckBox.Enabled = True RetrainButton.Enabled = FalseEnd If我们已经完成所有按钮“激活/失效”逻辑。是添加一些“真实”代码的时候了。,步骤6 使用两个新集,我们的“真实”代码将使用我们没有引用过的两个集。因此,向以下内容

40、添加引用:Cognex.VisionPro.ToolGroup,和Cognex.VisionPro.PMAlign这些集中的每个都引入同一名称的一个新名称空间。在您的代码顶部添加适当的导入:Imports Cognex.VisionPro.ToolGroupImports Cognex.VisionPro.PMAlign现有“真实”代码:当用户按下“显示训练图像”按钮时我们必须显示图像。,步骤6 显示训练图像,在ShowTrainCheckBox_CheckedChanged() 中添加:RetrainButton.Enabled = TrueDim myTG As CogToolGroup

41、= myJob.VisionToolDim myPMTool As CogPMAlignTool = _ myTG.Tools(CogPMAlignTool1)Dim tmpRecord As Cognex.VisionPro.ICogRecordtmpRecord = myPMTool.CreateCurrentRecord()tmpRecord = tmpRecord.SubRecords.Item(TrainImage)CogRecordDisplay1.Record = tmpRecordCogRecordDisplay1.Fit(True)RunStatusTextBox.Text

42、= “”该代码进入CJM从PMAlign工具中调取“训练图像( TrainImage )”检查记录。记录显示在显示区中。,步骤6 擦除训练图像,当用户第二次按下“显示训练图像”按钮时,我们应用擦除训练图像。在ShowTrainCheckBox_CheckedChanged() 中添加:RetrainButton.Enabled = FalseCogRecordDisplay1.Record = Nothing.,步骤6 允许用户重新训练,剩下来的唯一事情就是执行“重新训练”。双击“重新训练”按钮并且键入:Dim myTG As CogToolGroup = myJob.VisionToolDim myPMTool As CogPMAlignTool = _ myTG.Tools(CogPMAlignTool1)myPMTool.Pattern.Train()该代码进入CJM调取PMAlign工具然后简单地调用“Train()”函数。,步骤6 完成,现在我们完成了步骤6。执行了一些自定义动作。学习了如何访问工具方法。学习了每次只有一个线程可以接触一个VisionPro 对象。运行您的应用程序测试一下。进一步完善:在您的应用程序中添加一个标签,总是在CJM中显示PMAlignPattern “已训”或者“未训”的状态。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报