Skip to content

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㏀의 저항을 사용한다.

CRC

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);