2011년 2월 11일 금요일

HDR


CEDM 보수작업 로봇을 작업위치까지 이동시키는 Head Delivery Robot 을 컨트롤 하는 프로그램
VC++ 6.0에서 OpenGL을 이용해서 3D그래픽 처리하는 부분을 ActiveX로 만들어서 분리 시켰다.
주 프로그램도 VC++ 6.0을 사용했으며 모터 이동은 PMAC컨트롤러를 사용했다.

VC++ MFC에서 ActiveX 사용하기

Visual C++ 6.0 기준 (VC++ 9.0필요)

ActiveX 만드는 방법

1. File - New 에서 MFC ActiveX ControlWizard 선택
-> 적당히 ActiveX project를 생성시킨다.


2. ClassView 에서 가장 처음항목(아이콘이 고리모양임) "_ProjectName"
여기에서 우측버튼을 눌러 Add Method 를 선택해서 외부로 공개할 함수를 등록한다.



"_ProjectNameEvents" 는 CallBack 함수를 등록하는 곳이다.
ActiveX 에서 자신을 로드한 부모 프로세서로 명령을 보낸다.



ActiveX 링크파일 만들기

1. 전체 프로젝터를 다른 폴더로 목사한다음 Visual C++ 9.0 에서 로드한다.

2. ClassView 에서 우측버튼을 눌러서 "추가 - 클래스" 를 선택하고
"ActiveX 컨트롤의 MFC 클래스" 를 선택한다.
(* VC6에는 "추가" 항목이 없다)




3. 사용 가능한 ActiveX 컨트롤 항목에서 원하는 이름을 선택한후, 인터페이스 항목을 선택하고 ">" 버튼을 누르면 생성된 클래스에 이름이 나온다. "마침" 을 누르면 인터페이스 클래스가 생성 되었다.




ActiveX 사용하는 방법

1. 위에서 생성된 인터페이스 클래스를 Visual C++ 6.0 project 로 가져가서 일반 class처럼 사용하면 된다.



CallBack event 수신하기

1. 작업 class의 h 파일에 "DECLARE_EVENTSINK_MAP" 를 추가한다.

//{{AFX_MSG(CGenesisCtrlView)
afx_msg void OnTimer(UINT nIDEvent);
...
DECLARE_EVENTSINK_MAP ()
//}}AFX_MSG

2. CallBack 함수 원형을 참조해서 cpp 파일에 "ON_EVENT" 를 추가한다.

BEGIN_EVENTSINK_MAP(CGenesisCtrlView, CFormView)
//{{AFX_EVENTSINK_MAP(CGenesisCtrlView)
ON_EVENT(CGenesisCtrlView, -1, 1, OnMoveHole, VTS_R8 VTS_R8 VTS_R8)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
// -1은 ID가 없기 때문임. Dialog등에 속해있다면 그 ID를 사용함
// 1은 함수번호.

3. OnMoveHole(double,double,double) 함수를 만들면 호출됨.