Arduino OptaとArduino PLC IDEでMODBUS/TCP通信をやってみよう

# あらすじ

Arduino Optaを買ったのだがUSERボタンでLEDやリレーをチカチカするだけではつまらんので通信でリモートI/Oが使えるか試してみました。

Arduino Optaは入力8点(デジタルorアナログ)出力4点の貧弱な構成なので拡張しないとだめですね。
逆にこのI/O点数で面白いものできればそれはそれですごいと思う。

現状リモートI/Oとして使えるネットワークはMODBUS/RTUかMODBUS/TCPになります。
ライセンス料いらないですからね。

ということでAliExpressでMODBUS/TCPのI/Oモジュールを買ってきました。
AMSAMOTIONのETH-MODBUS-IO8R-A 入力8点,出力8点,アナログ入力6点,アナログ出力1点がついて購入価格8200円です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/a0f16d5c-f57c-c049-af59-cdf2c1634272.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/a9689088-ada0-ccd2-ee23-936f068d344e.png)

https://aliexpress.com/item/1005001763581219.html

https://www.amsamotion.store/2022/03/eth-modbus-io8r-a.html

ちなみにArduino PLC IDEの使い方の説明はここではしません。（めんどくさいから）
こんなもの買うような変わり者はチュートリアル見てなんとなくいじれると思うので。

## 1.まずはチュートリアルを読む
チュートリアルにMODBUS設定方法があるからこの通りにすればできるやんけと思ったのですがそうではなかった…
そうこのチュートリアルは完全ではないのです。使えるまで8時間かかりました。
この記事はチュートリアルを補完する内容となっています。

https://docs.arduino.cc/software/plc-ide/tutorials/modbus-setup


## 2.Generic Modbus deviceを追加する
Modbus TCP Masterにチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/1dd7162a-a4e4-2132-b103-8726c5d0f6df.png)

Generic Modbus deviceを追加します。
ETH-MODBUS-IO8R-AのデフォルトIPアドレスは192.168.1.12なのでこれを使用します。
Parametrizationは何も設定入れてません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/2865a636-80b2-bcd6-0004-092e506b2172.png)


## 3.Modbus Devices Functionsを追加する。

Modbus Devices Functionsを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/c52d4de1-681d-2952-ad77-10bd69af67b8.png)

MODBUSで通信するにはFunction Codeを使います。
Function Codeのところにラベル定義を追加すると定周期で勝手に通信してくれます。
定義したラベルをラダー上でON/OFFすればよいので簡単ですね。

Function Codeについては下記のModbusプロトコル概説書（日本語）が勉強になります。

https://www.m-system.co.jp/mssjapanese/kaisetsu/nmmodbus.pdf

あとは各項目で+Addを押してLabel名をつけるだけですね。

### FC 02:デジタル入力8点,開始アドレス1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/4ec9b8fb-644e-5dd9-34b8-87dff416bb7b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/5a1a816e-75d4-8b88-0b67-91ba46040fbb.png)


### FC 04:アナログ入力6点,開始アドレス1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/9e36051d-cc17-d940-59d4-44ed19014444.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/734ac4c1-4070-1b17-13c3-ab205abd41eb.png)

### FC 15:デジタル出力8点,開始アドレス1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/d12b6beb-8dad-d6bc-08e3-e0a6c6995765.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/c8fa0602-bac3-853c-0165-c6b854987164.png)


### FC 16:アナログ出力1点,開始アドレス7
この項目だけ7から開始なのはETH-MODBUS-IO8R-Aの仕様です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/6987227d-9d8f-0612-19c0-e392a1716329.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/68bb8635-e7c3-ed74-d601-a321c101353f.png)



## 4.OptaのIP設定

OptaのIP設定があります。さてどこにあるのでしょうか…
一番下のSketchを押すとArduinoのスケッチが出てきます。
ラダーで書けないものはこれを使えという配慮なんでしょう。

IPの欄は初期ではコメント化されてるのでここで入力します。こんなんわかるかよ

Optaはここでは192.168.1.1とします。MODBUS/TCPと同一セグメントになるように。
※IPAddress gateway(192, 168, 1, 1);のように最後を0以外にした方がよいかもしれません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/0ada1dbf-8102-ec6d-9d4f-eecbb0e12e7d.png)

## 5.ラダーを書く

図のようなラダーを書きます。さっきラベル定義したやつはModbus_Varsに出てきます。
sysButtonInputs[0]はUSERボタンを意味します。
デフォルトで用意されてるラベルです
USERボタンを押すとMODBUSのリレーがONになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/34f6b03f-75b5-6264-052f-b002ed46a446.png)

## 6.コンパイルして転送するが動かない

これで動くはずですがなんと…動きません＞＜　なぜでしょうか。

これはETH-MODBUS-IO8R-Aの仕様でUnit identification(局番)は0x01～0xFEである必要があります。
Optaはデフォルトで0xFFになります。動かないからOptaとPCをつないでModRSsim2で伝文のログを見てこれに気づきました。

これを変更する方法ですが設定画面が隠れてるのでまずModbus TCP MasterをOFFにします。（赤枠のチェックを外す）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/8aa8f0b6-f16b-e9ac-6164-1193e61d23bf.png)

するとGeneric Modbus deviceの設定項目が変化します。ここで局番設定が出てきます。
設定のデフォルト値は255=0xFFです。
これを1に変更して、今度はModbus TCP MasterをONにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/1444304b-b33f-d175-1ea9-2dcb3baf6e6b.png)

ちなみに通信ステータスはsysMbTcpMState,sysMbTcpSlaveStateでモニタできます。
あと通信関係の設定をいじると再起動しないとなんかおかしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/f8e6636b-a12f-60fc-2456-32f82f7e650e.png)


## 7.モドチカ（モドバスでチカチカするの意味）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">動くようになったけどなんで動くようになったかわからない件 <a href="https://t.co/RaQV10iAwZ">pic.twitter.com/RaQV10iAwZ</a></p>&mdash; よしのぶ (@fa_yoshinobu) <a href="https://twitter.com/fa_yoshinobu/status/1639385952681607168?ref_src=twsrc%5Etfw">March 24, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ボタンを押すとリレーがON/OFFします。
これで念願のモドチカが完成しました。

https://github.com/fa-yoshinobu/fa-yoshinobu.github.io/tree/main/Qiita%20Sample/20230412

# まとめ

Arduino PLC IDEの使い方がわからなすぎてArduinoの公式フォーラム漁りをしていたら、Axel softwareのLogicLabがベースであることがわかりました。
たしかにRuntimeにSTM32もあります、このIDEツールのソースが非公開なのもなるほどね。

Arduino Optaの登場で今までの化石のようなPLCが無くなる、ゲームチェンジャーやみたいなのをたまに見るけどまだ先は長そうです。
三菱やキーエンスのほうが使い勝手良いので。
あと不安定すぎる…
結局はSTM32にLogicLabでコンパイルしたプログラムをのせて動くだけなので、RUN中書き込みのようなこともできない。
プログラムの吸出しもできない。RUNしてるのかSTOPしてるかもわからない。エラーコードもわからない。
CODESYSくらいまで使い勝手よくならないと厳しいのではないのでしょうか。

この商品が売れるかはAxel softwareの頑張りに左右されそうな気がします。

https://www.axelsoftware.it/en/logiclab/

https://www.axelsoftware.it/en/runtime-components/

# その他
無反応でどうにもならないときは　RESET 2回押しでBootloaderモードになります

https://forum.arduino.cc/t/bricked-serial-port-hard-reset-solved-double-tap-reset/1054945