기능
비동기 방식의 move_periodic모션으로 비동기 처리 외에 move_periodic() 함수와 동일하게 동작하며 모션 종료를 기다리지 않고 모션 시작과 동시에 리턴하여 다음 라인을 실행한다. move_periodic() 함수에 의한 모션이 종료되기 전에 발생하는 새로운 모션 명령어는 안전상의 이유로 오류를 발생시킨다. 따라서 amove_periodic() 함수와 이어지는 새로운 모션명령어 사이에는 mwait() 함수를 사용하여 amove_periodic()에 의한 모션이 종료된 것를 확인한 후 새로운 모션명령어가 시작되도록 해야한다.
이 명령어는 현재위치에서 시작하는 상대 모션어로 입력된 기준 좌표계(eMoveReferecne)의 각 축(병진 및 회전)에 대한 Sine함수 기반으로 주기모션을 수행합니다. 각 축 별 모션의 특성은 진폭과 주기에 의해 결정되고 가감속 시간과 총 모션 시간은 주기, 반복 및 횟수에 의해 설정된다.
인수
|
인수명 |
자료형 |
기본값 |
범위 |
설명 |
|---|---|---|---|---|
|
fAmplitude |
float[6] |
- |
>=0 |
Amplitude(-fAmplitude 에서 + fAmplitude 사이 모션) [mm] or [deg] |
|
fPeriodic |
float[6] |
- |
>=0 |
period(1주기 소요 시간)[sec] |
|
fAccelTime |
float |
- |
>=0 |
Acc-, dec- time [sec] |
|
nRepeat |
unsigned char |
- |
> 0 |
반복 횟수 |
|
eMoveReference |
enum.MOVE_REFERENCE |
MOVE_REFERENCE_TOOL |
- |
상수 및 열거형 정의 참조 |
-
fAmplitude 는 진폭(amplitude)을 의미하며, 각 축(x, y, z, rx, ry, rz) 별로 6개가 입력되어야 합니다. 단, 주기 모션을 진행하지 않는 축 방향은 fAmplitude 를 0으로 입력해야 합니다.
-
fPeriodic 는 해당 방향 모션의 1회 반복 시간을 의미하며, 각 축(x, y, z, rx, ry, rz) 별 6개가 입력되어야 합니다.
-
fAccelTime 은 주기모션의 시작과 끝의 가속 및 감속 시간을 의미합니다. 입력된 가감속시간과 최대주기*1/4 중 큰 값이 적용됩니다. 입력된 가감속 시간이 전체모션시간의 1/2을 초과하는 경우 에러가 발생합니다.
-
nRepeat 은 가장 큰 period 값을 가지는 축(기준 축)의 반복 횟수를 정의하며, 이에 따라 총 모션 시간이 결정됩니다. 나머지 축의 반복 횟수는 모션 시간에 따라 자동 결정됩니다.
-
모션이 정상 종료되는 경우 종료 위치가 시작 위치와 일치하게 하도록 나머지 축 모션은 기준 축 모션이 종료되기 전에 먼저 종료될 수 있습니다. 모든 축의 모션이 동시 종료되지 않는 경우 감속구간에서의 경로는 이전 경로에서 벗어나게 됩니다. 관련한 사항은 아래 이미지를 참조하십시오
-
eMoveReference 는 반복 모션의 기준 좌표계를 의미합니다.
-
모션명령 수행 시 최대속도 에러가 발생하는 경우 다음의 식을 참조하여 진폭 및 주기를 조정할 것을 제안합니다.
최대속도=진폭(fAmplitude)*2*pi(3.14)/주기(fPeriodic)
(예, 진폭=10mm, 주기=1초인 경우 최대속도=62.83mm/sec) -
선행모션과 후행모션에 대한 온라인 블렌딩은 지원하지 않습니다.
리턴
|
값 |
설명 |
|---|---|
|
0 |
오류 |
|
1 |
성공 |
예제
// Tool좌표계 x축(10mm진폭, 1초 주기)모션과 y회전축(진폭 0.5deg, 1초 주기)
// 모션을 총 5회 반복 수행
// periodic 모션을 시작하고 1초 후에 Digital_Output 채널1번을 SET(1) 한다.
float fAmplitude[NUM_TASK] = {10, 0, 0, 0, 0.5, 0};
float fPeriod[NUM_TASK] = { 1, 1, 1, 1, 1, 1};
Drfl.amove_periodic(fAmplitude, fPeriod, 0.5, 5, MOVE_REFERENCE_TOOL);
Sleep(1000);
Drfl.set_digital_output(GPIO_CTRLBOX_DIGITAL_INDEX_1, 1);
Drfl.mwait();