Codesys#Pi4をProfinetDeviceとして繋がる

今回はCodeSysを使って、Pi4をProfinetのデバイスとして繋がります。

#GSDMLを抜き出す
ProfinetのDeviceとしてControllerの下にぶら下がるにはGSDMLのFileが必要になります。
まぁ、XMLみたいなものです。

Tools>Device Repositoryをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/60e3ecd3-0e79-a0f0-f2d7-1d5a611c5512.png)
Profinet IO>Profinet IO Device>CODESYS Profinet Deviceを選び、Exportのボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/8d66b59e-db52-0a83-cd45-2ddea8601517.png)
ZipのFileが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c4b7dfd9-5cbd-6ff7-d678-0bb69f150893.png)
解凍し、Zipの中にXMLが２つが入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ad4b450c-8c18-5574-0a1a-dc786d2a84a8.png)

#構成設定
今回使ってるのはSiemensのエンジニアツールですが、もしControllerがSiemens製PLCではなければまた別のツールで作業を行うことできます。

##GSD Install
Options>Manage general station description files(GSD)をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c808c3f4-1cd5-bd80-5ae3-f71519d97452.png)
先解凍したXMLのところ設定し、GSDMLxxxxをCheckBoxを入れ、Installを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/676506c5-9988-6412-f0fe-2a60c534b770.png)

##ネットワークに追加
次は右側のCatalogにOther Field devices>PROFINET IO>I/O>SS-Smart Softwarexxxx>CODESYS>CODESYS Profinetxxxを選んで左にひっばります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/805277c0-aa13-482b-0db7-a02d6e1795cc.png)
Deviceのところに右クリック、Assign to new IO Controllerを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/9275e9f5-f9f1-ddc6-04fe-a80cb69655fc.png)
そうすればControllerとつながるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ebacb12b-8c4b-5863-bdeb-85313bffa990.png)

##Device設定
Deviceが追加されましたが、まだ様々な設定合わせないとPi4とつながりません。

###交換メモリ領域設定
先のPN-Deviceをクリックし、Device viewに切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c7a8e1b8-0454-6bc2-f4e3-9009d944ec43.png)
###IPとデバイス名
ProfinetデバイスとしてControllerの下にぶら下がるにはIPアドレスとデバイス名が大事になります。ControllerがStop>Runになるとき、ControllerはすべてのProfinetデバイスに対して該当する名前に該当するIPアドレスを振り付けます。
なのでのちほどのPi4設定するとき、あ～なるほどのときがくると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/8e98cba0-ede7-d76a-8fe3-cb4beb8ea2c8.png)
###更新Cycle
Siemensのエンジニアツールは一応自動計算してくれますが、更新周期だけ頭の隅においておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/65999185-8aff-c083-db07-d88d90ec95c3.png)

#CodeSysプロジェクト設定
次はCodesys側を設定しますね。
##Profinetデバイス設定
Ethernet(Ethernet)に右クリック、Add Device..を。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e2889818-a86d-8bb7-80ac-0336be44e1f0.png)
Profinet IO>Profinet IO Device>CODESYS Profinet Deviceをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/cfb7fe0d-a8f0-4fc7-3155-e78fa89004d9.png)
Ethernetのところに“Device”が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ac7953b4-c2b1-57d5-ebe8-59c9623a17ab.png)
次はこのデバイスのメモリ交換エリアを設定します。
CODESYS_Profinet_Device>Add Device。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e14d411b-3ddb-dc48-28f6-b605b23e5185.png)
Input/Output>In/Out 64 Byteを選んで、Add Deviceで追加。
ここで注意するには先と設定したメモリエリアの大きさと同じする必要があります。
でないと繋がりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1960ce4e-a8db-9362-c45c-03758ac72a82.png)
それで64Byteエリア設定完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f8ec90bb-a142-120f-cd17-881f6dabe7d7.png)
##Device名設定
先も書きましたが、Controllerに設定されたDeviceの名前がありますね？その名前は2番のところです。実際のプロジェクトに合わせてくださいね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f2101e1f-32d1-af5f-63a7-e98898342ec9.png)
#Symbol設定
次はこのInOut_64_byteのSymbolを設定します。
そうするといちいちアドレスのこと気にしなくてもよいし、万が一メモリ変化あっても対応しやすくなります。M0,D0などの組み方もうやめましょうー
##GVL
In,Out各64Byteの配列を定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/3356a0b7-aad0-0e6f-405e-58f28cf8128e.png)
##割り付け
先GVLで定義したSymbolを割り付けます。
InOut_64_bytes>Profinet Device Module I/O Mapping>で…のボタンを押して定義変数と割付ることができます。
ここはちょっと名称がややこしいですが、ChannelがInput Dataと書いてますが、よくみるとAddressのところにQで書いてます…つまりこれはOutputエリアです。同じOutput Dataが書いてるところはIで書いてます。どうやら逆にっていうか、そのInput/OutputはController側見てるんですね。
まぁ、InputDataとOutput DataをそれぞれのTagに割り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f26439ac-8170-2e15-5146-a57b340a6f61.png)
#プログラム
なぜかわからないが、どうやらプログラム内でそのアドレス使わないとあればIOデータが更新してくれないみたいです。なにかのパラメータ設定間違ってるかな。
とりあえずいまは適当なプログラムを作ります。
そしてLoginしてハードウェア構成などをダウンロードお願いします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e6d3d72e-f627-6b36-a692-1d6fdb07a96f.png)
#PI4設定
Online Helpに書いてます。
https://help.codesys.com/webapp/_pnio_runtime_configuration_device;product=core_ProfinetIO_Configuration_Editor;version=3.5.16.0
##/etc/CODESYSControl_User.cfg
以下の例を追加。

```
[SysEthernet]
QDISC_BYPASS=1
Linux.ProtocolFilter=3

[SysSocket]
Adapter.0.Name="eth0"
Adapter.0.EnableSetIpAndMask=1
```

##/etc/dhcpcd.conf
```
interface eth0 static ip_address=0.0.0.0
```

##Vlanをインストール
```
sudo apt-get install vlan  # Install VLAN package
sudo modprobe 8021q        # Load 8021q kernel module
```

#立ち上げ
TIAを立ち上げ、？のマークをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/9658cabf-0db9-b6d3-e0f0-bc9a337c0cc8.png)
適切なInterfaceを選び、Start Searchします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/a6bdb465-d016-9cd4-731c-10b9f58b46da.png)
ここでどんなデバイスがつながっているか見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6458892f-ae13-e2ca-165f-8f4a5e3e79f3.png)
次はDeviceを右クリック、Assign device name。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/3dc1904b-23ee-1a61-f65c-16860c447216.png)
同じく、適切なInterfaceを選び、Update listを。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/22ca4215-f9a3-6587-582f-b91607655b04.png)
Pi4を選び、Assign name。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e933fcf0-7443-061e-917f-8184cbdf9f7e.png)
そうするとController側がPi4みえるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4d7de71a-1f45-0a9a-ec14-cef5e5d42ae1.png)

#ちなみに
CoyeSys側をLoginすると、もしProfinetDeviceが緑のぐるぐるがついてるのであればOkです。そしてStatusのところにOnline・IP ActiveもTRUEになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/7002c734-650d-a334-a42f-5b727a43d6d1.png)
そしてEthernetのTab開くとメッセージありますよ～と。これはPI4のIPが常にControllerに置き換えされたってメッセージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/dc55fe26-a0e7-31f2-9385-5d5c3589ca09.png)

#結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/fe56fd3c-1bf1-ba68-b23c-979e3507b8cc.png)

##Send
![setAllFromMaster.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4247608c-1559-db97-3cc1-201f9f14d45e.gif)

##Receive
![getFromMaster.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/0d45a21e-f1e7-fc09-2d37-0f4862f5b16e.gif)


お疲れ様です。ー