public void UpdateDisplayPMS(enumDisplayIndex eDisplayIndex, CInspectionResult.CResult objResult) { CFormDisplay obj = m_objFormDisplay[( int )eDisplayIndex] as CFormDisplay; do { if (null == obj) { break; } obj.BeginInvoke(obj.m_objDelegateUpdateDisplayPMSImage, objResult); } while (false); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //추가 : //목적 : 이미지 저장 해당 델리게이트 호출 //설명 : 비동기 호출 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public void SaveImage(int iCameraIndex, CInspectionResult.CResult objResult) { var pDocument = CDocument.GetDocument; CFormDisplay obj = m_objFormDisplay[iCameraIndex] as CFormDisplay; do { if (null == obj) { break; } if (CDefine.enumRunMode.RUN_MODE_START == pDocument.GetRunMode()) { obj.BeginInvoke(obj.m_objDelegateSaveImage, objResult, false); } else { obj.BeginInvoke(obj.m_objDelegateSaveImage, objResult, true); } } while(false); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //추가 : //목적 : 검사 시작 //설명 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public bool DoProcessInspection(int iCameraIndex) { bool bReturn = false; var pDocument = CDocument.GetDocument; Stopwatch objTact = new Stopwatch(); Stopwatch objStopwatch = new Stopwatch(); string strPlcCameraName = string.Format("CAMERA_{0}", iCameraIndex + 1); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "DoProcessInspection"); //PLC객체 HLDevice.CDevicePLC objPLC = pDocument.m_objProcessMain.m_objPLC; // 결과구조체 CInspectionResult.CResult objResult = new CInspectionResult.CResult(); CConfig.CRecipeParameter objRecipeParameter = pDocument.m_objConfig.GetRecipeParameter(iCameraIndex); int iAlarmCode = ( int )CDefine.enumVisionAlarmType.NONE; do { // 택타임 측정 objTact.Start(); // 비전 Busy상태 if (false == m_objPLC.HLWriteWordFromPLC("PC_BUSY", ( short )CDefine.enumVisionStatus.STATUS_BUSY)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Vision_Status_Busy On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Vision_Status_Busy On"); } // 셀ID를 읽음 string strCellID = ReadCellID(); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Read Cell ID : " + strCellID); // string strCellID = ""; // PLC 데이터 읽기 short[] iReadData = new short[( int )CDefine.enumPLCInputIndex.PLC_FINAL]; m_objPLC.HLReadWordFromPLC(CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE.ToString(), iReadData.Length, ref iReadData); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Read Recipe ID : " + iReadData[( int )CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE].ToString()); // 레시피 체크 if (false == DoProcessRecipe(iReadData[( int )CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE])) { break; } int iCurrentInspectionIndex = iReadData[( int )CDefine.enumPLCInputIndex.PLC_INSPECTION_INDEX] - 1; // 티치모드이면 저장되어있는 포지션을 바로 사용하자 CConfig.CSystemParameter objSystemParameter = pDocument.m_objConfig.GetSystemParameter(); if (true == objSystemParameter.bVidiTeachMode) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Teach Mode"); iCurrentInspectionIndex = pDocument.GetInspectionIndex(); } // 설정한 검사포지션수 초과시 NG if (iCurrentInspectionIndex > objRecipeParameter.iCountInspectionPosition) { pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "INSPECTION POSITION OVER"); iAlarmCode = (int)CDefine.enumVisionAlarmType.INSPECTION_POSITION_OVER_RANGE; break; } if (0 > iCurrentInspectionIndex) { iCurrentInspectionIndex = 0; } // 검사인덱스를 가지고 있고 pDocument.SetInspectionIndex(iCurrentInspectionIndex); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Index : " + (iCurrentInspectionIndex + 1).ToString()); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Grab Start"); // 그랩 objStopwatch.Start(); if (false == DoProcessTrigger(iCameraIndex)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Grab Fail"); iAlarmCode = ( int )CDefine.enumVisionAlarmType.GRAB_FAIL; break; } objStopwatch.Stop(); CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "Grab Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString()); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "PMS Start"); objStopwatch.Restart(); // PMS 이미지 만들기 CProcessVisionProcess150 obj = m_objProcessVisionProcess150[iCameraIndex] as CProcessVisionProcess150; // 트리거 ON obj.SetCommand(CProcessVisionProcess150.enumCommand.CMD_START_PMS); // Busy Off Thread.Sleep(20); if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_BUSY.ToString(), ( short )CDefine.enumVisionStatus.STATUS_IDLE)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Vision_Status_Busy Off"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Vision_Status_Busy Off"); } int iTimeOut = 25000; int iTimePeriod = 3; while (CProcessVisionProcess150.enumCommand.CMD_IDLE != obj.GetCommand() && iTimeOut > 0) { iTimeOut -= iTimePeriod; Thread.Sleep(iTimePeriod); } objStopwatch.Stop(); CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "PMS Image Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString()); if (0 >= iTimeOut) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "PMS Image Time Out"); iAlarmCode = ( int )CDefine.enumVisionAlarmType.PMS_IMAGE_SETTING_FAIL; break; } if (CProcessVisionProcess150.enumStatus.STS_ERROR == obj.GetStatus()) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "PMS IMAGE NG"); iAlarmCode = ( int )CDefine.enumVisionAlarmType.PMS_IMAGE_SETTING_FAIL; break; } ////////////////////////////////////////////////// // PMS이미지 까지 합성했다면. //Vidi Start pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "VIDI Start"); objStopwatch.Restart(); obj.SetCommand(CProcessVisionProcess150.enumCommand.CMD_START_INSPECTION); iTimeOut = 25000; iTimePeriod = 3; while (CProcessVisionProcess150.enumCommand.CMD_IDLE != obj.GetCommand() && iTimeOut > 0) { iTimeOut -= iTimePeriod; Thread.Sleep(iTimePeriod); } objStopwatch.Stop(); CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "VIDI Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString()); if (0 >= iTimeOut) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "VIDI Time Out"); objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex); objResult.objResultCommon.strCellID = strCellID; objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG; objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex; iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL; break; } if (CProcessVisionProcess150.enumStatus.STS_ERROR == obj.GetStatus()) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "VIDI Run NG"); objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex); objResult.objResultCommon.strCellID = strCellID; objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG; objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex; iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL; break; } // 여기서 결과 도출 objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex); objResult.objResultCommon.strCellID = strCellID; // 최종결과는 양품으로 설정하고, 1개라도 NG가 나오면 NG로 바꾸자 objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_OK; // 여기에 결과를 채우자, 일단은 1,0으로 채움 // 1포지션에 검사결과가 5개씩 있다고 가정 objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex; short[] iResult = new short[objResult.objResultCommon.iVidiResultCount];// ( int )CDefine.enumResultIndex.RESULT_FINAL ]; for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++) { // 일단 1보다 작으면 양품으로 테스트하자 if (objRecipeParameter.objInspectionParameter[pDocument.GetInspectionIndex()].dVidiScore > objResult.objResultCommon.objVidiScore[iLoopCount]) { objResult.objResultCommon.objVidiResult.Add(CDefine.enumResult.RESULT_OK); iResult[iLoopCount] = 1; } else { objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG; objResult.objResultCommon.objVidiResult.Add(CDefine.enumResult.RESULT_NG); iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL; } string strResult = string.Format("INDEX : {0}, VIDI_Score : {1:F2}, VIDI_Result : {2}", iLoopCount + 1, objResult.objResultCommon.objVidiScore[iLoopCount], CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult ? "OK" : "NG"); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), strResult); } //String strPLCAddressName = string.Format( "PC_INSPECTION_RESULT_{0}", iCurrentInspectionIndex * ( int )CDefine.enumResultIndex.RESULT_FINAL ); //String strPLCAddressName = string.Format(CDefine.enumPCOutIndex.PC_INSPECTION_RESULT_1.ToString() ); //if ( false == m_objPLC.HLWriteWordFromPLC( strPLCAddressName, iResult.Length, iResult ) ) // pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex ), "[SEND_PLC RESULT][FAIL]"+ strPLCAddressName ); //else // pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex ), "[SEND_PLC RESULT]" + strPLCAddressName ); bReturn = true; } while(false); bool bInspectResult = false; // 에러코드 if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_ALARM_CODE.ToString(), ( short )iAlarmCode)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Set AlarmCode"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Set AlarmCode"); } if (false == bReturn) { if (true == pDocument.m_objConfig.GetSystemParameter().bPassMode) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "VISION PASS MODE"); if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "VISION PASS MODE : FINAL_RESULT_OK"); bInspectResult = true; } else { if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_NG.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_NG On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_NG On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_NG"); bInspectResult = false; } } else { if (CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult) { if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_OK"); bInspectResult = true; } else { if (true == pDocument.m_objConfig.GetSystemParameter().bPassMode) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "VISION PASS MODE"); if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "VISION PASS MODE : FINAL_RESULT_OK"); bInspectResult = true; } else { if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_NG.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_NG On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_NG On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_NG"); bInspectResult = false; } } } pDocument.SetDisplayResult(pDocument.GetInspectionIndex(), bInspectResult); if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_COMPLETE.ToString(), (short)CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_COMPLETE On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_COMPLETE On"); } // 트리거 OFF pDocument.SetTrigger(( int )CDefine.enumCamera.CAMERA_1 + iCameraIndex, CDefine.enumTrigger.TRIGGER_OFF); objTact.Stop(); objResult.objResultCommon.strTactTime = objTact.ElapsedMilliseconds.ToString(); pDocument.SetUpdateDisplayPMS(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150.enumDisplayIndex.PMS); // 이미지 저장경로 넣기 objResult.strSaveImagePath = pDocument.m_objConfig.GetSystemParameter().strImageSavePath; pDocument.SetInspectionResultAlign(pDocument.GetInspectionIndex(), (CInspectionResult.CResult)objResult.Clone()); // 여기서 결과 디스플레이를 뿌리자 for (int iLoopCount = 0; iLoopCount < (CDefine.DEF_MAX_COUNT_CROP_REGION - 3); iLoopCount++) { pDocument.SetUpdateDisplayResultVIDI(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150.enumDisplayIndex.VIDI_1 + iLoopCount); } // 여기서 결과 디스플레이를 뿌리자 for (int iLoopCount = 0; iLoopCount < (CDefine.DEF_MAX_COUNT_CROP_REGION - 3); iLoopCount++) { pDocument.SetUpdateDisplayResultMeasure(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150.enumDisplayIndex.MEASURE_1 + iLoopCount); } // 이미지 저장 SaveImage((CInspectionResult.CResult)objResult.Clone()); // 택타임 측정 pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_TACT_TIME_CAMERA_0 + iCameraIndex), objTact.ElapsedMilliseconds.ToString() + "ms"); return(bReturn); }
public void UpdateDisplayResult(int iPosition) { var pDocument = CDocument.GetDocument; var pFormCommon = CFormCommon.GetFormCommon; do { CFormDisplay[] objFormDisplay = new CFormDisplay[m_objFormDisplayLeft.Length]; bool bInit = true; for (int iLoopCount = 0; iLoopCount < m_objFormDisplayLeft.Length; iLoopCount++) { if (21 == iPosition) { objFormDisplay[iLoopCount] = m_objFormDisplayLeft[iLoopCount] as CFormDisplay; } else if (23 == iPosition) { objFormDisplay[iLoopCount] = m_objFormDisplayRight[iLoopCount] as CFormDisplay; } else { bInit = false; break; } } if (false == bInit) { break; } CInspectionResult.CResult objResult = pDocument.GetInspectionResultAlign(iPosition); if (null == objFormDisplay) { break; } objFormDisplay[( int )enumDisplayIndex.OIRGINAL].BeginInvoke(objFormDisplay[( int )enumDisplayIndex.OIRGINAL].m_objDelegateUpdateDisplay3D, objResult); // 여기서 결과 디스플레이를 뿌리자 for (int iLoopCount = 0; iLoopCount < CDefine.DEF_MAX_COUNT_CROP_REGION; iLoopCount++) { // if( 21 == iPosition ) // obj = m_objFormDisplayLeft[ ( int )enumDisplayIndex.MEASURE_1 + iLoopCount ] as CFormDisplay; // else if( 23 == iPosition ) // obj = m_objFormDisplayRight[ ( int )enumDisplayIndex.MEASURE_1 + iLoopCount ] as CFormDisplay; //obj.BeginInvoke( obj.m_objDelegateUpdateDisplayMeasure3D, objResult ); objFormDisplay[( int )enumDisplayIndex.MEASURE_1 + iLoopCount].BeginInvoke(objFormDisplay[( int )enumDisplayIndex.MEASURE_1 + iLoopCount].m_objDelegateUpdateDisplayMeasure3D, objResult); } if (CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult) { if (21 == iPosition) { pFormCommon.SetButtonColor(this.BtnTitleCaseLeft, pFormCommon.COLOR_WHITE, pFormCommon.COLOR_GREEN); } else { pFormCommon.SetButtonColor(this.BtnTitleCaseRight, pFormCommon.COLOR_WHITE, pFormCommon.COLOR_GREEN); } } else { if (21 == iPosition) { pFormCommon.SetButtonColor(this.BtnTitleCaseLeft, pFormCommon.COLOR_WHITE, pFormCommon.COLOR_RED); } else { pFormCommon.SetButtonColor(this.BtnTitleCaseRight, pFormCommon.COLOR_WHITE, pFormCommon.COLOR_RED); } } } while(false); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //추가 : //목적 : 검사 시작 //설명 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public bool DoProcessInspection(int iCameraIndex) { bool bReturn = false; var pDocument = CDocument.GetDocument; Stopwatch objTact = new Stopwatch(); Stopwatch objStopwatch = new Stopwatch(); string strPlcCameraName = string.Format("CAMERA_{0}", iCameraIndex + 1); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "DoProcessInspection"); //PLC객체 HLDevice.CDevicePLC objPLC = pDocument.m_objProcessMain.m_objPLC; // 결과구조체 CInspectionResult.CResult objResult = new CInspectionResult.CResult(); CConfig.CRecipeParameter objRecipeParameter = pDocument.m_objConfig.GetRecipeParameter(iCameraIndex); int iAlarmCode = ( int )CDefine.enumVisionAlarmType.NONE; do { // 택타임 측정 objTact.Start(); // 셀ID를 읽음 string strCellID = ReadCellID(); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Read Cell ID : " + strCellID); // string strCellID = ""; // PLC 데이터 읽기 short[] iReadData = new short[( int )CDefine.enumPLCInputIndex.PLC_FINAL]; m_objPLC.HLReadWordFromPLC(CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE.ToString(), iReadData.Length, ref iReadData); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Read Recipe ID : " + iReadData[( int )CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE].ToString()); // 레시피 체크 if (false == DoProcessRecipe(iReadData[( int )CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE])) { break; } //검사 위치 Read int iCurrentInspectionIndex = iReadData[( int )CDefine.enumPLCInputIndex.PLC_INSPECTION_INDEX] - 1; //읽어온 검사 위치가 설정 수 보다 큰 경우 Error 후 종료 if (iCurrentInspectionIndex > objRecipeParameter.iCountInspectionPosition) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "INSPECTION POSITION OVER"); iAlarmCode = ( int )CDefine.enumVisionAlarmType.INSPECTION_POSITION_OVER_RANGE; break; } // 티치모드이면 저장되어있는 포지션을 바로 사용하자 CConfig.CSystemParameter objSystemParameter = pDocument.m_objConfig.GetSystemParameter(); if (true == objSystemParameter.bVidiTeachMode) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Teach Mode"); iCurrentInspectionIndex = pDocument.GetInspectionIndex(); } if (0 > iCurrentInspectionIndex) { iCurrentInspectionIndex = 0; } // 검사인덱스를 가지고 있고 pDocument.SetInspectionIndex(iCurrentInspectionIndex); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Index : " + (iCurrentInspectionIndex + 1).ToString()); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Grab Start"); // 그랩 objStopwatch.Start(); if (false == DoProcessTrigger(iCameraIndex)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Grab Fail"); iAlarmCode = ( int )CDefine.enumVisionAlarmType.GRAB_FAIL; // Busy Off if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_BUSY.ToString(), (short)CDefine.enumVisionStatus.STATUS_IDLE)) { pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Vision_Status_Busy Off"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Vision_Status_Busy Off"); } break; } objStopwatch.Stop(); CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "Grab Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString()); // Busy Off if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_BUSY.ToString(), ( short )CDefine.enumVisionStatus.STATUS_IDLE)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Vision_Status_Busy Off"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Vision_Status_Busy Off"); } // 이미지 만들기 objStopwatch.Restart(); CProcessVisionProcess150Gocator obj = m_objProcessVisionProcess150[iCameraIndex] as CProcessVisionProcess150Gocator; obj.SetCommand(CProcessVisionProcess150Gocator.enumCommand.CMD_PROCESS_IMAGE_DATA); // Busy Off int iTimeOut = 25000; int iTimePeriod = 3; while (CProcessVisionProcess150Gocator.enumCommand.CMD_IDLE != obj.GetCommand() && iTimeOut > 0) { iTimeOut -= iTimePeriod; Thread.Sleep(iTimePeriod); } objStopwatch.Stop(); CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "Image Data Process Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString()); if (0 >= iTimeOut) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Image Data Process Time Out"); iAlarmCode = ( int )CDefine.enumVisionAlarmType.PMS_IMAGE_SETTING_FAIL; break; } if (CProcessVisionProcess150Gocator.enumStatus.STS_ERROR == obj.GetStatus()) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Image Data Process NG"); iAlarmCode = ( int )CDefine.enumVisionAlarmType.PMS_IMAGE_SETTING_FAIL; break; } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Set Data Process"); objStopwatch.Restart(); ////////////////////////////////////////////////// // 이미지 획득 완료 시 검사 진행 objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex; //Vidi Start pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Start"); objStopwatch.Restart(); obj.SetCommand(CProcessVisionProcess150Gocator.enumCommand.CMD_START_INSPECTION); iTimeOut = 25000; iTimePeriod = 3; while (CProcessVisionProcess150Gocator.enumCommand.CMD_IDLE != obj.GetCommand() && iTimeOut > 0) { iTimeOut -= iTimePeriod; Thread.Sleep(iTimePeriod); } objStopwatch.Stop(); CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "Inspection Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString()); if (0 >= iTimeOut) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Time Out"); objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex); objResult.objResultCommon.strCellID = strCellID; objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG; objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex; iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL; break; } if (CProcessVisionProcess150Gocator.enumStatus.STS_ERROR == obj.GetStatus()) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Run NG"); objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex); objResult.objResultCommon.strCellID = strCellID; objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG; objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex; iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL; break; } // 여기서 결과 도출 objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex); objResult.objResultCommon.strCellID = strCellID; // 최종결과는 양품으로 설정하고, 1개라도 NG가 나오면 NG로 바꾸자 objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_OK; // 여기에 결과를 채우자, 일단은 1,0으로 채움 // 1포지션에 검사결과가 5개씩 있다고 가정 objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex; short[] iResult = new short[objResult.objResultCommon.iVidiResultCount]; // ( int )CDefine.enumResultIndex.RESULT_FINAL ]; for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++) { // 일단 1보다 작으면 양품으로 테스트하자 if (objRecipeParameter.objInspectionParameter[iCurrentInspectionIndex].dVidiScore < objResult.objResultCommon.objVidiScore[iLoopCount]) { objResult.objResultCommon.objVidiResult.Add(CDefine.enumResult.RESULT_OK); iResult[iLoopCount] = 1; } else { objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG; objResult.objResultCommon.objVidiResult.Add(CDefine.enumResult.RESULT_NG); iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL; } string strResult = string.Format("INDEX : {0}, VIDI_Score : {1:F2}, VIDI_Result : {2}", iLoopCount + 1, objResult.objResultCommon.objVidiScore[iLoopCount], CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objVidiResult[iLoopCount] ? "OK" : "NG"); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), strResult); } for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++) { // 일단 1보다 작으면 양품으로 테스트하자 if (0 >= objResult.objResultCommon.obj3DListHeightOverBlobCountHigh[iLoopCount] && 0 >= objResult.objResultCommon.obj3DListHeightOverBlobCountLow[iLoopCount]) { objResult.objResultCommon.objMeasureResult.Add(CDefine.enumResult.RESULT_OK); iResult[iLoopCount] = 1; } else { objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG; objResult.objResultCommon.objMeasureResult.Add(CDefine.enumResult.RESULT_NG); iAlarmCode = ( int )CDefine.enumVisionAlarmType.HEIGHT_OVER; } string strResult = string.Format(",POSITION: {0}, REGION: {1}, HEIGHT_MAX_OVER_REGION_COUNT : {2}, HEIGHT_MIN_OVER_REGION_COUNT : {3}, HEIGHT_RESULT : {4}", iCurrentInspectionIndex + 1, iLoopCount + 1, objResult.objResultCommon.obj3DListHeightOverBlobCountHigh[iLoopCount], objResult.objResultCommon.obj3DListHeightOverBlobCountLow[iLoopCount], CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objMeasureResult[iLoopCount] ? "OK" : "NG"); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), strResult); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_RESULT_MEASURE_3D_HEIGHT), strResult, false); } for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++) { // 일단 1보다 작으면 양품으로 테스트하자 if (objRecipeParameter.objInspectionParameter[iCurrentInspectionIndex].d3DWeldWidthMax > objResult.objResultCommon.obj3DListWeldWidth[iLoopCount] && objRecipeParameter.objInspectionParameter[iCurrentInspectionIndex].d3DWeldWidthMin < objResult.objResultCommon.obj3DListWeldWidth[iLoopCount]) { objResult.objResultCommon.objMeasureResult3DWidth.Add(CDefine.enumResult.RESULT_OK); iResult[iLoopCount] = 1; } else { objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG; objResult.objResultCommon.objMeasureResult3DWidth.Add(CDefine.enumResult.RESULT_NG); iAlarmCode = ( int )CDefine.enumVisionAlarmType.WELD_WIDTH_OVER; } string strResult = string.Format(",POSITION: {0}, REGION: {1} , WELD WIDTH : {2:F3}, WELD_WIDTH_RESULT : {3}", iCurrentInspectionIndex + 1, iLoopCount + 1, objResult.objResultCommon.obj3DListWeldWidth[iLoopCount], CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objMeasureResult3DWidth[iLoopCount] ? "OK" : "NG"); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), strResult); pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_RESULT_MEASURE_3D_WELD_WIDTH), strResult, false); } for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++) { // 일단 1보다 작으면 양품으로 테스트하자 string strResult = string.Format(",POSITION : {0}, REGION : {1}, SAMPLE HEIGHT DATA, ", iCurrentInspectionIndex + 1, iLoopCount + 1); for (int iLoopSample = 0; iLoopSample < objResult.objResultCommon.obj3DListSampleHeightData[iLoopCount].Count; iLoopSample++) { strResult += (string.Format("{0:F3},", objResult.objResultCommon.obj3DListSampleHeightData[iLoopCount][iLoopSample])); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_MEASURE_3D_HEIGHT_SAMPLE), strResult, false); } //String strPLCAddressName = string.Format( "PC_INSPECTION_RESULT_{0}", iCurrentInspectionIndex * ( int )CDefine.enumResultIndex.RESULT_FINAL ); //String strPLCAddressName = string.Format(CDefine.enumPCOutIndex.PC_INSPECTION_RESULT_1.ToString() ); //if ( false == m_objPLC.HLWriteWordFromPLC( strPLCAddressName, iResult.Length, iResult ) ) // pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex ), "[SEND_PLC RESULT][FAIL]"+ strPLCAddressName ); //else // pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex ), "[SEND_PLC RESULT]" + strPLCAddressName ); bReturn = true; } while(false); bool bInspectResult = false; // 에러코드 if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_ALARM_CODE.ToString(), ( short )iAlarmCode)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Set AlarmCode"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Set AlarmCode"); } if (false == bReturn) { if (true == pDocument.m_objConfig.GetSystemParameter().bPassMode) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "VISION PASS MODE"); if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "VISION PASS MODE : FINAL_RESULT_OK"); bInspectResult = true; } else { if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_NG.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_NG On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_NG On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_NG"); bInspectResult = false; } } else { if (CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult) { if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_OK"); bInspectResult = true; } else { if (true == pDocument.m_objConfig.GetSystemParameter().bPassMode) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "VISION PASS MODE"); if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "VISION PASS MODE : FINAL_RESULT_OK"); bInspectResult = true; } else { if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_NG.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_NG On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_NG On"); } pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_NG"); bInspectResult = false; } } } pDocument.SetDisplayResult(pDocument.GetInspectionIndex(), bInspectResult); if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_COMPLETE.ToString(), (short)CDefine.enumComplete.COMPLETE_ON)) { pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_COMPLETE On"); } else { pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_COMPLETE On"); } // 트리거 OFF pDocument.SetTrigger(( int )CDefine.enumCamera.CAMERA_1 + iCameraIndex, CDefine.enumTrigger.TRIGGER_OFF); objTact.Stop(); CInspectionResult.CInspectionHistoryData objHistory = new CInspectionResult.CInspectionHistoryData(); objHistory.strCellID = objResult.objResultCommon.strCellID; objHistory.iPosition = pDocument.GetInspectionIndex() + 1; objHistory.iTactTime = ( int )objTact.ElapsedMilliseconds; objHistory.strResult = CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult ? "OK" : "NG"; objHistory.strNgType = ((CDefine.enumVisionAlarmType)iAlarmCode).ToString(); for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++) { objHistory.dVidiScore[iLoopCount] = objResult.objResultCommon.objVidiScore[iLoopCount]; if (iLoopCount < objResult.objResultCommon.objVidiResult.Count) { objHistory.strVidiResult[iLoopCount] = CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objVidiResult[iLoopCount] ? "OK" : "NG"; } else { objHistory.strVidiResult[iLoopCount] = "NG"; } } for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++) { if (iLoopCount < objResult.objResultCommon.objMeasureResult.Count) { objHistory.str3dHeightResult[iLoopCount] = CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objMeasureResult[iLoopCount] ? "OK" : "NG"; } else { objHistory.str3dHeightResult[iLoopCount] = "NG"; } } //double dResolution = CDocument.GetDocument.m_objConfig.GetCameraParameter( ( int )CDefine.enumCamera.CAMERA_1 ).dResolution; for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++) { if (iLoopCount >= objResult.objResultCommon.obj3DListWeldWidth.Count) { objHistory.dMeasureWidth[iLoopCount] = 0; objHistory.dMeasureHeight[iLoopCount] = 0; } else { objHistory.dMeasureWidth[iLoopCount] = objResult.objResultCommon.obj3DListWeldWidth[iLoopCount]; } if (iLoopCount < objResult.objResultCommon.objMeasureResult3DWidth.Count) { objHistory.strMeasureResult[iLoopCount] = CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objMeasureResult3DWidth[iLoopCount] ? "OK" : "NG"; } else { objHistory.strMeasureResult[iLoopCount] = "NG"; } } // 높이 샘플데이터 for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++) { if (iLoopCount >= objResult.objResultCommon.obj3DListSampleHeightData[iLoopCount].Count) { objHistory.dMeasureHeight[iLoopCount] = 0; } else { objHistory.dMeasureHeight[iLoopCount] = objResult.objResultCommon.obj3DListSampleHeightData[iLoopCount].Max(); } } for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++) { if (iLoopCount < objResult.objResultCommon.objMeasureResult.Count) { objHistory.dMeasureStartX[iLoopCount] = objResult.objResultCommon.objMeasureLine[iLoopCount].dStartX; objHistory.dMeasureStartY[iLoopCount] = objResult.objResultCommon.objMeasureLine[iLoopCount].dStartY; objHistory.dMeasureEndX[iLoopCount] = objResult.objResultCommon.objMeasureLine[iLoopCount].dEndX; objHistory.dMeasureEndY[iLoopCount] = objResult.objResultCommon.objMeasureLine[iLoopCount].dEndY; } } objHistory.iMeasureLineFindCount = objResult.objResultCommon.objMeasureLine.Count; objHistory.dPatternPositionX = objResult.objResultCommon.dPatternPositionX; objHistory.dPatternPositionY = objResult.objResultCommon.dPatternPositionY; objResult.strSaveImagePath = pDocument.m_objConfig.GetSystemParameter().strImageSavePath; if ("" == objResult.objResultCommon.strCellID) { objResult.objResultCommon.strCellID = System.DateTime.Now.ToString("HH.mm.ss"); objHistory.strCellID = objResult.objResultCommon.strCellID; } string strToday = string.Format("{0:D4}-{1:D2}-{2:D2}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); string strPosition = "Position_" + (objResult.objResultCommon.iInspectionPosition + 1).ToString(); string strImagePath = objResult.strSaveImagePath + "\\" + strToday + "\\" + objResult.objResultCommon.eResult.ToString() + "\\" + objResult.objResultCommon.strCellID + "\\" + strPosition + "\\"; objHistory.strImagePath = strImagePath; // 데이터베이스 레포트 업데이트 pDocument.m_objProcessDatabase.m_objDatabaseSendMessage.SetInsertHistoryAlign(objHistory); objTact.Stop(); objResult.objResultCommon.strTactTime = objTact.ElapsedMilliseconds.ToString(); // pDocument.SetUpdateDisplayPMS( pDocument.GetInspectionIndex(), ( int )CFormMainProcess150.enumDisplayIndex.PMS ); //// 이미지 저장경로 넣기 objResult.strSaveImagePath = pDocument.m_objConfig.GetSystemParameter().strImageSavePath; pDocument.SetInspectionResultAlign(pDocument.GetInspectionIndex(), (CInspectionResult.CResult)objResult.Clone()); // 여기서 결과 디스플레이를 뿌리자 for (int iLoopCount = 0; iLoopCount < CDefine.DEF_MAX_COUNT_CROP_REGION; iLoopCount++) { pDocument.SetUpdateDisplayResultVIDI(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150Gocator.enumDisplayIndex.VIDI_1 + iLoopCount); } // // 여기서 결과 디스플레이를 뿌리자 for (int iLoopCount = 0; iLoopCount < CDefine.DEF_MAX_COUNT_CROP_REGION; iLoopCount++) { pDocument.SetUpdateDisplayResultMeasure(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150Gocator.enumDisplayIndex.MEASURE_1 + iLoopCount); } pDocument.SetUpdateDisplay3D(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150Gocator.enumDisplayIndex.IMAGE); // 이미지 저장 Save3DData((CInspectionResult.CResult)objResult.Clone()); // 배면 결과만 뿌리기 pDocument.SetDisplayResultMonitor(pDocument.GetInspectionIndex()); // 택타임 측정 pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_TACT_TIME_CAMERA_0 + iCameraIndex), objTact.ElapsedMilliseconds.ToString() + "ms"); return(bReturn); }
public void CallbackPMSDone() { Stopwatch objStopWatch = new Stopwatch(); objStopWatch.Start(); try { // PMS 이미지 완료되면, Inspect를 호출해서 비디 검사를 태웁시다 var pDocument = CDocument.GetDocument; CInspectionResult.CResult objResult = new CInspectionResult.CResult(); objResult = pDocument.GetInspectionResultAlign(pDocument.GetInspectionIndex()); //int Width = objResult.objResultCommon.objInputGrabOriginalImageBitmap[ 0 ].Width; int Width = m_iStride; int Height = objResult.objResultCommon.objInputGrabOriginalImageBitmap[0].Height; int iIndex; if (CDefine.enumInspectionType.TYPE_VIDI == m_eInspectionType) { iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_ALBEDO); m_ppbResultPMS[iIndex] = new byte[Width * Height]; IntPtr pAlbedo = m_PMSMix.GetAledoImagePMS(); Marshal.Copy(pAlbedo, m_ppbResultPMS[iIndex], 0, Width * Height); objResult.objResultCommon.objPMSImageBitmap[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height); objResult.objResultCommon.objPMSImage[iIndex] = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmap[iIndex]); iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_Q); m_ppbResultPMS[iIndex] = new byte[Width * Height]; IntPtr pQ = m_PMSMix.GetQImagePMS(); Marshal.Copy(pQ, m_ppbResultPMS[iIndex], 0, Width * Height); objResult.objResultCommon.objPMSImageBitmap[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height); objResult.objResultCommon.objPMSImage[iIndex] = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmap[iIndex]); iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_P); m_ppbResultPMS[iIndex] = new byte[Width * Height]; IntPtr pP = m_PMSMix.GetPImagePMS(); Marshal.Copy(pP, m_ppbResultPMS[iIndex], 0, Width * Height); objResult.objResultCommon.objPMSImageBitmap[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height); objResult.objResultCommon.objPMSImage[iIndex] = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmap[iIndex]); } else { iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_ALBEDO); m_ppbResultPMS[iIndex] = new byte[Width * Height]; IntPtr pAlbedo = m_PMSMix.GetAledoImagePMS(); Marshal.Copy(pAlbedo, m_ppbResultPMS[iIndex], 0, Width * Height); objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height); objResult.objResultCommon.objPMSImageMeasure[iIndex] = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex]); iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_Q); m_ppbResultPMS[iIndex] = new byte[Width * Height]; IntPtr pQ = m_PMSMix.GetQImagePMS(); Marshal.Copy(pQ, m_ppbResultPMS[iIndex], 0, Width * Height); objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height); objResult.objResultCommon.objPMSImageMeasure[iIndex] = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex]); iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_P); m_ppbResultPMS[iIndex] = new byte[Width * Height]; IntPtr pP = m_PMSMix.GetPImagePMS(); Marshal.Copy(pP, m_ppbResultPMS[iIndex], 0, Width * Height); objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height); objResult.objResultCommon.objPMSImageMeasure[iIndex] = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex]); } pDocument.SetInspectionResultAlign(pDocument.GetInspectionIndex(), (CInspectionResult.CResult)objResult.Clone()); ProcessDoneEvent(); } catch { } //CDocument.GetDocument.SetUpdateLog( CDefine.enumLogType.LOG_ETC, "PMS CallBack Image Process TactTime : " + objStopWatch.ElapsedMilliseconds.ToString() ); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //추가 : //목적 : 이미지 검사 //설명 : 4장의 이미지를 PMS통해 합친다. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public bool SetPMSImage() { bool bReturn = false; var pDocument = CDocument.GetDocument; // 검사 결과 구조체 CInspectionResult.CResult objResult = new CInspectionResult.CResult(); // 에러 로그 string strErrorLog = string.Format("CProcessVisionProcess60 {0} SetPMSImage ", m_iCameraIndex); Stopwatch objStopWatch = new Stopwatch(); objStopWatch.Start(); do { //pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + m_iCameraIndex ), strErrorLog ); objResult = pDocument.GetInspectionResultAlign(pDocument.GetInspectionIndex()); try { List <byte[]> objImageByte; CogImageToByteArr(objResult.objResultCommon.objInputGrabOriginImage, out objImageByte); int[] iImageSize = new int[objImageByte.Count]; for (int i = 0; i < objImageByte.Count; i++) { iImageSize[i] = objImageByte[i].Length; } bool bImageSizeSame = true; for (int i = 0; i < objImageByte.Count; i++) { if (iImageSize[0] != iImageSize[i]) { bImageSizeSame = false; CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0, "Set PMSImage Setting Fail"); break; } } if (false == bImageSizeSame) { break; } int iWidth = objResult.objResultCommon.objInputGrabOriginalImageBitmap[0].Width; int iHeight = objResult.objResultCommon.objInputGrabOriginalImageBitmap[0].Height; CogImage8Grey objCogImage = new CogImage8Grey(objResult.objResultCommon.objInputGrabOriginImage[0]); ICogImage8PixelMemory pmr = objCogImage.Get8GreyPixelMemory(CogImageDataModeConstants.Read, 0, 0, iWidth, iHeight); m_iStride = pmr.Stride; iWidth = m_iStride; for (int i = 0; i < objImageByte.Count; i++) { if (null != m_objMatImage[i]) { m_objMatImage[i].Release(); } m_objMatImage[i] = new Mat(iHeight, iWidth, MatType.CV_8UC1, objImageByte[i]); } m_PMSMix.SetPMSParameters(m_objMatImage[0].Cols, m_objMatImage[0].Rows, Constants.nThreshold); m_PMSMix.SetMatImages(m_objMatImage[0].Cols, m_objMatImage[0].Rows, Constants.ImageNum, m_objMatImage); m_PMS.DoStartProcess(Constants.ImageNum, m_objMatImage[0].Cols, m_objMatImage[0].Rows); } catch (Exception ex) { Trace.WriteLine("CPMSManager.cs -> SetPMSImage ---" + ex.StackTrace); CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "CPMSManager.cs -> SetPMSImage ---" + ex.ToString()); break; } bReturn = true; } while (false); //CDocument.GetDocument.SetUpdateLog( CDefine.enumLogType.LOG_ETC, "Set PMSImage Process TactTime : " + objStopWatch.ElapsedMilliseconds.ToString() ); pDocument.SetInspectionResultAlign(pDocument.GetInspectionIndex(), (CInspectionResult.CResult)objResult.Clone()); return(bReturn); }
public void drawChart(WinChartViewer viewer) { var pDocument = CDocument.GetDocument; CInspectionResult.CResult objResult = pDocument.GetInspectionResultAlign(m_iPositionInspection); do { double[,] objData = { { 0, 0 }, { 0, 0 } }; try { if (enumImageType.IMAGE_ORIGIN == m_eImageType) { if (null != objResult.objResultCommon.obj3DDataHeightCrop2d) { objData = objResult.objResultCommon.obj3DDataHeightCrop2d; } } else { if (null != objResult.objResultCommon.obj3DResultHeightData && m_iPositionCrop < objResult.objResultCommon.obj3DResultHeightData.Count) { objData = objResult.objResultCommon.obj3DResultHeightData[m_iPositionCrop]; } } double[] xData = new double[objData.GetLength(0) * objData.GetLength(1)]; double[] yData = new double[objData.GetLength(0) * objData.GetLength(1)]; double[] zData = new double[objData.GetLength(0) * objData.GetLength(1)]; int temp = 0; // for( int x = 0; x < objData.GetLength( 1 ); x++ ) { // for( int y = 0; y < objData.GetLength( 0 ); y++ ) { // xData[ temp ] = x; // yData[ temp ] = y; // zData[ temp ] = objData[ y, x ]; // temp += 1; // } // } int iX = 0, iY = 0; for (int x = objData.GetLength(1) - 1; x >= 0; x--) { iY = 0; for (int y = objData.GetLength(0) - 1; y >= 0; y--) { //for( int y = 0; y < objData.GetLength( 0 ); y++ ) { xData[temp] = x; yData[temp] = y; zData[temp] = objData[iY, x]; if (enumImageType.IMAGE_CROP == m_eImageType) { if (-1 < objData[iY, x]) { zData[temp] = objData[iY, x]; } else { zData[temp] = -1; } } temp += 1; iY++; } iX++; } zData[0] = 0.5; zData[1] = -0.5; c = null; // Create a SurfaceChart object of size 720 x 600 pixels c = new SurfaceChart(1082, 698); // Set the center of the plot region at (330, 290), //and set width x depth x height to // 360 x 360 x 270 pixels c.setPlotRegion(1082 / 2, 698 / 2, 700, 400, 400); // Set the data to use to plot the chart c.setData(xData, yData, zData); // Spline interpolate data to a 80 x 80 grid for a smooth surface c.setInterpolation(150, 150); // Set the view angles c.setViewAngle(elevationAngle, rotationAngle); // Check if draw frame only during rotation if (isDragging && true /*DrawFrameOnRotate.Checked*/) { c.setShadingMode(Chart.RectangularFrame); } // Add a color axis (the legend) in which the left center is anchored //at (650, 270). Set the length to 200 pixels and the labels on the //right side. c.setColorAxis(1000, 270, Chart.Left, 200, Chart.Right); // Set the x, y and z axis titles using 10 points Arial Bold font c.xAxis().setTitle("X", "Arial Bold", 15); c.yAxis().setTitle("Y", "Arial Bold", 15); // Set axis label font c.xAxis().setLabelStyle("Arial", 10); c.yAxis().setLabelStyle("Arial", 10); c.zAxis().setLabelStyle("Arial", 10); c.colorAxis().setLabelStyle("Arial", 10); // Output the chart viewer.Chart = c; } catch (Exception ex) { pDocument.SetUpdateLog(CDefine.enumLogType.LOG_VISION_EXCEPTION_CAMERA_0, "Draw Chart : " + ex.ToString()); } } while(false); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //추가 : //목적 : 초기화 //설명 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private bool Initialize() { bool bReturn = false; var pDocument = CDocument.GetDocument; do { m_eImageType = enumImageType.IMAGE_CROP; m_iPositionInspection = m_objReportImage.iInspectionIndex; m_iPositionCrop = 0; // 폼 초기화 if (false == InitializeForm()) { break; } winChartViewer1.updateViewPort(true, false); initChartViewer(winChartViewer1); timer1.Start(); m_objResult = new CInspectionResult.CResult(); string strImagePath = m_objReportImage.strImagePath; string strFilePath = ""; // 폴더 내 파일 목록 불러오기 try { for (int iLoopHeightChart = 0; iLoopHeightChart < CDefine.DEF_MAX_COUNT_CROP_REGION; iLoopHeightChart++) { strFilePath = ""; string[] arFileNames = System.IO.Directory.GetFiles(strImagePath + "\\"); // 폴더 내의 파일 수만큼 루프 for (int iLoopCount = 0; iLoopCount < arFileNames.Length; iLoopCount++) { if (-1 != arFileNames[iLoopCount].IndexOf("HEIGHT_RESULT_" + iLoopHeightChart.ToString())) { strFilePath = arFileNames[iLoopCount]; break; } } if ("" != strFilePath) { FileStream objFileStream = new FileStream(strFilePath, FileMode.Open, FileAccess.Read); StreamReader objStreamReader = new StreamReader(strFilePath, Encoding.UTF8); string strReadData = ""; List <string> objListReadData = new List <string>(); while ((strReadData = objStreamReader.ReadLine()) != null) { objListReadData.Add(strReadData); } string[] strWidthLength = objListReadData[0].Split(','); double[,] objHeightData = new double[objListReadData.Count, strWidthLength.Length - 1]; for (int iLoopFileHeight = 0; iLoopFileHeight < objHeightData.GetLength(0); iLoopFileHeight++) { string[] strData = objListReadData[iLoopFileHeight].Split(','); for (int iLoopFileWidth = 0; iLoopFileWidth < objHeightData.GetLength(1); iLoopFileWidth++) { objHeightData[iLoopFileHeight, iLoopFileWidth] = double.Parse(strData[iLoopFileWidth]); } } m_objResult.objResultCommon.obj3DResultHeightData.Add(objHeightData); objStreamReader.Close(); objFileStream.Close(); } } } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message); } ReloadChart(); winChartViewer1.MouseUsage = WinChartMouseUsage.ScrollOnDrag; bReturn = true; } while(false); return(bReturn); }