2017년 7월 17일 월요일

[EtherCAT] SOEM을 활용하여 라즈베리파이를 EtherCAT 마스터로 만들기

라즈베리파이에 SOEM을 설치하여 EtherCAT 마스터로 동작하도록 할 것이다.
라즈베리파이는 B+ 모델을 사용했으며, OS로 2017년 03월 02일 버전 raspbian-jessie를 사용했다.

먼저 최신 버전의 SOEM을 다운로드 받는다.

# git clone https://github.com/OpenEtherCATsociety/SOEM

http://openethercatsociety.github.io/ 에서 받을 수 있는 1.3.1 버전에서는 make 기반으로 빌드가 가능했었는데, git에서 받은 버전은 cmake 기반으로 빌드를 한다.

사용하는 라즈베리파이에는 cmake가 설치되어있지 않으니 현재 최신 릴리즈 버전인 3.8.2 버전으로 설치했다. [참고]

# wget https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz
# tar -xvzf cmake-3.8.2.tar.gz
# cd cmake-3.8.2/
# ./bootstrap
# make
# make install

라즈베리파이가 구닥다리라 엄청 오래 걸렸다..

이제 README.md에 나와있는 방법대로 SOEM 빌드를 한다!

# cd SOEM
# mkdir build
# cd build
# cmake ..
# make

빌드하고 나면 몇 가지 예제 프로그램이 생성되는데 그 중 SOEM/build/test/linux/simple_test/ 경로에 있는 simple_test라는 프로그램을 실행할 것이다.

그 전에 하드웨어 세팅을 시작하자.
구닥다리 라즈베리파이 B+에는 wifi가 기본 내장되어있지 않아서 ssh를 쓰기 위해 wifi 동글을 사용했다. 따라서 네트워크 인터페이스가 wlan0, eth0 두 개가 되는데, wlan0은 ssh를 포함한 인터넷을, eth0은 EtherCAT 포트로 사용한다.

EtherCAT 슬레이브로 사용할 장치는 Beckhoff사의 EL9800 보드로 하였다.
EtherCAT을 통해 제어 가능한 각 8개의 On-board LED와 스위치가 있다.

<연결한 모습>

이제 예제 프로그램을 실행한다.

# cd test/linux/simple_test/
# ./simple_test eth0

실행시키면 다음 그림과 같이 PDO 값에 대해 모니터링해 준다.


O: 뒤에 첫 1바이트가 LED를 의미하고, I: 뒤의 첫 1바이트가 스위치를 의미한다.

그냥 실행만 시키면 재미없으니 LED에 불을 켜 보자!

SOEM/test/linux/simple_test/simple_test.c 파일을 열어서 PDO 교환을 수행하는 다음 코드를 보면

/* cyclic loop */
for(i = 1; i <= 10000; i++)
{
    ec_send_processdata();
    wkc = ec_receive_processdata(EC_TIMEOUTRET);

    if(wkc >= expectedWKC)
    {
        printf("Processdata cycle %4d, WKC %d , O:", i, wkc);

        for(j = 0 ; j < oloop; j++)
        {
            printf(" %2.2x", *(ec_slave[0].outputs + j));
        }

        printf(" I:");
        for(j = 0 ; j < iloop; j++)
        {
            printf(" %2.2x", *(ec_slave[0].inputs + j));
        }
        printf(" T:%"PRId64"\r",ec_DCtime);
        needlf = TRUE;
    }
    osal_usleep(5000);
}

ec_slave[0].outputs + offset이 출력(마스터 -> 슬레이브) PDO, 그러니까 RxPDO를 의미하고 ec_slave[0].inputs + offset이 TxPDO를 의미한다.

LED는 RxPDO의 첫 번째 바이트로 다음 변수를 통해 접근할 수 있다.
ec_slave[0].outputs + 0

정확한 내 장치의 SII에 저장된 PDO 목록을 보고싶다면 같이 빌드되는 예제 프로그램인 slaveinfo를 실행해보면 안다. 다음 명령어를 실행하면

# ./slaveinfo eth0 -map


슬레이브의 SII에 저장된 PDO 매핑 정보가 출력되어 나온다.

다시 LED를 제어하는 것으로 돌아와서!
위 코드의 for 블록문 첫 번째에 다음 코드를 넣었다.
물론 함수의 첫 부분에 int형 ledval(초기값 0x1)과 tick 변수(초기값 0x0)를 선언하였다.

/* cyclic loop */
for(i = 1; i <= 10000; i++)
{
    /* for LED output test */
    if(!(++tick % 50))
    {
        ledval <<= 1;
        if(ledval >= 0x100)
            ledval = 0x1;
        *(ec_slave[0].outputs) = ledval;
        tick = 0;
    }
    /* for LED output test */
    ec_send_processdata();
    wkc = ec_receive_processdata(EC_TIMEOUTRET);

이제 다시 build 디렉토리로 돌아와서 빌드한다.
다시 빌드할 때에는 make만 하면 된다.

# cd ../../../build/
# make

이제 실행시켜보면 된다.


댓글 10개:

  1. 몇가지 여쭙고 싶은게 있는데요...
    이게 리눅스 커널설치 안하고 라즈비안 자체만으로도 동작하나요??
    그리고 꼭 EL9800 보드가 아니어도 simple_test는 잘 동작하나요??

    답글삭제
    답글
    1. SOEM은 Windows 7에서도 동작하고 리눅스에서도 동작합니다. 리눅스 커널이 반드시 필요한건 아니죠. 그리고 라즈비안도 리눅스 커널을 포함하고 있는 운영체제입니다.
      simple_test는 아마 대부분의 EtherCAT slave에서도 정상적으로 동작 할 것입니다. 전 TI AM3359 ICE(http://www.ti.com/tool/TMDSICE3359)로도 동작이 되는 것을 확인했습니다.

      삭제
    2. 감사합니다. 많은 도움이 되었습니다!

      삭제
  2. 안녕하세요 블로그를 보면서 따라하기를 해보았습니다.
    우선 슬레이브는 xmc4800 relax_kit에 만들어 twincat 을 마스터로 삼아 slave 컨트롤 까지 확인을 하였습니다. (슬레이브 작동 이상무)
    그리고 마스터로 만든 라즈베리파이3+ 로 따라하여 별 무리 없이 진행을 하였습니다만.
    ./simple_test eht0 을 하였는데 No socket connection on eth0 이라는 메세지와 함께 PDO 가 출력되지 않습니다.
    혹시 의심가는 부분이 있으면 포인트라도 알려주시면 감사하겠습니다.즐거운 하루되세요.

    답글삭제
    답글
    1. 오래 되어서 잘 모르겠는데, ifconfig 커맨드를 통해 원하는 이더넷 포트 인터페이스 이름이 eth0이 맞는지 확인해보는 것이 어떨까 합니다.

      삭제
    2. 안녕하세요 지금에서야 확인을 했네요 ㅠ eh0 은 맞았거든요..

      삭제
    3. sudo 명령어로 실행하셔야 합니다. 아니면 sudo setcap cap_net_raw+ep /path/to/simple_test 명령어로 실행파일이 소켓에 접근할 수 있는 권한을 부여 후 실행해보세요.

      삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제
    답글
    1. 안녕하세요 한국어로된 자세한 설명에 너무 반가웠습니다 ..ㅠ 몇가지 여쭙고자 하는데..
      혹시 cyclic loop 에서 i가 무엇을 의미하는지 알수있을까요? 피드백 횟수인가요,bus cycle 횟수인가요??

      삭제
    2. 안녕하세요 제가 이제야 확인을 해서 답이 많이 늦었네요. i는 제어 주기의 횟수를 의미합니다. 즉 PDO를 교환한 횟수입니다. 피드백 횟수와 버스 사이클이 어떤 의미인지 정확히는 모르겠는데 제가 이해한 것이 맞다면 피드백 횟수와 더 가까운 것 같습니다.

      삭제