Skip to content

튜토리얼 2: 가속도 센서 사용 예제

1. EtherCAT 슬레이브

본 튜토리얼에서는 Beckhoff EL3004 를 슬레이브 장치로 하여 Dytran Instruments, Inc.의 가속도 센서 측정 값을 읽어오는 EtherCAT 시스템 인터페이스를 구축하는 예제를 소개합니다. 튜토리얼에서 시스템 인터페이스를 구성할 EtherCAT 슬레이브와 센서에 대한 정보는 아래 표와 같습니다.

종류 설명 수량
Beckhoff EL3004 아날로그 입력 터미널 1
Beckhoff EL9505 파워 서플라이 터미널 1
Beckhoff EK1100 EtherCAT 커플러 1
Dytran instruments Inc. 4114B1 AC 전류원 1
Dytran instruments Inc. 3093D7 가속도 센서 1
파워 서플라이 - 1

EtherCAT 슬레이브 시스템 구성 요소

2. EtherCAT 마스터와 슬레이브 연결

본 튜토리얼의 EtherCAT 시스템 인터페이스에서 Beckhoff EL3004 로 가속도 센서 값을 읽어오기 위한 EtherCAT 마스터와 슬레이브 (BeckHoff) 및 가속도 센서를 연결하는 방법은 아래 그림과 같습니다.


Example of an EtherCAT Topology

3. EtherCAT 슬레이브 스캔 및 EcatTool 실행

이에 대한 내용은 EtherCAT CORE 예제 에 설명되어 있으므로, CORE 예제의 3. EtherCAT 슬레이브 스캔 부분과 4. EtherCAT Tool 실행 부분을 참고하십시오.

4. PDO 항목 설정 및 도메인 구성

PDO 설정에 대한 자세한 내용은 CORE 예제의 6. PDO 항목 설정 및 도메인 구성 에서도 참고하실 수 있습니다. 따라서 본 튜토리얼에서는 가속도 센서에 대한 부분만 설명합니다.

가속도 센서 PDO 매핑

CORE 예제와는 달리 이번에는 한 장치에 구성된 서로 다른 TxPDO 를 4개 선택하여 각 PDO 에 value 를 매핑합니다. 이때, 아래 그림처럼, 같은 value 라는 기본 설정 이름으로 매핑하는 것이 아니라, 각 TxPDO 로부터 받아 오는 값을 구분하기 위해 value1, value2, value3, value4 로 이름을 수정하여 매핑하도록 합니다.


잘못된 TxPDO 매핑 (동일 value)


올바른 TxPDO 매핑 (각각 다른 value)

위의 그림과 같이 Beckhoff EL3004 에 구성된 TxPDO 중에서 서로 다른 4 개를 동시 선택 (Enable 체크) 합니다. 그 다음, 4개의 Input 을 동시에 받아오기 위해 4 개의 TxPDO (0x1a01, 0x1a03, 0x1a05, 0x1a07) 를 Enable 하고, 각각의 TxPDO 에서 순서대로 0x6000: Value 1, 0x6010: Value 2, 0x6020: Value 3, 0x6030: Value 4 로 할당합니다.

이렇게 각 TxPDO 마다 Value 를 매핑하는 이유는 Beckhoff EL3004 의 Object Dictionary (OD) 의 구성 때문입니다. 아래 그림처럼, EL3004 의 OD 를 확인해보면 Input 각각에 대해 서로 다른 TxPDO 를 할당해주고 있는 것을 알 수 있습니다.


EL3004 Object Dictionary 구성

5. 이클립스 환경의 EtherCAT 프로젝트 생성

환경 설정에 대한 자세한 내용은 CORE 예제의 7. 이클립스 환경의 EtherCAT 프로젝트 생성 에서 참고하실 수 있습니다. 다만, 가속도 센서의 샘플링 주기가 100 Hz 이므로 프로젝트 생성 시 Control Period 를 10000000 ns 으로 설정해주어야 합니다.

6. EtherCAT 프로젝트 수정 및 컴파일

EtherCAT 프로젝트를 이클립스에 불러오고 컴파일 하는 방법은 CORE 예제의 8. EtherCAT 프로젝트 컴파일 에서 참고하실 수 있으며 이번 튜토리얼에서는 자동 생성 된 프로젝트에서 추가 수정이 필요한 부분에 대해서만 설명합니다.

 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
void print_run(void *arg)
{
    RTIME now, previous=0;
    int i;
    unsigned long itime=0, step;
    long stick=0;
    int count=0;
    unsigned int NumSlaves=0, masterState=0, slaveState=0;

    rt_printf("\e[31;1m \nPlease WAIT at least %i (s) until the system getting ready...\e[0m\n", WAKEUP_TIME);

    /* Arguments: &task (NULL=self),
     *            start time,
     *            period (here: 100ms = 0.1s)
     */
    rt_task_set_periodic(NULL, TM_NOW, 1e8);

    while (1)
    {
        if (++count==10)
        {
            ++stick;
            count=0;
        }
        if (system_ready)
        {
            now = rt_timer_read();
            step=(unsigned long)(now - previous) / 1000000;
            itime+=step;
            previous=now;
            rt_printf("Time=%d.%d s, ", itime/1000, itime % 1000);
            rt_printf("dt= %li, worst= %li\n", ethercat_time, worst_time);

            if (_systemInterface_EtherCAT_Beckhoff_automation_gmbh_EK1100_EtherCAT_Koppler__0_5A_E_Bus_.getMasterStatus(NumSlaves, masterState))
                rt_printf("Master: Online - State %i - %i slave(s)\n", masterState, NumSlaves);
            else
                rt_printf("Master: Offline\n");

            if (_systemInterface_EtherCAT_Beckhoff_automation_gmbh_EK1100_EtherCAT_Koppler__0_5A_E_Bus_.getRxDomainStatus())
                rt_printf("RxDomain: Online\n");
            else
                rt_printf("RxDomain: Offline\n");

            if (_systemInterface_EtherCAT_Beckhoff_automation_gmbh_EK1100_EtherCAT_Koppler__0_5A_E_Bus_.getTxDomainStatus())
                rt_printf("TxDomain: Online\n");
            else
                rt_printf("TxDomain: Offline\n");

            for(i=0; i<NUM_AXIS; ++i){
                if (_systemInterface_EtherCAT_Beckhoff_automation_gmbh_EK1100_EtherCAT_Koppler__0_5A_E_Bus_.getAxisEcatStatus(i, slaveState))
                    rt_printf("\e[32;1mSlave: Online %i,  \e[0m\n", slaveState);
                else
                    rt_printf("\e[32;1mSlave: Offline,  \e[0m\n");

                rt_printf("\e[32;1m\t StatusWord: 0x%x,  \e[0m\n",      StatusWord[i]);
                rt_printf("\e[32;1m\t ModeOfOpDisp: 0x%x,  \e[0m\n",    ModeOfOperationDisplay[i]);
                rt_printf("\e[32;1m\t Sens X: %f,  \e[0m\n",        Value1[i]*9.8/97.90);
                rt_printf("\e[32;1m\t Sens Y: %f,  \e[0m\n",        Value2[i]*9.8/98.35);
                rt_printf("\e[32;1m\t Sens Z: %f,  \e[0m\n",        Value3[i]*9.8/98.02);
            }
            rt_printf("\n");
        }
        else
        {
            if (count==0){
                rt_printf("%i", stick);
                for(i=0; i<stick; ++i)
                    rt_printf(".");
                rt_printf("\n");
            }
        }

        rt_task_wait_period(NULL); //wait for next cycle
    }
}

자동 생성 된 코드 중에서 수정해야 할 부분은 위의 print_run 함수 부분이며, print_run 함수 내부 중 다른 부분은 모두 그대로 두고, 장치의 상태를 출력하는 부분만 아래와 같이 수정합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
for(i=0; i<NUM_AXIS; ++i){
                if (_systemInterface_EtherCAT_Beckhoff_automation_gmbh_EK1100_EtherCAT_Koppler__0_5A_E_Bus_.getAxisEcatStatus(i, slaveState))
                    rt_printf("\e[32;1mSlave: Online %i,  \e[0m\n", slaveState);
                else
                    rt_printf("\e[32;1mSlave: Offline,  \e[0m\n");

                rt_printf("\e[32;1m\t StatusWord: 0x%x,  \e[0m\n",      StatusWord[i]);
                rt_printf("\e[32;1m\t ModeOfOpDisp: 0x%x,  \e[0m\n",    ModeOfOperationDisplay[i]);
                rt_printf("\e[32;1m\t Sens X: %f,  \e[0m\n",        Value1[i]*9.8/97.90);
                rt_printf("\e[32;1m\t Sens Y: %f,  \e[0m\n",        Value2[i]*9.8/98.35);
                rt_printf("\e[32;1m\t Sens Z: %f,  \e[0m\n",        Value3[i]*9.8/98.02);
            }
            rt_printf("\n");

7. EtherCAT 어플리케이션 실행

EtherCAT 어플리케이션을 실행하기 위해 본 튜토리얼에서는 WinSCP 프로그램을 통해 파일을 STEP 에 전송하여 진행합니다. WinSCP 외에도 다양한 원격 접속 소프트웨어가 있으므로 선호하시는 프로그램을 사용하시면 됩니다.


WinSCP STEP 접속 및 경로 설정

WinSCP 를 실행하면, 아래 그림과 같은 창이 나타나며, 원격 접속하고자 하는 STEP 의 IP 와 아이디 및 비밀번호를 입력하여 접속합니다. 접속이 완료되면 STEP 에서 실행 파일을 저장할 경로를 설정해주도록 하며, 경로 설정 후 아래 그림 실행 파일을 해당 경로로 복사합니다.


WinSCP 통한 실행 파일 복사

STEP 에 파일 다운로드가 완료되면 PuTTY 를 실행하여 해당 STEP 에 접속합니다. 그리고 "cd" 명령어를 통해 파일을 다운로드한 경로로 이동하여 아래 명렁어와 같이 해당 파일 확인 후 권한을 부여합니다.

1
2
$ ls
$ chmod 777 rtsercan_test

마지막으로 PuTTY 에서 어플리케이션 실행 파일을 실행하면 EtherCAT 프로젝트 파일의 코드에 따라 Beckhoff 를 통해 가속도 센서 값을 읽어오는 프로그램이 실행됩니다.