XMC4800 Relax EtherCATキット ③EtherCATサンプルプログラムを動かす(スレーブー側事前準備)

# サンプルプログラムダウンロードとインポート
Infeneon社の[Download of Example Projects for DAVE™ Apps](https://www.infineon.com/cms/en/product/promopages/aim-mc/dave_downloads.html)からサンプルプログラム*ETHCAT_SSC_XMC48.zip*をダウンロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/d45cb2f6-9a0c-c9cc-89c5-e56cb138a45a.png)

次にDaveを起動してサンプルプログラムをインポートします。サンプルプログラムのzipを展開したフォルダ内にある *Getting Started - XMC4800_Relax_EtherCat_APP_Slave_SSC Example_V3.2.pdf*を参照しながら進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/8f18846d-9552-9c33-f642-6f8a7abe3c0f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/674052a1-2899-9a51-60fb-6973d0ee1054.png)
サンプルプログラムをzipのまま指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/34d23d62-7078-d766-aa37-742a79950041.png)
インポート完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/1dcec091-1329-d9e9-80fb-f29a4e20db91.png)

# EtherCAT SSC(Slave Stack Code)ツール入手

- SSCツールはEtherCATのスレーブスタックのソースコードサンプルを自動で生成してくれるツールです([参照](https://www.ethercat.org/jp/products/54FA3235E29643BC805BDD807DF199DE.htm))。前記のサンプルプログラムはこれを使用することを前提として作られているため入手が必要となります。

- ETG(EtherCAT Technology Group)の[メンバーページ](https://www.ethercat.org/login.aspx?ReturnUrl=%2fmemberarea%2fstack_code.aspx)にログインすることでダウンロード出来ます。※ETGメンバーには無料で加盟することができるそうですが、残念ながら法人しか加入できないみたいです。

# スタックコードとESIファイル生成
サンプルプログラムはEtherCATのSSC¥Srcフォルダは空になっていますので、SSCツールを利用してソースコードとESIファイル(マスタに読み込ませるためのスレーブ情報を記載したＸＭＬファイル)を生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/d262cc5b-49cc-a4b8-cb3e-f0476f0500fe.png)
サンプルプログラムのzipを展開したフォルダ内にある *Getting Started - XMC4800_Relax_EtherCat_APP_Slave_SSC Example_V3.2.pdf*を参照しながら進めます。
新規プロジェクトを作成し、Daveで開いているサンプルプログラムのSSCフォルダ下にあるコンフィグファイルをインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/2434d0bc-ddc6-8251-35ba-c31f9ebd3c81.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/f13a0b97-d3de-9d60-2ad5-1b010e1c334b.png)
次にSSCフォルダ下にあるにあるExcelファイルをインポートします。**※この時PCにExcelがインストールされていないとインポートエラーが発生します。OpenOfficeやLibreOfficeなどの互換フリーツールでもエラーが出てインポートできません。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/0ba969d8-8acf-8b4a-cef3-18e56e3a1d12.png)
ソースコードとESIファイルを生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/909c196b-ee0c-0dc8-a79c-10952a75d365.png)
成功すると、SSC\Srcフォルダ下にEtherCATスタックスレーブのソースコード(*.h,*.c)が生成され、SSCフォルダ下にESIファイルXMC_ESC.xmlが生成されています。Daveでリビルドしてエラーが出ないことを確認します。ESIファイルはマスター側でスレーブ情報を探せるようにするため*C:\TwinCAT\3.1\Config\Io\EtherCAT*にコピーして置きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/5f6bb2aa-3345-e4a6-1b1c-3e452d6afe1b.png)
coeappl.cの下記の個所をエディタで修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/15136e1c-ff58-3f6b-f22a-e9356d819bf3.png)

# ソースコードの修正とビルド
サンプルプログラム動作のために生成されたコードの下記の個所を修正します。

入力

```c++:XMC_ESC.c
/////////////////////////////////////////////////////////////////////////////////////////
/**
\param      pData  pointer to input process data

\brief      This function will copies the inputs from the local memory to the ESC memory
            to the hardware
*////////////////////////////////////////////////////////////////////////////////////////
void APPL_InputMapping(UINT16* pData)
{
//#if _WIN32
//   #pragma message ("Warning: Implement input (Slave -> Master) mapping")
//#else
//    #warning "Implement input (Slave -> Master) mapping"
//#endif
	memcpy(pData, &(((UINT16 *)&IN_GENERIC0x6000)[1]), SIZEOF(IN_GENERIC0x6000)-2);
}
```

出力

```c++:XMC_ESC.c
/////////////////////////////////////////////////////////////////////////////////////////
/**
\param      pData  pointer to output process data

\brief    This function will copies the outputs from the ESC memory to the local memory
            to the hardware
*////////////////////////////////////////////////////////////////////////////////////////
void APPL_OutputMapping(UINT16* pData)
{
//#if _WIN32
//   #pragma message ("Warning: Implement output (Master -> Slave) mapping")
//#else
//    #warning "Implement output (Master -> Slave) mapping"
//#endif
	memcpy(&(((UINT16 *)&OUT_GENERIC0x7000)[1]), pData, SIZEOF(OUT_GENERIC0x7000)-2);
}
```
ユーザアプリ呼び出し

```c++:XMC_ESC.c
/////////////////////////////////////////////////////////////////////////////////////////
/**
\brief    This function will called from the synchronisation ISR 
            or from the mainloop if no synchronisation is supported
*////////////////////////////////////////////////////////////////////////////////////////
void process_app(TOBJ7000 *OUT_GENERIC, TOBJ6000 *IN_GENERIC);
void APPL_Application(void)
{
//#if _WIN32
//   #pragma message ("Warning: Implement the slave application")
//#else
//    #warning "Implement the slave application"
//#endif
	process_app(&OUT_GENERIC0x7000, &IN_GENERIC0x6000);
}
```