MELSEC-Q GX Works2のコンパイラの動作を調べる(その1)

みなさんMELSEC使ってますか？
MELSEC iQ-Rという新しいPLCがあるのに諸般の事情によりMELSEC-Qばかり使っています。
ということで個人的に調べたマニアックな使い方でも書いて行こうかなと思います。
誰かの役に立つかは謎です。
この記事はMELSEC-Qの場合の仕様でありMELSEC iQ-Rの場合はまた別の挙動になると思います。

# 構造化プロジェクト使ってますか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/7ba18b41-267c-116d-445f-bd7a33d006fe.png)
構造化プロジェクトってやつを使うとラダー以外の言語(ST,FB,FBD)やラベルが使えます。
なんだかカッコイイですね。うまく使うと工数削減やプログラムの標準化が出来て完成度の高いプログラムを作れます。
しかこれがどのように実行されているかはみなさん知ってるでしょうか…

# STで書いてみよう
```plaintext
(*Sample1*)
CASE D0 OF
	0:D1:=K0;
	1:D1:=K1;
	2:D1:=K2;
	3:D1:=K3;
END_CASE;	

(*Sample2*)
D2:=FUN1(K1,K2);
```

```plaintext
(*FUN1*)
FUN1:=Input1+Input2;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/412523f2-e49a-8a02-4429-cef76ac58c60.png)

上のようなプログラムを書いてみます。
Sample1はD0の内容によってD1に0～3の値を代入するプログラムです
Sample2はFunctionを使って二つの値を足して出力します。
ラダーで書いたら簡単に書ける内容ですが、STで書いてみました。
さてコンパイルするとどのように出力されるかです。

# コンパイルされたプログラムを見てみよう
GX Works2では色々言語が使えますが最終的には昔ながらのラダーに変換されてPLCでは動いています。
ということでどのように変換されたかを見てみましょう。
### その1
[表示]→[コンパイル結果表示]
なるほどわからん…　ということで別のやり方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/c84ba8a1-9d6b-3eff-6aac-941af5d27fbd.png)

### その2
ICメモリーカード書込でパソコンのどこかのフォルダに内容を出力します。
ICメモリーカードはQのUDVシリーズだとSDカードに該当します。
SDカードからBOOT運転ができますがこの機能を使うとPCから直接SDカードにPLCプログラムを書けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/38d179cb-06ad-a146-2d52-a35cc15a164a.png)
このようにPCの任意のフォルダにプログラムを出力できます。
ここまで出来たらとりあえずGX Works2を閉じましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/33f1d047-3baf-e03b-0fcc-9495deb8afd8.png)

次にGX Works2を開き新規作成します。CPUタイプは同じにしますが、プロジェクト種別はシンプルプロジェクトにします。（ここがポイント）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/bd769d1d-a8f1-3c6a-9d50-a85b4ad9bb8a.png)

ICメモリーカード読出で先ほどのフォルダを指定します。さあどうなるかな＾＾
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/25de930c-20b5-4b88-4f82-aad7df27061f.png)

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/563e7734-1640-3542-016d-ba6e75f93ed1.png)
という目まいがしそうなプログラムが出てきました。
プログラムも長いしポインタも使ってる。おそろしやおそろしや。

# プログラムメモリは無限ではない
Q03UDVCPUの場合ですが定価は12万円です。
ではこいつのプログラムメモリの容量ですが120KByteです
プログラムが120KByteしか書けないのに定価12万円。おそろしやおそろしや。

[ユニバーサルモデル高速タイプQCPU Q03UDVCPU](https://www.mitsubishielectric.co.jp/fa/products/faspec/point.do?kisyu=plcq&formNm=700057634)

では最新のMELSEC iQ-Rはどうだろう。
R04CPUはプログラムメモリ容量160KByteで定価は12万円です。これも容量のわりに値段が高い。
[シーケンサCPUユニット R04CPU](https://www.mitsubishielectric.co.jp/fa/products/faspec/point.do?kisyu=/plcr&formNm=750057785)


PLCとマイコンを比較するのはおかしいですが例えばSTM32F446REを見てみましょう
Flash:512KByteで約2000円…　
[STM32 Nucleo Board STM32F446RE](https://akizukidenshi.com/catalog/g/gM-10176/)


いかに三菱のPLCのプログラムメモリが少ないかがわかるでしょう。
令和なのになんでこんなに少ないメモリで頑張らないと行けないんだ、世の中は富豪的プログラミングであふれているというのに＞＜
ということで構造化プロジェクトを使う場合は作り方によってはプログラムの容量やポインタを思ったより使用するので気をつけましょう。（どうやって🤔 ）

# まとめ
ST言語が悪いというわけではないですが、STで組まれたプログラムはコンパイルでテンプレート化されたラダーに置き換わるような挙動をしています。
これはそもそもMELSEC-Qはラダーしか実行できないのにGX Works2で色々言語を使えるように頑張った苦肉の策のような気がします。

MELSEC-Qばかり使ってるのでMELSEC iQ-Rや他社のPLCってST言語使いやすいんですかね。
このへんがよくわからない。TwinCATやPLCnext使ってみたいですね。