/// <summary> /// 软拍照 /// </summary> /// <param name="baslerCamera"></param> /// <param name="picWidth"></param> /// <param name="picHeight"></param> /// <param name="threadName"></param> /// <returns></returns> private byte[] TakePicture(BaslerCamera.BaslerCamera baslerCamera, long picWidth, long picHeight, string threadName) { byte[] buff = new byte[picWidth * picHeight]; PolicyTypeA.Execute(() => { if (1 == baslerCamera.TakeSinglePicture(buff, buff.Length)) { throw new Exception(threadName + ":拍照失败"); } SYS_IBG_LOG(DEBUGL1MSG, 0, 0, threadName + ":拍照成功"); }); return(buff); }
//机械手还需要处理的问题, //1.目前机械手是回到待机位,才会激活视觉处理和写入产量,并且是同步的,需要优化 //2.需要考虑,报警,暂停等情况,恢复机械手时,判断机械手所处位置和是否抓着电池! //3.产量写入,PPM计算未处理! //机械手线程 控制机械手 public void ThreadRobot() { Stopwatch sw = new Stopwatch(); while (!bStopThread) { Thread.Sleep(5); //if (m_SysState.GetSysCriticalError()) // m_SysState.m_iScaraStep = 0; //if (m_SysState.GetStopFlag()) // m_SysState.m_iScaraStep = 0; //if (!m_SysState.GetSysStart()) // continue; //if (m_SysState.GetSysPause()) // continue; //if (m_SysState.GetSysError()) // continue; int threadStep = GetSysStatus <int>(p => p.Thread_RobotStep); switch (threadStep) { case 0: //TODO:缺死循环跳出机制 Thread.Sleep(500); break; case 1: if (GetSysStatus(p => p.Sys_BatteryIsReady)) { SetSysStatus(p => p.Sys_MoveInContinus = true); if (EnumBisReturn_ResultType.NG == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { threadStep = 100; } else { threadStep++; } SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:机械手开始工作"); } Thread.Sleep(20); break; case 2: //检查三个条件=> Bis结果为TrayA,TrayA已准备好,视觉检测已准备好 if (GetSysStatus(p => p.PLC_Output_IsReady_TrayA) && GetSysStatus(p => p.VisionChecked_TrayA) && EnumBisReturn_ResultType.TrayA == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayA = false); SetSysStatus(p => p.VisionChecked_TrayA = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:开始抓取电池,目标:TrayA"); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.Catch), // GetThePosition(EnumDefaultPosition.TrayA,), GetThePosition(EnumDefaultPosition.TrayA, GetSysStatus(p => p.CurrentReleaseIndex_TrayA)), GetSysConfig(p => p.ZAxiaSafePosition) ); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:完成抓放电池"); //待激活视觉检测功能 threadStep++; } else if (GetSysStatus(p => p.PLC_Output_IsReady_TrayB) && GetSysStatus(p => p.VisionChecked_TrayB) && EnumBisReturn_ResultType.TrayB == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayB = false); SetSysStatus(p => p.VisionChecked_TrayB = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:开始抓取电池,目标:TrayB"); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.Catch), GetThePosition(EnumDefaultPosition.TrayB, GetSysStatus(p => p.CurrentReleaseIndex_TrayB)), GetSysConfig(p => p.ZAxiaSafePosition) ); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:完成抓放电池"); //待激活视觉检测功能 threadStep++; } else if (GetSysStatus(p => p.PLC_Output_IsReady_TrayC) && GetSysStatus(p => p.VisionChecked_TrayC) && EnumBisReturn_ResultType.TrayC == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayC = false); SetSysStatus(p => p.VisionChecked_TrayC = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:开始抓取电池,目标:TrayC"); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.Catch), GetThePosition(EnumDefaultPosition.TrayC, GetSysStatus(p => p.CurrentReleaseIndex_TrayC)), GetSysConfig(p => p.ZAxiaSafePosition) ); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:完成抓放电池"); //待激活视觉检测功能 threadStep++; } else if (GetSysStatus(p => p.PLC_Output_IsReady_TrayD) && GetSysStatus(p => p.VisionChecked_TrayD) && EnumBisReturn_ResultType.TrayD == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayD = false); SetSysStatus(p => p.VisionChecked_TrayD = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:开始抓取电池,目标:TrayD"); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.Catch), GetThePosition(EnumDefaultPosition.TrayD, GetSysStatus(p => p.CurrentReleaseIndex_TrayD)), GetSysConfig(p => p.ZAxiaSafePosition) ); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:完成抓放电池"); //待激活视觉检测功能 threadStep++; } else if (GetSysStatus(p => p.PLC_Output_IsReady_TrayE) && GetSysStatus(p => p.VisionChecked_TrayE) && EnumBisReturn_ResultType.TrayE == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayE = false); SetSysStatus(p => p.VisionChecked_TrayE = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:开始抓取电池,目标:TrayE"); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.Catch), GetThePosition(EnumDefaultPosition.TrayE, GetSysStatus(p => p.CurrentReleaseIndex_TrayE)), GetSysConfig(p => p.ZAxiaSafePosition) ); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:完成抓放电池"); //待激活视觉检测功能 threadStep++; } else { if (EnumBisReturn_ResultType.TrayA == GetSysStatus(p => p.EnumBisReturn_ResultType_Running) || EnumBisReturn_ResultType.TrayB == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //抓到待机位A _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.Catch), GetThePosition(EnumDefaultPosition.StandyA), GetSysConfig(p => p.ZAxiaSafePosition) ); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:开始抓取电池到待机位A"); threadStep = 200; } else { //抓到待机位B _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.Catch), GetThePosition(EnumDefaultPosition.StandyB), GetSysConfig(p => p.ZAxiaSafePosition) ); SYS_IBG_LOG(DEBUGL1MSG, 0, 0, "ThreadRobot:开始抓取电池到待机位B"); threadStep = 300; } } break; case 3: Task.Run(() => { SYS_IBG_LOG(DEBUGL1MSG, 0, 0, $"ThreadRobot:{GetSysStatus(p => p.EnumBisReturn_ResultType_Running).ToString()}开始视觉检测"); //视觉检测,TODO:此处视觉处理是机械到回到待机位才开始,需要优化!!! 移至料盘线程?! BaslerCamera.BaslerCamera baslerCamera = null; long picWidth, picHeight = 0; if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayA) { baslerCamera = _trayACamera; picWidth = m_CameraConfig.CameraWidth_TrayA; //.lTrayA_CameraWidth; picHeight = m_CameraConfig.CameraHeight_TrayA; //拍照+保存相片+视觉处理 TrayVisionHandle("TrayA", "ThreadRobot", mVision, baslerCamera, picWidth, picHeight); SetSysStatus(p => p.VisionChecked_TrayA = true); SetSysStatus(p => p.Sys_MoveInContinus = true); //TODO:写入产量等操作 放到下一步 } else if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayB) { baslerCamera = _trayBCamera; picWidth = m_CameraConfig.CameraWidth_TrayB; picHeight = m_CameraConfig.CameraHeight_TrayB; TrayVisionHandle("TrayB", "ThreadRobot", mVision, baslerCamera, picWidth, picHeight); SetSysStatus(p => p.VisionChecked_TrayB = true); //TODO:写入产量等操作 放到下一步 } else if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayC) { baslerCamera = _trayCCamera; picWidth = m_CameraConfig.CameraWidth_TrayC; picHeight = m_CameraConfig.CameraHeight_TrayC; TrayVisionHandle("TrayC", "ThreadRobot", mVision, baslerCamera, picWidth, picHeight); SetSysStatus(p => p.VisionChecked_TrayC = true); //TODO:写入产量等操作 放到下一步 } else if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayD) { baslerCamera = _trayDCamera; picWidth = m_CameraConfig.CameraWidth_TrayD; picHeight = m_CameraConfig.CameraHeight_TrayD; TrayVisionHandle("TrayD", "ThreadRobot", mVision, baslerCamera, picWidth, picHeight); SetSysStatus(p => p.VisionChecked_TrayD = true); //TODO:写入产量等操作 放到下一步 } else if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayE) { baslerCamera = _trayECamera; picWidth = m_CameraConfig.CameraWidth_TrayE; picHeight = m_CameraConfig.CameraHeight_TrayE; TrayVisionHandle("TrayE", "ThreadRobot", mVision, baslerCamera, picWidth, picHeight); SetSysStatus(p => p.VisionChecked_TrayE = true); //TODO:写入产量等操作 放到下一步 } else { throw new Exception("不存在此种情况"); } SYS_IBG_LOG(DEBUGL1MSG, 0, 0, $"ThreadRobot:{GetSysStatus(p => p.EnumBisReturn_ResultType_Running).ToString()}视觉检测完成"); #region //换料,出料,计算产量,计算PPM等操作 SYS_IBG_LOG(DEBUGL1MSG, 0, 0, $"ThreadRobot:{GetSysStatus(p => p.EnumBisReturn_ResultType_Running).ToString()}开始写入产量"); //换料,出料,计算产量,计算PPM等操作 var qtyForCrib = GetProductParam(p => p.QTY_FOR_CRIB); //每lot数量 var qtyForTray = GetProductParam(p => p.QTY_FOR_TRAY); //每盘数量 if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayA) { var trayAReleaseIndex = GetSysStatus(p => p.CurrentReleaseIndex_TrayA); if (qtyForTray >= 4) { if (qtyForTray - trayAReleaseIndex == 2) //倒数第二格 { //通知PLC TrayA准备换盘了 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_ReadyForChange_TrayA), 1); } else if (qtyForTray - trayAReleaseIndex == 1) //最后一格 { //TODO:换lot和换料盘等相关操作待定 //通知PLC TrayA换盘 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayA), 1); SetSysStatus(p => p.VisionChecked_TrayA = false); } else { } } else { if (qtyForTray - trayAReleaseIndex == 1) //最后一格 { _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayA), 1); SetSysStatus(p => p.VisionChecked_TrayA = false); } else { } } SetSysStatus(p => p.CurrentReleaseIndex_TrayA++); //TODO:写入产量,计算PPM,计算Lot数量,当前数量,暂不处理 } else if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayB) { var TrayBReleaseIndex = GetSysStatus(p => p.CurrentReleaseIndex_TrayB); if (qtyForTray >= 4) { if (qtyForTray - TrayBReleaseIndex == 2) //倒数第二格 { //通知PLC TrayB准备换盘了 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_ReadyForChange_TrayB), 1); } else if (qtyForTray - TrayBReleaseIndex == 1) //最后一格 { //TODO:换lot和换料盘等相关操作待定 //通知PLC TrayB换盘 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayB), 1); SetSysStatus(p => p.VisionChecked_TrayB = false); } else { } } else { if (qtyForTray - TrayBReleaseIndex == 1) //最后一格 { _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayB), 1); SetSysStatus(p => p.VisionChecked_TrayB = false); } else { } } SetSysStatus(p => p.CurrentReleaseIndex_TrayB++); //TODO:写入产量,计算PPM,计算Lot数量,当前数量,暂不处理 } else if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayC) { var TrayCReleaseIndex = GetSysStatus(p => p.CurrentReleaseIndex_TrayC); if (qtyForTray >= 4) { if (qtyForTray - TrayCReleaseIndex == 2) //倒数第二格 { //通知PLC TrayC准备换盘了 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_ReadyForChange_TrayC), 1); } else if (qtyForTray - TrayCReleaseIndex == 1) //最后一格 { //TODO:换lot和换料盘等相关操作待定 //通知PLC TrayC换盘 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayC), 1); SetSysStatus(p => p.VisionChecked_TrayC = false); } else { //TODO:正常情况,暂不处理,留位 } } else { if (qtyForTray - TrayCReleaseIndex == 1) //最后一格 { _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayC), 1); SetSysStatus(p => p.VisionChecked_TrayC = false); } else { //TODO:正常情况,暂不处理,留位 } } SetSysStatus(p => p.CurrentReleaseIndex_TrayC++); //TODO:写入产量,计算PPM,计算Lot数量,当前数量,暂不处理 } else if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayD) { var TrayDReleaseIndex = GetSysStatus(p => p.CurrentReleaseIndex_TrayD); if (qtyForTray >= 4) { if (qtyForTray - TrayDReleaseIndex == 2) //倒数第二格 { //通知PLC TrayD准备换盘了 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_ReadyForChange_TrayD), 1); } else if (qtyForTray - TrayDReleaseIndex == 1) //最后一格 { //TODO:换lot和换料盘等相关操作待定 //通知PLC TrayD换盘 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayD), 1); SetSysStatus(p => p.VisionChecked_TrayD = false); } else { //TODO:正常情况,暂不处理,留位 } } else { if (qtyForTray - TrayDReleaseIndex == 1) //最后一格 { _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayD), 1); SetSysStatus(p => p.VisionChecked_TrayD = false); } else { //TODO:正常情况,暂不处理,留位 } } SetSysStatus(p => p.CurrentReleaseIndex_TrayD++); //TODO:写入产量,计算PPM,计算Lot数量,当前数量,暂不处理 } else if (GetSysStatus(p => p.EnumBisReturn_ResultType_Running) == EnumBisReturn_ResultType.TrayE) { var TrayEReleaseIndex = GetSysStatus(p => p.CurrentReleaseIndex_TrayE); if (qtyForTray >= 4) { if (qtyForTray - TrayEReleaseIndex == 2) //倒数第二格 { //通知PLC TrayE准备换盘了 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_ReadyForChange_TrayE), 1); } else if (qtyForTray - TrayEReleaseIndex == 1) //最后一格 { //TODO:换lot和换料盘等相关操作待定 //通知PLC TrayE换盘 _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayE), 1); SetSysStatus(p => p.VisionChecked_TrayE = false); } else { //TODO:正常情况,暂不处理,留位 } } else { if (qtyForTray - TrayEReleaseIndex == 1) //最后一格 { _netPLC.WriteUshort(GetPLCAddr(p => p.PLC_Input_Addr_Reload_TrayE), 1); SetSysStatus(p => p.VisionChecked_TrayE = false); } else { //TODO:正常情况,暂不处理,留位 } } SetSysStatus(p => p.CurrentReleaseIndex_TrayE++); //TODO:写入产量,计算PPM,计算Lot数量,当前数量,暂不处理 } else { throw new Exception("不存在此种情况"); } SYS_IBG_LOG(DEBUGL1MSG, 0, 0, $"ThreadRobot:{GetSysStatus(p => p.EnumBisReturn_ResultType_Running).ToString()}产量写入完成"); #endregion }); threadStep = 1; break; case 4: break; case 5: break; case 6: break; case 7: break; case 100: //NG流程 if (!GetSysStatus(p => p.Robot_Input_NGBoxInplace) || GetSysStatus(p => p.Robot_Input_NGBoxIsFull)) { break; } //TODO:NG流程模式未设置 _robotController.ROBOT_CatchAndPutBattery( 0, GetThePosition(EnumDefaultPosition.Catch), GetThePosition(EnumDefaultPosition.NG), GetSysConfig(p => p.ZAxiaSafePosition) ); threadStep = 1; break; case 200: //电池被抓到待机位A,等待条件准备好 if (GetSysStatus(p => p.PLC_Output_IsReady_TrayA) && GetSysStatus(p => p.VisionChecked_TrayA) && EnumBisReturn_ResultType.TrayA == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手从待机位A抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayA = false); SetSysStatus(p => p.VisionChecked_TrayA = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.StandyA), GetThePosition(EnumDefaultPosition.TrayA, GetSysStatus(p => p.CurrentReleaseIndex_TrayA)), GetSysConfig(p => p.ZAxiaSafePosition) ); //跳到视觉检测 threadStep = 3; } else if (GetSysStatus(p => p.PLC_Output_IsReady_TrayB) && GetSysStatus(p => p.VisionChecked_TrayB) && EnumBisReturn_ResultType.TrayB == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayB = false); SetSysStatus(p => p.VisionChecked_TrayB = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.StandyA), GetThePosition(EnumDefaultPosition.TrayB, GetSysStatus(p => p.CurrentReleaseIndex_TrayB)), GetSysConfig(p => p.ZAxiaSafePosition) ); //跳到视觉检测 threadStep = 3; } else { //TODO:定义防呆功能,待定 } break; case 300: if (GetSysStatus(p => p.PLC_Output_IsReady_TrayC) && GetSysStatus(p => p.VisionChecked_TrayC) && EnumBisReturn_ResultType.TrayC == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayC = false); SetSysStatus(p => p.VisionChecked_TrayC = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.StandyB), GetThePosition(EnumDefaultPosition.TrayC, GetSysStatus(p => p.CurrentReleaseIndex_TrayC)), GetSysConfig(p => p.ZAxiaSafePosition) ); //跳到视觉检测 threadStep = 3; } else if (GetSysStatus(p => p.PLC_Output_IsReady_TrayD) && GetSysStatus(p => p.VisionChecked_TrayD) && EnumBisReturn_ResultType.TrayD == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayD = false); SetSysStatus(p => p.VisionChecked_TrayD = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.StandyB), GetThePosition(EnumDefaultPosition.TrayD, GetSysStatus(p => p.CurrentReleaseIndex_TrayD)), GetSysConfig(p => p.ZAxiaSafePosition) ); //跳到视觉检测 threadStep = 3; } else if (GetSysStatus(p => p.PLC_Output_IsReady_TrayE) && GetSysStatus(p => p.VisionChecked_TrayE) && EnumBisReturn_ResultType.TrayE == GetSysStatus(p => p.EnumBisReturn_ResultType_Running)) { //机械手抓电池到Put位 SetSysStatus(p => p.PLC_Output_IsReady_TrayE = false); SetSysStatus(p => p.VisionChecked_TrayE = false); SetSysStatus(p => p.Sys_BatteryIsReady = false); _robotController.ROBOT_CatchAndPutBattery( 0, //TODO:机械手运动模式未设置 GetThePosition(EnumDefaultPosition.StandyB), GetThePosition(EnumDefaultPosition.TrayE, GetSysStatus(p => p.CurrentReleaseIndex_TrayE)), GetSysConfig(p => p.ZAxiaSafePosition) ); //跳到视觉检测 threadStep = 3; } else { //TODO:定义防呆功能,待定 } break; } if (threadStep != GetSysStatus(p => p.Thread_RobotStep)) { SetSysStatus(p => p.Thread_RobotStep = threadStep); } } }
/// <summary> /// 料盘拍照+相片保存+视觉检测 /// </summary> /// <param name="trayType">TrayA,TrayB...</param> /// <param name="threadName"></param> /// <param name="vision"></param> /// <param name="baslerCamera"></param> /// <param name="picWidth"></param> /// <param name="picHeight"></param> /// <returns></returns> private void TrayVisionHandle(string trayType, string threadName, Vision.Vision vision, BaslerCamera.BaslerCamera baslerCamera, long picWidth, long picHeight) { //TODO:料盘的偏差暂无法使用 double x, y, a = 0.0; //TODO:tray相片储存路径 string trayPictureFilePath = string.Empty; byte[] buff = TakePicture(baslerCamera, picWidth, picHeight, threadName); if (0 == vision.CheckBatteryStatus(buff, picWidth, picHeight, 0, trayPictureFilePath, out x, out y, out a, GetSimulate <bool>(p => p.Simulate_Vision), true)) { //保存相片,TODO:相片保存路径,是否需要经过视觉处理后才取得?,如不需要视觉处理后才取得则可异步,后续处理 Task.Run(() => { mVision.SavePicJPEG(buff, (int)picWidth, (int)picHeight, trayPictureFilePath + ".jpg"); }); } else { //TODO:视觉处理只有0,1两个状态?,需要报警具体信息?! SYS_IBG_LOG(WARNINGERR, 0, 0, $"{threadName}:{trayType}料盘有异物"); //TODO:发现异物,需要暂停? 需要告诉PLC 机械手?? } }