让代码更简单

当前位置:代码狗 > 开发教程 > 工业视觉教程 > 正文

VisionPro错误触发取像完成事件解决办法

淘宝1元包邮活动入口:https://m.tb.cn/h.4oO4pW3或复制淘口令 ¥Ok7kXblcVET¥
重要:本文最后更新于2020-12-28 19:42:58,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

不知道大家有没有遇到过这样的情况,使用VisionPro多相机采集图像时,明明没有采集图像的相机会触发采集完成事件,为了避免这样的问题发生,请阅读下面官方文档中的解释。

在某些情况下,当没有可用的已完成采集时,VisionPro采集系统可能会触发一个完整事件。如果在这种情况下调用CompleteAcquire,则会收到超时错误,或者可能是其他错误。

此问题主要发生在应用程序使用多个采集FIFO时,其中触发器(软件和硬件)正在发生,事件正在触发,以及禁用触发器时。请注意,正如这些发行说明中的其他地方所述,每当您禁用FIFO的触发器时,也应该刷新它。如果采集在刷新FIFO的过程中准备完成,则运行时环境将排队并稍后触发完整事件,即使采集已被刷新。

解决方法:

通过在调用之前验证是否有可用的获取,可以防止整个事件处理程序遇到这些错误,如以下代码所示:

Private Sub Operator_Complete(ByVal sender As Object, ByVal e As CogCompleteEventArgs)

    Dim numReadyVal, numPendingVal, myTicket, currentTrigNum As Integer
    Dim CurrentImage As CogImage8Grey
    Try

      MyFifo.GetFifoState(numPendingVal, numReadyVal, busyVal)
      If numReadyVal > 0 Then
        CurrentImage = _
            CType(MyFifo.CompleteAcquire(-1, myTicket, currentTrigNum), CogImage8Grey)
      Else
        Throw New CogAcqAbnormalException("Ready count is not greater than 0.")
      End If
    Catch ce As CogException
      MessageBox.Show("The following error has occurred:" & vbCrLf & ce.Message)
    End Try
  End Sub

为了方便大家阅读,狗哥将其翻译为C#代码如下:

private void Operator_Complete(object sender,CogCompleteEventArgs e){
  int numReadyVal, numPendingVal, myTicket, currentTrigNum;
  CogImage8Grey  CurrentImage;
try{
  MyFifo.GetFifoState(numPendingVal, numReadyVal, busyVal);
  if(numReadyVal > 0){
CurrentImage = _ CType(MyFifo.CompleteAcquire(-1, myTicket, currentTrigNum), CogImage8Grey)
}else{
Throw New CogAcqAbnormalException("Ready count is not greater than 0.");
}
}catch(CogException ce){
MessageBox.Show("The following error has occurred:" & vbCrLf & ce.Message)
}
}

纯手打,没经过IDE验证,仅供参考有问题别找我。

这些代码其实是有点小问题的,比如_ CType这个东西是什么,康耐视的文档中并没有写,真是让人难以捉摸。

简单解释下代码的意思,首先定义了3个整型变量和一个图像变量。然后尝试通过GetFifoState方法取得采集工具的当前状态,该方法提供三个输出,分别是处于挂起状态的处理数,准备完成的采集请求数量,繁忙状态。这里只用前两个。然后通过CompleteAcquire方法触发一次采集,注意:此方法触发的采集与StartAcquire方法一样不会阻塞。CompleteAcquire方法总共有三个参数,第一个是未完成的采集数,一般由StartAcquire方法提供,自动触发取像必须为-1。第二个参数是完成的采集数量,当不是自动触发采集时应与第一个参数一致。第三个参数是完成采集的触发序列号,通过Acquire方法取得已采集数量与之对比即可发现是否有丢失。

翻译得不是很流畅,有兴趣的可以看看文档。

感觉很棒!可以赞赏支持我哟~

赞(1) 打赏

评论 3

  1. #1

    狗哥,dux标签页面分页如何调出来呢?能否给个提示呀?

    Moi4个月前 (12-28)回复
    • 说不清楚,过两天写篇文章,DUX照抄即可。

      代码狗4个月前 (12-28)回复
      • 哈哈,谢谢🙏

        Moi4个月前 (12-29)
×

请作者吃根烤肠!

支付宝