
VisionPro视觉软件-工作流程通信接受信息打开光源采集图像图像赋值到对应vpp算法工具模块确定算法输入参数运行视觉算法vpp工具块得到检测结果在页面显示OK、NG把结果传给PLC或者上位机存图内存优化 GC.Collect();/// summary/// PLC通信模板/// /summary/// param nameob/paramprivatevoidProcessPlcCommunication(objectob){// 无限循环持续监听PLC信号直到线程被终止while(true){try{// 仅当机器处于联机状态_isOnline为true时才处理PLC通信if(_isOnline){// 处理CCD1触发信号 // 从keyencePlc1读取CCD1触发信号Signal.SignalInput.CCD1Trigger是信号地址intTrigger1keyencePlc1.ReadInt16(Signal.SignalInput.CCD1Trigger).Content;//CCD1// 检测到CCD1触发信号值为1if(Trigger11){// 立即清零PLC的CCD1触发位防止重复触发keyencePlc1.Write(Signal.SignalInput.CCD1Trigger,0);LogNLog.Info(Receive CCD1Trigger------1);// 启动异步任务执行CCD1对应的检测逻辑ProcessInsDockCam1传入参数1TasktasknewTask(ProcessInsDockCam1,1);task.Start();}Thread.Sleep(5);// 5ms短延迟避免信号读取过快导致的重复检测// 处理CCD2触发信号 // 从keyencePlc2读取CCD2触发信号intTrigger2keyencePlc2.ReadInt16(Signal.SignalInput2.CCD2Trigger).Content;//CCD2if(Trigger21){keyencePlc2.Write(Signal.SignalInput2.CCD2Trigger,0);LogNLog.Info(Receive CCD2Trigger------1);TasktasknewTask(ProcessInsDockCam2,1);task.Start();}// 处理CCD3触发信号3D相机 // 从keyencePlc2读取CCD3触发信号mating面3D相机触发intTrigger3keyencePlc2.ReadInt16(Signal.SignalInput2.CCD3Trigger).Content;//CCD3if(Trigger31)//mating面3D相机触发{try{//清零keyencePlc2.Write(Signal.SignalInput2.CCD3Trigger,0);LogNLog.Info(Receive CCD3Trigger------1);//通知PLC已准备好----待定// keyencePlc2.Write(Signal.SignalInput2.CCD3Trigger, 0);// 原子操作设置3D相机触发标志位ssznShotFlag为1避免多线程竞争Interlocked.Exchange(refssznShotFlag,1);// 启动3D激光相机扫描参数来自配置表的Info数组索引7和6_laserSSZN.StartShot(Convert.ToInt16(_singleVppParamsTable3.visionInputParam.Info[7]),Convert.ToInt16(_singleVppParamsTable3.visionInputParam.Info[6]));// 通知PLC启动3D扫描轴移动写入信号CCD3DMove为1keyencePlc2.Write(Signal.SignalOutput2.CCD3DMove,1);LogNLog.Info(请求PLC开始移动3D扫描轴--SendPLC-1);}catch(Exceptionex){// 3D相机触发异常向PLC写入错误状态CCD3nResult2表示错误keyencePlc2.Write(Signal.SignalOutput2.CCD3nResult,2);// 向PLC写入完成信号CCD3Complete1keyencePlc2.Write(Signal.SignalOutput2.CCD3Complete,1);LogNLog.Error($3D相机触发异常{ex.ToString()});}}}else{LogNLog.Warn(机器未联机);}}catch(Exceptionex){LogNLog.Error(Server错误ex.Source.ToString()接受信息:);}Thread.Sleep(100);}}/// summary/// 德创改机第一台CCD/// /summary/// param nameob/paramprivatevoidProcessInsDockCam1(objectob){// 接收异步任务传入的参数触发标识转换为字符串stringreceiveDatastring.Empty;receiveData(string)ob;try{#region德创CCD1-2d// 判断触发参数为1PLC触发CCD1检测if(receiveData.Contains(1)){//开始计时LogNLog.Info($CCD1开始视觉检测);_stopWatch.Restart();// 通用参数定义 //通用参数修改区域stringcameraNameCCD1;stringtbName外壳检测;stringstageDisName$外壳检测;// CCD1对应的参数表VppParamsDataTablesingleVppParamsTable_singleVppParamsTable1;// 光源控制 // _frmDisplay.RecordInformation(stageDisName 打开光源触发拍照);//光源打开_rs232.Write(SC0255#);LogNLog.Info(打开光源stageDisName触发拍照);// 图像采集 ICogImageimageLeft;// 存储采集的图像if(!GlobalsVar._isSimulateAcqImage){// 真实取图调用视觉库的重试取图方法最多重试3次imageLeft_cogVison.RunRetryAcq(CogVision._acqDealCollect[cameraName].Acq,3);}else{// 模拟取图调试用读取预设的模拟图片在界面显示_frmDisplay.ShowSimulateImageIndex(tbName,GlobalsVar.simulateAcqImageInfoArr);imageLeft_cogVison.ReadSimulateCogImage(tbName,GlobalsVar.simulateAcqImageInfoArr);}//关闭光源_rs232.Write(SC0000#);LogNLog.Info(关闭光源stageDisName取图完成);// 空图判断容错处理 if(imageLeftnull){LogNLog.Error(stageDisName触发拍照为空停止运行);// 向PLC写入检测结果NG2 完成信号1keyencePlc1.Write(Signal.SignalOutput.CCD1Result,2);keyencePlc1.Write(Signal.SignalOutput.CCD1Complete,1);LogNLog.Error(stageDisName$触发拍照结果NG:{Signal.SignalOutput.CCD1Result}2$ 完成信号:{Signal.SignalOutput.CCD1Complete}1 处理时间_stopWatch.ElapsedMilliseconds.ToString());return;}// 视觉算法检测 LogNLog.Info(stageDisName视觉处理);VisionInputParamvisionInputParamnewVisionInputParam();// 组装视觉检测输入参数采集的图像 对应的算法工具块singleVppParamsTable.visionInputParam.InputImageimageLeft;singleVppParamsTable.visionInputParam.ToolBlockCogVision._toolBlockDealCollect[tbName].tool;visionInputParamsingleVppParamsTable.visionInputParam;// 运行视觉算法工具块得到检测结果VisionResultvisionResult_cogVison.RunToolBlock(visionInputParam);_ccd1ResultvisionResult.Info;// 在界面显示检测后的图片和结果标志OK / NG_frmDisplay.ShowRecordImageNew(1,visionResult.ReCordImage,visionResult.Flag);// 检测结果处理OK if(visionResult.Flag||(singleVppParamsTable.visionInputParam.Info[5]1?true:false)){// 向PLC写入检测结果OK1 完成信号1keyencePlc1.Write(Signal.SignalOutput.CCD1Result,1);keyencePlc1.Write(Signal.SignalOutput.CCD1Complete,1);LogNLog.Info(stageDisName$触发拍照结果OK:{Signal.SignalOutput.CCD1Result}1$ 完成信号:{Signal.SignalOutput.CCD1Complete}1 处理时间_stopWatch.ElapsedMilliseconds.ToString());#region主盘存图// 若配置为保存OK原图将原图存入全局队列OrginImageQueueif(singleVppParamsTable.visionInputParam.IsSaveOKOriginal){ICogImageBuferimageBuffernewICogImageBufer();imageBuffer.imageimageLeft;// 图片命名规则产品名文件夹名结果时间戳imageBuffer.name$Grey{_currentProductName}singleVppParamsTable.visionInputParam.ImageFolderNameOKDateTime.Now.ToString(yyyyMMddhhmmss);GlobalsVar.OrginImageQueue.Enqueue(imageBuffer);}// 若配置为保存OK截图if(singleVppParamsTable.visionInputParam.IsSaveOKScreen){RecordImageBuferbitmapBuffernewRecordImageBufer();bitmapBuffer.record_frmDisplay.SaveScreenimageArr(1);bitmapBuffer.name${_currentProductName}singleVppParamsTable.visionInputParam.ImageFolderNameOKDateTime.Now.ToString(yyyyMMddhhmmss);GlobalsVar.ReocrdImageQueue.Enqueue(bitmapBuffer);}#endregion}// 检测结果处理NG else{// 向PLC写入检测结果NG2 完成信号1keyencePlc1.Write(Signal.SignalOutput.CCD1Result,2);keyencePlc1.Write(Signal.SignalOutput.CCD1Complete,1);LogNLog.Error(stageDisName$触发拍照结果NG:{Signal.SignalOutput.CCD1Result}2$ 完成信号:{Signal.SignalOutput.CCD1Complete}1 处理时间_stopWatch.ElapsedMilliseconds.ToString());#region主盘存图//保存NG原图if(singleVppParamsTable.visionInputParam.IsSaveNGOriginal){ICogImageBuferimageBuffernewICogImageBufer();imageBuffer.imageimageLeft;imageBuffer.name$Grey{_currentProductName}singleVppParamsTable.visionInputParam.ImageFolderNameNGDateTime.Now.ToString(yyyyMMddhhmmss);GlobalsVar.OrginImageQueue.Enqueue(imageBuffer);}// 保存NG截图if(singleVppParamsTable.visionInputParam.IsSaveNGScreen){RecordImageBuferbitmapBuffernewRecordImageBufer();bitmapBuffer.record_frmDisplay.SaveScreenimageArr(1);bitmapBuffer.name${_currentProductName}singleVppParamsTable.visionInputParam.ImageFolderNameNGDateTime.Now.ToString(yyyyMMddhhmmss);GlobalsVar.ReocrdImageQueue.Enqueue(bitmapBuffer);}#endregion}//还要加个屏蔽信号}#endregion#region内存优化_gcCount;if(_gcCount6){_stopWatchFlush.Restart();_gcCount0;FlushMemory();LogNLog.Info(内存优化);LogNLog.Info(内存优化处理时间:_stopWatchFlush.ElapsedMilliseconds.ToString());}#endregion}catch(Exceptionex){keyencePlc1.Write(Signal.SignalOutput.CCD1Result,2);keyencePlc1.Write(Signal.SignalOutput.CCD1Complete,1);LogNLog.Error(CCD1检测跳到异常:$触发拍照结果NG:{Signal.SignalOutput.CCD1Result}2$ 完成信号:{Signal.SignalOutput.CCD1Complete}1 处理时间_stopWatch.ElapsedMilliseconds.ToString());LogNLog.Error(ex.ToString());}}