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 를 통해 가속도 센서 값을 읽어오는 프로그램이 실행됩니다.