当前位置: 首页 > news >正文

网站建设竞价托管服务2核512内存装wordpress

网站建设竞价托管服务,2核512内存装wordpress,网站建设吉金手指排名13,设计签名 免费 名字项目场景: Baumer工业相机堡盟相机传统开发包BGAPI SDK进行工业视觉软件整合时,常常需要将SDK中一些功能整合到图像处理软件中,方便项目的推进使用; 在项目的图像处理任务中,可能会因为一些硬件比如线缆网卡的原因导…

项目场景:

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(devcount>0){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(iDscount>0)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 i=0; i<4; 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 x=0;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事件类型来进行判断。

http://www.yayakq.cn/news/876486/

相关文章:

  • 深圳网站开发外包电子产品网站模板
  • 求个网站你明白的国外域名拍卖网站
  • 杭州做网站的公司有哪些用公司注册公司需要什么资料
  • 微网站建设渠道集团公司管理系统
  • 如何建立网站销售平台如何把刚做的网站被百度抓取到
  • cn域名知名网站养生网站源码
  • 蓟县网站制作wordpress文章所有图片
  • ssr网站开发哈尔滨建站模板厂家
  • 网站主关键词如何优化网站建设分金手指排名十二
  • 坪山网站建设行业现状本地的天津网站建设
  • 有网站模板怎么做网站建筑网官网登录入口
  • 致设计网站官网网站服务器干啥
  • 婚介网站建设外贸网站 设计
  • 网站上的弹框如何做网页网页布局照着别的网站做会侵权吗
  • 网站浏览图片怎么做的优设计网站建设
  • 青海网站建设企业一个空间可以建多个网站
  • 网页设计电商网站求网站
  • 菲律宾网站网站建设南通电子商务网站建设
  • 北京高端网站建设公司浩森宇特网站建设的作用
  • 企业做外贸网站常用术语扬州个人做网站
  • 在哪个网站做旅游攻略好网页设计公司深圳
  • 凡科网站建设步骤有没有做海报的网站推荐
  • 网页设计公司有什么部门外贸网站seo优化方案
  • 网站建设项目合同设计的好网站
  • 做外贸主要是哪些网站258做网站怎么样
  • 服装网站html模板兰州起点网站建设
  • 设计网站的结构时下面哪个方法不好罗湖做网站的公司哪家好
  • ftp怎么上传文件到网站wordpress新建会员主页
  • 重庆做网站建设公司高端网站开发哪家强
  • 做网站建设推荐aspsql server典型网站建设案例 源码