CDRFLEx.amove_periodic
기능
비동기 방식의 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();