////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //추가 : //목적 : 시퀀스 스레드 //설명 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private static void ThreadManager(object state) { structureManagerArgs obj = ( structureManagerArgs )state; CProcessVisionManagerProcess150 pThis = (CProcessVisionManagerProcess150)obj.pThis; int iCameraIndex = obj.iCameraIndex; // 트리거는 토글 형식으로 동작하는데.. 라이브는 on, off 형식이라 기본 Live off 함수로 들어감. // 이전 값 갖고 변경되는 시점에만 함수 타도록 변경 bool bPreviousLive = false; bool bLive = false; while (false == pThis.m_bThreadExit) { // 검사 타입별로 Is, Do 함수 구분시킴 // 트레이 파트 if (pThis.m_typeProcessVisionProcess150 == pThis.m_objProcessVisionProcess150[iCameraIndex].GetType()) { if (true == pThis.IsInspection(iCameraIndex)) { pThis.DoProcessInspection(iCameraIndex); } else { bLive = pThis.IsLive(iCameraIndex); if (bPreviousLive != bLive) { pThis.DoProcessLive(iCameraIndex, bLive); } bPreviousLive = bLive; } } Thread.Sleep(5); } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //추가 : //목적 : 초기화 함수 //설명 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public override bool Initialize() { bool bReturn = false; do { var pDocument = CDocument.GetDocument; // 비전 얼라인 m_objProcessVisionProcess150 = new CProcessAbstract[( int )CDefine.enumCamera.CAMERA_FINAL]; for (int iLoopCount = ( int )CDefine.enumCamera.CAMERA_1; iLoopCount < ( int )CDefine.enumCamera.CAMERA_FINAL; iLoopCount++) { CProcessVisionProcess150 obj = new CProcessVisionProcess150(); obj.Initialize(iLoopCount); m_objProcessVisionProcess150[iLoopCount] = obj; m_typeProcessVisionProcess150 = obj.GetType(); } // PLC 객체 참조 m_objPLC = pDocument.m_objProcessMain.m_objPLC; // 조명 컨트롤러 객체 참조 m_objLightController = new CDeviceLightController[pDocument.m_objProcessMain.m_objLightController.Length]; for (int iLoopCount = 0; iLoopCount < pDocument.m_objProcessMain.m_objLightController.Length; iLoopCount++) { m_objLightController[iLoopCount] = pDocument.m_objProcessMain.m_objLightController[iLoopCount]; } // 메인 스레드 m_ThreadManager = new Thread[( int )CDefine.enumCamera.CAMERA_FINAL]; for (int iLoopCount = 0; iLoopCount < m_ThreadManager.Length; iLoopCount++) { m_ThreadManager[iLoopCount] = new Thread(ThreadManager); structureManagerArgs objArgs = new structureManagerArgs(this, iLoopCount); m_ThreadManager[iLoopCount].Start(objArgs); } bReturn = true; } while(false); return(bReturn); }