三菱PLC#構造化プロジェクトについて


最近三菱のgxworks 2使って色々悲鳴が上がっててね。今回はまずこのくそ仕様を一回洗い出しにしたいと思います。ラダー自体が、構造体をinput output inout宣言することできて、でもラダーの中に呼ばされたらコンパイルエラーになる様々なくそ仕様。。

- ラダー
    - まぁ、普通のラダーです。
- 構造体ラダー
    - ラダーみたいだけど、Siemensのような書き方になる。
- ST
    - 私が一番愛してるの言語です。
- SFC
    - 今回の記事は、対象外です。

#呼び出しルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ce051146-32df-751e-188d-6edf72dd0999.png)

#呼び出しの制限
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5ffdf73a-ff7f-6ba0-349d-f5c48b11937f.png)


##ラダー

##ラダーからラダー(1層まで)
例えばプログラム部品の中にMyLadderというプログラムがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/9b649397-7f4f-e93e-71a6-d6bdf5f0f90c.png)
FB_Ladder1の中身はこれしかないけど。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2592f88a-0532-b177-049f-3521c31568c8.png)

###ラダーからST
FB/FUNの中にMyST1があり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/b320f79f-fe16-43f0-2095-c62c10c4423c.png)
MyST1の中にはこれしかないけど。

```
myOUT:=myIN;
```

それもOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/9f7b758f-144b-e1f8-195c-1c1cd9c763e8.png)

###ラダーから配列あるのST
FB/FUNの中にMyST2があり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e604653f-cfaa-b94c-5f0a-b69c135078f6.png)

Interfaceが配列が入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c29e34bf-0563-d525-9986-73816da32918.png)

それはNG。WTF?構造体、配列などCALLできない？どういう思想なの？まぁ、NGです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ed3cfc7f-aef9-a7b4-5d33-c5644c7f61af.png)

###FBラダーの中にSTをCALL
今度はFB_Ladder1の中に、MyST1を呼び出してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/8b946d39-ca0f-2250-5b21-e9ceac21ba88.png)

呼び出すことできるが、コンパイルするとエラーが出る。Point4ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5f2dde0a-d21b-f1a9-0124-cd49a573b388.png)

###Function
Functionを呼び出してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2723077d-aa0d-8eb2-185e-09e9e5b46ea2.png)
そもそも呼び出すこと自体も許されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/845ebd57-1a5b-34b5-0919-5f109570feb0.png)

##構造化FBDをCALL

STなどのBlockがもうCallされたら、このエラー出ますが。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/abd4dab9-95e2-f0b7-2fcf-21f6891a3fbd.png)
ですが、新規の、新しく作った構造化FBDならCALLはできる。うん～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/cd125ee9-c81e-0b16-6677-5e79161e12d0.png)

##構造化FBD

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1c3c2c0a-6b07-bcab-7277-b50ad1e72707.png)

####ラダー呼び出し
うん、もちろんラダーのFucntion Blockが呼び出しますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1252e2b9-9dfe-06b8-7755-af0b61049eaa.png)

####ST Function Block呼び出し
OK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/9590f66e-7e6d-7ed2-9780-2526568c12c9.png)

####ST Function Block（Arrayあり）
ほ、InterfaceがArrayも含めてるのST Function Blockも呼び出しOKね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/82e56ac8-0cf4-b8c0-a3e3-c6e98106e238.png)

####Function
Functionも呼び出しできますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/50b9d85c-0b9c-b559-e756-63ee9806627e.png)

####Function、戻り値が配列
今回はちょっと意地悪して、戻り値を配列してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1bb23d25-fca9-6f97-c7aa-da01a91abbc0.png)
それでもいけますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/9a1603d5-7d67-4336-2d34-9c318ee51438.png)

####構造化FBDのFunction Block中に構造化FBDをCall
それもOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5bfebd69-fa34-caf3-f7e5-ee028cfa3513.png)

どうやら制限ないのは本当ですね。

##ST
最後、STも一回やってみます。
もちろん、全部OK。さすが！

```
(*Ladded Function Block*)
FB_Ladder1_1(in1:= M1 ,out1:= M2 );

(*ST Function Block*)
MyST1_1(myIN:= M2 ,myOUT:= M4 );

(*ST Function Block with Array Input Interface*)
MyST2_1(myINArray:= gBoolArray ,myOUT:= M2 );

(*Function *)
M3:=MyFunction1(M2 );
(*Function with return value of Bool Array *)
boolArray:=MyFunction2(M2);

(*Structed FB*)
FB_StructFB_1();
```

#最後に

個人の感覚ですが、Function Blockを呼び出すのはやっばりSTから呼び出すのは一番よいかと思います。
そしてロジックが構造化FBDで組んで、最後はラダーを使うってイメージかな。
お疲れ様ですー