最近三菱のgxworks 2使って色々悲鳴が上がっててね。今回はまずこのくそ仕様を一回洗い出しにしたいと思います。ラダー自体が、構造体をinput output inout宣言することできて、でもラダーの中に呼ばされたらコンパイルエラーになる様々なくそ仕様。。
- ラダー
- まぁ、普通のラダーです。
- 構造体ラダー
- ラダーみたいだけど、Siemensのような書き方になる。
- ST
- 私が一番愛してるの言語です。
- SFC
- 今回の記事は、対象外です。
呼び出しルール

呼び出しの制限

ラダー
ラダーからラダー(1層まで)


例えばプログラム部品の中にMyLadderというプログラムがあります。
FB_Ladder1の中身はこれしかないけど。
ラダーからST

FB/FUNの中にMyST1があり。
MyST1の中にはこれしかないけど。
myOUT:=myIN;

それもOK。
ラダーから配列あるのST

FB/FUNの中にMyST2があり。

Interfaceが配列が入っています。

それはNG。WTF?構造体、配列などCALLできない?どういう思想なの?まぁ、NGです。
FBラダーの中にSTをCALL

今度はFB_Ladder1の中に、MyST1を呼び出してみます。

呼び出すことできるが、コンパイルするとエラーが出る。Point4ですね。
Function


Functionを呼び出してみます。
そもそも呼び出すこと自体も許されない。
構造化FBDをCALL


STなどのBlockがもうCallされたら、このエラー出ますが。。
ですが、新規の、新しく作った構造化FBDならCALLはできる。うん~
構造化FBD

ラダー呼び出し

うん、もちろんラダーのFucntion Blockが呼び出しますね。
ST Function Block呼び出し

OK。
ST Function Block(Arrayあり)

ほ、InterfaceがArrayも含めてるのST Function Blockも呼び出しOKね。
Function

Functionも呼び出しできますね。
Function、戻り値が配列


今回はちょっと意地悪して、戻り値を配列してみます。
それでもいけますね。
構造化FBDのFunction Block中に構造化FBDをCall

それもOK。
どうやら制限ないのは本当ですね。
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で組んで、最後はラダーを使うってイメージかな。
お疲れ様ですー