CRC (잔여 펄스 클리어) 신호 설정
개요
특정 서보팩의 경우 구동이 완료된 시점에서 또는 리미트 센서를 감지한 경우에 외부에서 CRC(Current Remaining Clear)신호를 받아
서보팩이 가지고 있는 잔여 펄스를 지워주어야 하는 경우가 발생한다.
이를 위해 신호핀을 할당하여 서보팩에 직접 연결할 수 있도록 제공하고 있으며, CRC 신호의 사용 여부, 출력 레벨,
리미트 신호 사용 여부 등을 설정할 수 있도록 함수로 제공하고 있다. 또한 임의로 사용자가 CRC 신호를 발생시킬 수 있도록 함수를 제공한다.
사용자가 설정한 CRC 신호의 출력 레벨이 되었을 때, CLR 단자의 전압은 NN24V로, 출력 레벨이 아닐 때의 CLR 단자는 Open Collector이다.
이 신호 모두 범용 출력과 마찬가지로 Photo-Coupler로 외부 신호와 전기적으로 절연되어 있다.
이 신호들은 외부의 특정 위치 또는 외부의 특정 조건에 의해 출력을 내게 되는데, 시간 지연은 Photo-Coupler를 거치는 동안 내부 회로의 시간 지연에 의한 것이다.
+ELM, -ELM을 입력으로 받는 CLR 신호의 경우 약 6㎲~8㎲ 정도의 시간 지연이 발생된다. Photo Coupler 출력은 Normally Open 형태의 출력이므로,
N24V 레벨의 전압을 얻기 위해서는 사용자는 Pull-up 저항을 붙여야 한다. Pull-up 저항은 약 10㏀의 저항을 사용한다.
Note) CRC 신호 설정 기능은 펄스 출력형 모션 제어기(PCI-N804/404, RTEX-PM)에서만 사용할 수 있는 기능이다.
비정상 구동 종료에 대한 CRC 사용 설정 함수
기구부가 End Limit에 걸렸을 때와 같은 비정상 구동 종료 상황에서 자동으로 CRC 신호를 발생시키도록 설정 할 수 있다. 이를 위해 CRC 신호의 레벨 및 출력 형태를 설정하는 AxmCrcSetMaskLevel 함수가 사용된다.
//0축에 CRC를 사용하기 위해서 초기 셋팅을 해준다. 레벨 설정이 잘못되면 모터가 움직이지 않을 수 있
다.
//0축에 CRC 신호 사용 여부를 설정한다
long lAxisNo = 0;
DWORD uLevel = HIGH;
AxmCrcSetMaskLevel(lAxisNo, uLevel, 6); //CRC 신호 폭 100msec 설정
Program으로 강제 출력 설정 함수
상황에 따라서 사용자가 임의로 CRC신호가 발생해주어야 하는데, 이때 사용하는 함수가 AxmCrcSetOutput 함수이다.
//0축에 CRC를 사용하기 위해서 초기 셋팅을 해준다. 레벨 설정이 잘못되면 모터가 움직이지 않을 수 있
다.
//0축에 CRC 신호 사용 여부를 설정한다
long lAxisNo = 0;
DWORD uLevel = HIGH;
AxmCrcSetMaskLevel(lAxisNo, uLevel);
//0축에 CRC 신호를 강제적으로 내보낸다.
DWORD uUse = ENABLE; // 0: DISABLE, 1:ENABLE
AxmCrcSetOutput(lAxisNo, uUse);
// Ex14_AXM_AdvancedCRC.cpp : Defines the entry point for the console application.
// CRC 출력을 설정 및 확인.
#include "stdafx.h"
#include "AXL.h"
#include <conio.h>
#include "stdio.h"
#define AXIS_0 0
void main(void)
{
// 라이브러리를 초기화한다.
// 7은 IRQ를 뜻한다. PCI에서 자동으로 IRQ가 설정된다.
DWORD Code = AxlOpen(7);
if (Code == AXT_RT_SUCCESS)
{
printf("라이브러리가 초기화되었다.\n");
//모션 모듈이 있는지 검사
DWORD uStatus;
Code = AxmInfoIsMotionModule(&uStatus);
if(Code == AXT_RT_SUCCESS)
{
if(uStatus == STATUS_EXIST)
{
printf("모션 모듈이 존재한다.\n");
// 0축의 +End limit 과 -End limit 의 Active level 을 HIGH로 설정한다.
AxmSignalSetLimit(AXIS_0, 0, HIGH, HIGH);
// 0축의 Inpositon 신호의 입력 레벨을 HIGH로 설정한다.
AxmSignalSetInpos(AXIS_0, HIGH);
// 0축의 알람 신호의 입력 레벨을 LOW로 설정한다.
AxmSignalSetServoAlarm(AXIS_0, LOW);
// 0축의 비상 정지 신호(ESTOP)의 Active 입력 레벨을 HIGH로 설정한다.
AxmSignalSetStop(AXIS_0, 0, HIGH);
//0축 지령 값을 mm단위가 되도록 한다.
AxmMotSetMoveUnitPerPulse(AXIS_0, 10, 10000);
//0축의 초기 속도를 1로 설정한다. Default : 1
AxmMotSetMinVel(AXIS_0, 1);
//0축의 펄스 출력 방식을 TwoCwCcwHigh로 한다.
AxmMotSetPulseOutMethod(AXIS_0, TwoCcwCwHigh);
//지정 축에 Encoder 입력 방식을 4체배로 설정한다.
AxmMotSetEncInputMethod(AXIS_0, ObverseSqr4Mode);
//Servo On
AxmSignalServoOn(AXIS_0, ENABLE);
//0축에 CRC를 사용하기 위해서 초기 셋팅을 해준다. 레벨 설정이 잘못되면 모터가 움직이지 않을 수 있다.
//0축에 CRC 신호 사용 여부를 설정한다
long lAxisNo = 0;
DWORD uLevel = HIGH;
AxmCrcSetMaskLevel(lAxisNo, uLevel, 6);
// help Message
printf("[INFORMATION]*************** \n");
printf("[ESC] : Exit \n");
printf("[1] : CRC HIGH로 출력 \n");
printf("[2] : CRC LOW로 출력 \n");
printf("******************************* \n");
DWORD uCRCOnOff = 2;
BOOL fExit = FALSE;
while (!fExit) // 무한 루프
{
if (kbhit()) // 아무 키나 누르면
{
int ch = getch();
switch (ch)
{
case 27: // Esc key
fExit = TRUE;
AxmSignalServoOn(AXIS_0, DISABLE); //Servo Off
break;
case '1': // CRC 신호를 프로그램적으로 강제 HIGH 출력
AxmCrcSetOutput(AXIS_0, ENABLE);
break;
case '2': // CRC 신호를 프로그램적으로 강제 LOW 출력
AxmCrcSetOutput(AXIS_0, DISABLE);
break;
}
}
//현재의 CRC 출력을 확인한다.
AxmCrcGetOutput(AXIS_0, &uCRCOnOff);
printf("\rCRC 출력 : %x",uCRCOnOff);
} //End of While()
}
else
printf ("AxmInfoIsMotionModule() : ERROR ( NOT STATUS_EXIST ) code 0x%x\n",Code);
}
else
printf ("AxmInfoIsMotionModule() : ERROR ( Return FALSE ) code 0x%x\n",Code);
}
else
printf ("AxlOpen() : ERROR code 0x%x\n",Code);
// 라이브러리를 종료한다.
if (AxlClose())
printf("라이브러리가 종료되었다.\n");
else
printf("라이브러리가 정상적으로 종료되지 않았다.\n");
}
CRC 신호 설정 구동 함수
Function | Description |
---|---|
AxmCrcSetMaskLevel | 지정 축에 CRC 신호 사용 여부 및 출력 레벨을 설정한다. |
AxmCrcGetMaskLevel | 지정 축의 CRC 신호 사용 여부 및 출력 레벨을 반환한다. |
AxmCrcSetOutput | 지정 축에 CRC 신호를 강제로 발생시킨다. |
AxmCrcGetOutput | 지정 축의 CRC 신호를 강제로 발생 여부를 반환한다. |
AxmCrcSetMaskLevel
Purpose
지정 축에 CRC 신호 사용 여부를 설정한다.
A Serviceable Product
BPHR / BPFR | BEHR / BEFR | PCI-Nx04 | PCIe-Nx04 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
O | O | O | O | ||||||||
PCI-Rxx04 | PCIe-Rxx04-RTEX | PCI-Rxx04-MLII | PCI-Rxx00-MLIII | ||||||||
A4N | A5N/A6N | PM | A4N | A5N/A6N | PM | SGDV | SGDV | SGD7 | PM | ||
O | O | ||||||||||
PCI-Rxx04-SIIIH | PCIe-Rxx04-SIIIH | PCIe-Rxx05-MLIII | PCIe-RxxIF-ECAT | ||||||||
MR-J4-B | PM | MR-J4-B | PM | SGDV | SGD7 | PM | Servo | PM | |||
O | O | O | O | O | |||||||
PCIe-Rxx05-ECAT | PCIe-Rxx05-ECAT-E | ||||||||||
Servo | PM | Servo | PM | ||||||||
O | O |
Format
C++
DWORD AxmCrcSetMaskLevel(long lAxisNo, DWORD uLevel, DWORD uMethod);
C#
uint AxmCrcSetMaskLevel(int lAxisNo, uint uLevel, uint uMethod);
Visual Baisc
Function AxmCrcSetMaskLevel(ByVal lAxisNo As Long, ByVal uLevel As Long, ByVal uMethod As Long) As Long
Delphi
function AxmCrcSetMaskLevel(lAxisNo : LongInt; uLevel : Dword;uMethod : Dword): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | 채널(축) 번호(0 ~ (최대 축 수 - 1)) |
[in]uLevel | [00h]CRC 신호 사용 여부 : AXT_MOTION_LEVEL_MODE_DEF - [00h] B 접점(NORMAL CLOSE) Active Low Level CRC 신호 사용 - [01h] A 접점(NORMAL OPEN) Active High Level CRC 신호 사용 - [02h] CRC 신호 사용 안 함 - [03h] CRC 신호 현 상태 유지 |
[in]uMethod | [00h]잔여 펄스 제거 출력 신호 펄스 폭 - [00h] 10 uSec - [01h] 100 uSec - [02h] 500 uSec - [03h] 1 mSec - [04h] 10 mSec - [05h] 50 mSec - [06h] 100 mSec - [07h] Logic Level |
Return Values
[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음
Description
CRC 신호의 사용 유무 및 출력 신호의 형태를 설정한다.
예제 코드
C++
// 0축에 CRC 신호 사용 여부를 설정.
AxmCrcSetMaskLevel (0, LOW, 0);
// 0축의 CRC 신호 사용 여부를 확인.
DWORD uLevel, uMethod;
AxmCrcGetMaskLevel (0, &uLevel, &uMethod);
AxmCrcGetMaskLevel
Purpose
지정 축의 CRC 신호 사용 여부 설정을 반환한다.
A Serviceable Product
BPHR / BPFR | BEHR / BEFR | PCI-Nx04 | PCIe-Nx04 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
O | O | O | O | ||||||||
PCI-Rxx04 | PCIe-Rxx04-RTEX | PCI-Rxx04-MLII | PCI-Rxx00-MLIII | ||||||||
A4N | A5N/A6N | PM | A4N | A5N/A6N | PM | SGDV | SGDV | SGD7 | PM | ||
O | O | ||||||||||
PCI-Rxx04-SIIIH | PCIe-Rxx04-SIIIH | PCIe-Rxx05-MLIII | PCIe-RxxIF-ECAT | ||||||||
MR-J4-B | PM | MR-J4-B | PM | SGDV | SGD7 | PM | Servo | PM | |||
O | O | O | O | O | |||||||
PCIe-Rxx05-ECAT | PCIe-Rxx05-ECAT-E | ||||||||||
Servo | PM | Servo | PM | ||||||||
O | O |
Format
C++
DWORD AxmCrcGetMaskLevel(long lAxisNo, DWORD *upLevel, DWORD *upMethod);
C#
uint AxmCrcGetMaskLevel(int lAxisNo, ref uint upLevel, ref uint upMethod);
Visual Baisc
Function AxmCrcGetMaskLevel(ByVal lAxisNo As Long, ByRef upLevel As Long, ByRef upMethod As Long) As Long
Delphi
function AxmCrcGetMaskLevel(lAxisNo : LongInt; upLevel : PDWord; upMethod : PDword): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | 채널(축) 번호(0 ~ (최대 축 수 - 1)) |
[out]upLevel | [00h]CRC 신호 사용 여부 : AXT_MOTION_LEVEL_MODE_DEF - [00h] B 접점(NORMAL CLOSE) Active Low Level CRC 신호 사용 - [01h] A 접점(NORMAL OPEN) Active High Level CRC 신호 사용 - [02h] CRC 신호 사용 안 함 - [03h] CRC 신호 현 상태 유지 |
[out]upMethod | [00h]잔여 펄스 제거 출력 신호 펄스 폭 - [00h] 10 uSec - [01h] 100 uSec - [02h] 500 uSec - [03h] 1 mSec - [04h] 10 mSec - [05h] 50 mSec - [06h] 100 mSec - [07h] Logic Level |
Return Values
[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음
Description
'AxmCrcSetMaskLevel’ 로 설정한 지정한 축의 CRC 신호 사용 여부 또는 신호 Active Level의 설정을 반환한다.
예제 코드
C++
// 0축에 CRC 신호 사용 여부를 설정.
AxmCrcSetMaskLevel (0, LOW, 0);
// 0축의 CRC 신호 사용 여부를 확인.
DWORD uLevel, uMethod;
AxmCrcGetMaskLevel (0, &uLevel, &uMethod);
AxmCrcSetOutput
Purpose
지정 축에 CRC 신호를 강제적으로 출력 발생시킨다.
A Serviceable Product
BPHR / BPFR | BEHR / BEFR | PCI-Nx04 | PCIe-Nx04 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
O | O | O | O | ||||||||
PCI-Rxx04 | PCIe-Rxx04-RTEX | PCI-Rxx04-MLII | PCI-Rxx00-MLIII | ||||||||
A4N | A5N/A6N | PM | A4N | A5N/A6N | PM | SGDV | SGDV | SGD7 | PM | ||
O | O | ||||||||||
PCI-Rxx04-SIIIH | PCIe-Rxx04-SIIIH | PCIe-Rxx05-MLIII | PCIe-RxxIF-ECAT | ||||||||
MR-J4-B | PM | MR-J4-B | PM | SGDV | SGD7 | PM | Servo | PM | |||
O | O | O | O | O | |||||||
PCIe-Rxx05-ECAT | PCIe-Rxx05-ECAT-E | ||||||||||
Servo | PM | Servo | PM | ||||||||
O | O |
Format
C++
DWORD AxmCrcSetOutput(long lAxisNo, DWORD uOnOff);
C#
uint AxmCrcSetOutput(int lAxisNo, uint uOnOff);
Visual Baisc
Function AxmCrcSetOutput(ByVal lAxisNo As Long, ByVal uOnOffAs Long) As Long
Delphi
function AxmCrcSetOutput(lAxisNo : LongInt; uOnOff : DWord): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | 채널(축) 번호(0 ~ (최대 축 수 - 1)) |
[in]uOnOff | CRC 신호를 Program으로 발생 여부: AXT_USE - [00h] CRC 신호 Off - [01h] CRC 신호 On |
Return Values
[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음
Description
현재 AxmCrcSetMaskLevel에서 설정된 방식으로 CRC 신호를 강제 출력한다.
예제 코드
C++
// 0축에 CRC 신호를 Program으로 발생시킨다.
AxmCrcSetOutput (0, ENABLE);
AxmCrcGetOutput
Purpose
지정 축에 CRC 신호를 강제적으로 출력하였는지 여부를 반환한다.
A Serviceable Product
BPHR / BPFR | BEHR / BEFR | PCI-Nx04 | PCIe-Nx04 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
O | O | O | O | ||||||||
PCI-Rxx04 | PCIe-Rxx04-RTEX | PCI-Rxx04-MLII | PCI-Rxx00-MLIII | ||||||||
A4N | A5N/A6N | PM | A4N | A5N/A6N | PM | SGDV | SGDV | SGD7 | PM | ||
O | O | ||||||||||
PCI-Rxx04-SIIIH | PCIe-Rxx04-SIIIH | PCIe-Rxx05-MLIII | PCIe-RxxIF-ECAT | ||||||||
MR-J4-B | PM | MR-J4-B | PM | SGDV | SGD7 | PM | Servo | PM | |||
O | O | O | O | O | |||||||
PCIe-Rxx05-ECAT | PCIe-Rxx05-ECAT-E | ||||||||||
Servo | PM | Servo | PM | ||||||||
O | O |
Format
C++
DWORD AxmCrcGetOutput(long lAxisNo, DWORD *upOnOff);
C#
uint AxmCrcGetOutput(int lAxisNo, ref uint upOnOff);
Visual Baisc
Function AxmCrcGetOutput(ByVal lAxisNo As Long, ByRef upOnOff As Long) As Long
Delphi
function AxmCrcGetOutput(lAxisNo : LongInt; upOnOff : PDWord): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | 채널(축) 번호(0 ~ (최대 축 수 - 1)) |
[out]upOnOff | CRC 신호를 Program으로 발생 여부: AXT_USE - [00h] CRC 신호 Off - [01h] CRC 신호 On |
Return Values
[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음
Description
‘AxmCrcSetOutput’ 로 설정한 지정 축에 CRC 신호를 강제적으로 출력하였는지 여부를 반환한다.
예제 코드
C++
// 0축에 CRC 신호를 Program으로 발생시킨다.
AxmCrcSetOutput (0, ENABLE);
// 0축에 CRC 신호가 Program으로 발생되었는지 여부를 확인.
DWORD uUse;
AxmCrcGetOutput (0, &uUse);