cmcHomeIsBusy


SYNOPSYS

VT_I4 cmcHomeIsBusy ([in] VT_I4 BoardID, [in] VT_I4 Channel, [out] VT_PI4 IsBusy)

DESCRIPTION

  • 지정한 축이 현재 원점복귀를 진행중인지를 IsBusy 버퍼를 통하여 반환합니다.

  • 이 함수의 사용과 호출에 있어, 제공된 ㈜커미조아의 함수 헤더 Visual Basic 에서는 함수의 첨두어 cmc 가 붙지 않습니다.

PARAMETER

▶ BoardID : 사용자가 설정한 디바이스(보드) ID.

▶ Channel : 축(채널) 번호. 축번호는 상수값으로 3번째 채널을 기준 채널로 임의의 채널을 설정할 수 있습니다.

▶ IsBusy : 현재 원점복귀가 진행중인지를 알려주는 값을 반환받을 버퍼. 이 값에 반환되는 값의 의미는 다음과 같습니다.

Value

Meaning

0 (cmcFALSE)

지정한 축은 현재 원점복귀가 진행중이지 않습니다.

1 (cmcTRUE)

지정한 축은 현재 원점복귀를 진행하고 있습니다.

RETURN VALUE

Value

Meaning

음수

수행 실패

ERR_NONE

수행 성공

REFERENCE

  • ComiMLink3 라이브러리에서는 cmcSxIsDone()과 같이 일반적으로 모션이 진행중이냐 아니면 정지(停止)해 있느냐를 확인(確認)할 때, 진행중(Busy)을 확인(確認)하기 보다는 완료(Done)를 확인(確認)하는 방식을 채택합니다. 그러나 원점복귀에서는 cmcHomeGetSuccess() 함수와 혼동될 소지가 있어서 cmcHomeIsDone() 함수 대신에 cmcHomeIsBusy() 함수를 제공하게 되었습니다.

  • cmcHomeIsBusy() 함수가 IsBusy 버퍼에 FALSE값이 반환되면 원점복귀가 완료되었음을 의미하지만 성공 여부는 알 수가 없습니다. 예를 들어 원점복귀 진행 중에 Limit 또는 Alarm등과 같은 에러에 의해서 정지(停止)되었거나, Stop 함수에 의해서 강제로 정지(停止)되었을 때도 IsBusy에는 FALSE값이 반환됩니다. 따라서 cmcHomeIsBusy()함수를 이용하여 원점복귀의 원점복귀가 완료되었음을 확인(確認)한 후에는 cmcHomeGetSuccess() 함수를 사용하여 원점복귀의 성공여부를 확인(確認)하여 각각의 상황에 대한 처리를 해주는 것이 바람직합니다.

EXAMPLE

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 C/C++
 // BoardID는 0으로 선언되었다고 가정함
 BOOL OnHomeMove(int nAxis)
 {
 long dwIsHomming = TRUE;
 cmcHomeMoveStart(BoardID, nAxis, cmDIR_N);
 while(dwIsHomming){
 cmcHomeIsBusy(BoardID, nAxis, &dwIsHomming);
 // 원점복귀 진행여부 읽기
 // 윈도우 메시지를 처리해준다 (단, 쓰레드를 사용하는 경우에는
 // 아래 함수는 생략되어야 한다)
 cmcUtlProcessWndMsgM(BoardID, GetSafeHwnd(), 500, NULL);
 }
 long dwIsSuccess;
 if(cmcHomeGetSuccess(BoardID, nAxis, &dwIsSuccess) != ERR_NONE){
 // 에러메시지 출력
 return FALSE;
 }
 if(dwIsSuccess){
 MessageBox(NULL, “원점복귀를 성공적으로 수행하였습니다.”, “Message”,
 MB_OK);
 }else{
 char szErrMsg[CMC_MAX_STR_LEN_ERR];
 char szErrReason[CMC_MAX_STR_LEN_ERR];
 long dwErrCode;
 cmcErrGetLastCode(BoardID, nAxis, &dwErrCode);
 cmcErrGetString(BoardID, dwErrCode, szErrReason,
 CMC_MAX_STR_LEN_ERR);
 sprintf(szErrMsg, “다음과 같은 이유로 원점복귀에 실패하였습니다.\n%s”,
 szErrReason);
 }
 return TRUE;
 }
 MessageBox(NULL, szErrMsg, “Motion Error”, MB_OK | MB_ICONERROR);
 return FALSE;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 Visual Basic
 „BoardID 는 0으로 선언되었다고 가정함
 Dim dwIsHomming As Long
 Dim dwIsSuccess As Long
 dwIsHomming = True
 Call HomeMoveStart(BoardID, 3, cmDIR_N)
 Do While (dwIsHomming)
 Call HomeIsBusy(BoardID, 3, dwIsHomming) '원점 진행여부 확인(確認)
 loop
 If (HomeGetSuccess(BoardID, 3, dwIsSuccess) <> ERR_NONE) Then
 // 에러메시지 출력
 End If
 If (dwIsSuccess) Then
 MsgBox ("원점 복귀를 성공적으로 수행하였습니다.")
 End If