企业集团网站建设方案论文,网站建设市场趋势,用什么软件做网站交互效果,手机网站大全推荐项目场景#xff1a;
Baumer工业相机堡盟相机传统开发包BGAPI SDK进行工业视觉软件整合时#xff0c;常常需要将SDK中一些功能整合到图像处理软件中#xff0c;方便项目的推进使用#xff1b;
在项目的图像处理任务中#xff0c;可能会因为一些硬件比如线缆网卡的原因导…项目场景
Baumer工业相机堡盟相机传统开发包BGAPI SDK进行工业视觉软件整合时常常需要将SDK中一些功能整合到图像处理软件中方便项目的推进使用
在项目的图像处理任务中可能会因为一些硬件比如线缆网卡的原因导致出现偶尔掉线而软件重启则可以重新连上这时为了适用于自动化设备不停线的情况下需要图像处理软件可以自动进行断线重新连接。
注意本文是基于Baumer的BGAPI SDK的基础上使用C语言来实现相机的掉线重新连接。
注意该方法与上一篇自动重连机制有所不同更加的便捷更符合PnPEventHandler事件定义
Baumer工业相机堡盟相机如何实现相机掉线重连(C)_格林威的博客-CSDN博客 如何发现掉线 Baumer工业相机BGAPI SDK中在相机事件中存在一种PnpEvent事件可以监控相机是否掉线从而能够及时发现相机的问题。
在BGAPI SDK的C开发包里存在PnpEvent的事件例程关键字为013_PnPEventMode_Handler
下面为例程中PnPEvent事件核心代码已经进行优化
// CALLBACK
void BGAPI2CALL PnPEventHandler(void * callbackOwner, BGAPI2::Events::PnPEvent * pPnPEvent) {if (NULL ! pPnPEvent) {std::cout std::endl;std::cout std::endl;std::cout [callback of ((BGAPI2::Interface *)callbackOwner)-GetDisplayName() ] ;std::cout EventID pPnPEvent-GetId() PnPType: ((pPnPEvent-GetPnPType() 0) ? removed : added ) SerialNumber: pPnPEvent-GetSerialNumber() std::endl;std::cout std::endl;return;
}相机掉线重连实现方法 1、在相机初始化的过程中在相机对应的网口中注册SDK中PnPEvent回调函数 代码如下所示 //为相机对应数据流注册掉线触发事件
m_pInterface-RegisterPnPEvent(BGAPI2::Events::EVENTMODE_EVENT_HANDLER);
m_pInterface-RegisterPnPEventHandler(this, (Events::PnPEventHandler) PnPEventHandler); 2、在PnPEvent回调函数里进行相机掉线事件的分析并对应实现相机的再次查找 注意在回调里尽量不要处理太多任务可以从回调里发出信息在外部处理回调发出的任务信息。本例在回调里处理任务方便参考请大家理解。 PnPEvent回调函数代码如下所示 BOOL BGAPI2CALL PnPEventHandler(void * callBackOwner, BGAPI2::Events::PnPEvent * pPnPEvent)
{if (NULL ! pPnPEvent){const char* EventTypeStrC ((pPnPEvent-GetPnPType() 0)? removed : added);CString EventTypeStr(EventTypeStrC);BaumerCameraDriver* pCamera (BaumerCameraDriver*)callBackOwner;if(EventTypeStr _T(removed)){//AfxMessageBox(_T(相机离线)); pCamera-ReleaseCamera(); //释放相机资源 }if(EventTypeStr _T(added)){//AfxMessageBox(_T(相机在线));#pragma region//网口资源的初始化pCamera-systemList SystemList::GetInstance();pCamera-systemList-Refresh();int sysindex 0; int devcount 0;for(SystemList::iterator sysIterator pCamera-systemList-begin();sysIterator ! pCamera-systemList-end();sysIterator){CString sysModel0 A2W(sysIterator-second-GetModel()); //bgapi_gigeif(sysModel0.Find(_T(gige))!-1) //此例程只连接网口Gige相机{ pCamera-pSystem sysIterator-second;break;}sysindex;}pCamera-interfaceList pCamera-pSystem-GetInterfaces();pCamera-interfaceList-Refresh(100);int infcount pCamera- interfaceList-size(); //可以找到多个interface网络接口包含实际接口和虚拟接口for(InterfaceList::iterator ifIterator pDlg-interfaceList-begin(); ifIterator ! pDlg-interfaceList-end();ifIterator){CString infType A2W(ifIterator-second-GetTLType());CString infName A2W(ifIterator-second-GetDisplayName());BGAPI2::Interface* m_pInterface0 ifIterator-second;if(m_pInterface0-IsOpen()) //检查网口是否开启{BGAPI2::DeviceList* m_pDeviceList m_pInterface0-GetDevices();m_pDeviceList-Refresh(100); int devcount m_pDeviceList-size(); //一般为1if(devcount0){bool devListRefresh_reqiured false;BGAPI2::Device * m_pDevice (*m_pDeviceList)[0];if(m_pDevice-IsOpen()){if(pPnPEvent-GetSerialNumber()m_pDevice-GetSerialNumber()){m_pDevice-Close();devListRefresh_reqiured true;}}if (devListRefresh_reqiured){m_pDeviceList-Refresh(200);}}}}#pragma endregion//相机的再连接pCamera-RelinkCamera();}return TRUE;}
} 3、在PnPEvent掉线发生后需要释放对应的资源防止内存泄漏 代码如下所示 void CGigeDemoDlg::ReleaseCamera()
{//m_pDatastreamList CurDevice-GetDataStreams();//获取相机设备数据流序列int iDscount m_pDatastreamList-size();//一般为1 if(iDscount0)m_pDataStream (*m_pDatastreamList)[0];try{ m_pDataStream-StopAcquisition(); //停止采集相机数据流}catch (BGAPI2::Exceptions::IException ex){} try{m_pBufferList m_pDataStream-GetBufferList();//获取相机设备数据流的Buffer序列while (m_pBufferList-size() 0) //对Bufferlist里每个buffer对象进行释放删除{BGAPI2::Buffer* m_pBuffer m_pBufferList-begin()-second;m_pBufferList-RevokeBuffer(m_pBuffer); //对当前buffer对象进行释放delete m_pBuffer; //对当前buffer对象进行删除}}catch (BGAPI2::Exceptions::IException ex){}try{ m_pDataStream-Close(); //关闭相机数据流 }catch (BGAPI2::Exceptions::IException ex){}}4、在对应相机进行一定程度的释放资源后相机的PnPEventHandler回调函数事件是一直再运行中若相机重新连接上后该回调函数事件回同步得到触发因此可以同步执行相机资源的初始化和相机的自动重连 void CGigeDemoDlg::ReConnectCamera(BGAPI2::Interface* CurInterface)
{USES_CONVERSION;m_pDeviceList m_pInterface-GetDevices();m_pDeviceList-Refresh(100); int devcount m_pDeviceList-size();m_pDevice (*m_pDeviceList)[0];m_pDevice-Open();CString devName A2W(m_pDevice-GetDisplayName());m_pDatastreamList m_pDevice-GetDataStreams();m_pDatastreamList-Refresh();int iDscount m_pDatastreamList-size(); BGAPI2::DataStream *m_pDataStream0 (*m_pDatastreamList)[0]; //这里的DataStream需要使用临时变量m_pDataStream0-Open();m_pBufferList m_pDataStream0-GetBufferList();for(int i0; i4; i){m_pBuffer new BGAPI2::Buffer();m_pBufferList-Add(m_pBuffer);}for (BGAPI2::BufferList::iterator bfIterator m_pBufferList-begin();bfIterator ! m_pBufferList-end();bfIterator){bfIterator-second-QueueBuffer();}int iQBuffer m_pBufferList-GetQueuedCount();int x0;m_pDataStream0-RegisterNewBufferEvent(BGAPI2::Events::EVENTMODE_EVENT_HANDLER);m_pDataStream0-RegisterNewBufferEventHandler(this,(Events::NewBufferEventHandler) BufferHandler);String strTrgStatus;strTrgStatus m_pDevice-GetRemoteNode(TriggerMode)-GetString();CString strTrgStatusC A2W(strTrgStatus);m_pDataStream0-StartAcquisitionContinuous();AfxMessageBox(devName_T(已连接));} 5、上述相机将会在回调函数中自动完成重连操作然后重新点击采图可以发现相机已经恢复正常。 相机连接代码如下所示 void CGigeDemoDlg::OnBnClickedBtnplay()
{// TODO: 在此添加控件通知处理程序代码USES_CONVERSION;if(m_pDevice ! NULL){try{m_pDevice-GetRemoteNode(TriggerMode)-SetString(Off); //关闭触发模式进入自由采集图片流模式m_pDevice-GetRemoteNode(AcquisitionStart)-Execute();#pragma region 线程显示帧率和网口数据通量(做参考)m_bRun0 true;//AfxBeginThread(ShowFrame_hThread1, (void*)this); #pragma endregion }catch (BGAPI2::Exceptions::IException ex){CString str1;str1.Format(_T(ExceptionType:%s! ErrorDescription:%s in function:%s),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());MessageBox(str1);}}} 6、完成上面操作后就可以及时对掉线相机进行断线重连操作可以尝试重新连接也可以检查对应相机状态需要对应掉线事件操作什么取决于开发者想要什么的功能实现。 结论要点
工业相机的重连机制依托于相机的PnPEvent事件触发并且出现PnPEvent事件后可以触发一个间隔1-2s的线程反复刷新对应网口interface的相机找到相机后然后线程终止然后再触发一个重新连接的功能或者方法。
PnPEvent事件类型有移除和增加两种类型可以针对两种类型做相应的自定义处理。
事件类型如下图所示 并且在刷新工业相机List的过程中可以根据类的构成和习惯有所不同比如锁定好接口方便快速只刷新这个接口从而适用于多相机的系统。 注意
工业相机的重连功能基本上是属于软件层面的重新连接若是涉及到硬件层面的变更和重连则需要更为严格的对象设计和逻辑优化。
本文的重连则采用了上述的PnPEvent事件类型来进行判断。