PLCNEXT#IEC61131-3 Function Block

前回はFunctionを説明しました。今回はIEC61131-3に欠かせないFunction Blockの考え方・PLCNEXTの作成方法と特徴について説明します。よろしくおねがいします。

それでは、まずFunction Blockはなんなのか。私はFBが機構をModel化するツールだと思っていて、いわゆる設計図のような感じです。

例えばシリンダーにはなにがあるかだとしよう。

  • 出力のA/B Side
  • 入力のA/B Side
  • Timeout Alarm
  • OverShoot Alarm
  • A/B Sideの制御コマンドなどなど…

Function Blockでは複数のInput/Output/Inout Interfaceと内部メモリが提供されており、なおかつFunction Block内でさらに別のFunction BlockをCallすることが可能です。なのでシリンダーの例ではFunction Block内制御Logicを実装し、あとはPOU内シリンダー数に合わせてのInstanceを作成、呼び出せば終わります。従来のような巻物プログラムとさよならです。

つまりシリンダー設計図の<Function Block>を作成し、実物のシリンダー数に合わせてその<Function Block>のInstance(実物)を作るんです。

もちろんPLCNEXTもIEC-61131-3のOOP機能をSupportします。それはMethodです。BeckhoffとCodesysはすでに触ったことある人ならその単語を聞いたことあるでしょう。

今回の記事ではMethodのことも説明しますので、よろしくおねがいします。

Add Function Block

Components>Add Function Blockで新規Function Blockを追加します。

Rename Function

何回もいいますが、わかりやすい名前に変更します。

Create Basic Function Block

では最初に簡単なFunction Blockから作成しましょう。

自分のTutorialはST Mainなので、ST Code WorkSheetします。

Variables

最初にFunction Blockの変数を定義します。

VariablesのTabを開きます。そのあたりはFunctionの操作と変わりません。

変数Group作成はMustではないが、分けたほうが見やすいです。

人によりますが、私はVAR VAR_INPUTのように分けるのが好きです。

ではInput/Output/Local変数の定義をしました。

Code

Code Tabを開きます。

INPUTデバイスの立ち上げを検知し内部値を足すか引くかリセットするかを分岐します。

最後はその内部値をOutputとして出力します。

Call in Main

Function Blockを作るだけではまだ足りません。Main Programを開いてください。

MyFunctionBlockのInstanceを定義します。

最後はそのInstanceを呼び出せばOKです。

Result

このようにbAddが立ち上げなら足す1、bSub立ち上げなら引く1、bResetが立ち上げなら0に戻り、そして内部変数を出力の形です。

Access Local Variable

今度はFunction BlockのLocal変数にアクセスできるかを試してみます。

Does not existって言われましたね。このあたりはBeckhoffやCodesysと同じですね。

*Siemensと三菱はFunction Blockの内部変数(VAR)にアクセスできるので、ここでは違いますね。

Create Function Block With Method

次はMethodがあるFuncton Blockを作成してみます。同じく右クリックでAdd Function Blockします。

そしてRenameでわかりやすい名前に変えます。


Method?

PLCNext EngineeringではOOP ProgrammingがSupportできるのがMethodsが使用可能な理由です。Function BlocksでMethodを定義することにより、そのFunction Blocksなにをするべきかさらに明確になり、プログラム内の干渉もすくなります。

PLCNEXT EnginnerはPublicとPrivateの両方をSupportします。

Publicは英語のように、どこでも使えるイメージです。

Privateは内部のみ(最後に説明しますので)

例えば先のシリンダーの例だと、A/B Sideの操作がありますのでOnASide()とOnBSide()のMethodがありますね。そしてアラーム検知用のOverShoot()やOvertime()があります。

ESTOPの状態とつながるEnable() Methodがあります。

Function Blockが機能ごとにさらに細かく切り分けられ、各プログラムの干渉が減ります。

ADD Method

Function Blockを右クリック>Add Methodします。

そのようなMethodが追加されました。

Rename

Function Block自分だけではなくMethodも機能がわかるような名前を変えましょう。

ST Code WorkSheetで実装します。

Signature

Methodの作成はFunctionと似ています。

SignatureはReturn Valueのことで、PLCNEXTのFunctionとMethodは必ずReturn Valueがあります。

Access specifier

PublicとPrivateが選択できますが、まずPublicにします。

Publicというのは自分のFunction Block Scope以外の場所でもそのMethodを呼び出すことができます。

Return type

Return Typeは今回Boolでよいです。

Variables

次はFunction Blockの内部変数を作成します。

変数名はCurrentValueでUsageはLocalに設定します。

Code

次は関数のProgramを作成するために、Code Tapを開きます。

Return ValueはまずFalseにします。

そしてLocal変数CurrentValueを足す1でRetrun ValueをTrueに変えるだけの簡単プログラムです。

Add More Method

では残りのReset/Sub/GetCurrentValue Methodも追加します。

これでOKです。

Reset

Reset Methodは内部変数を0に戻すだけで、Return TypeはBoolのままでOKです。

そしてプログラムに直接CurrentValueを0書き込めばよいです。

もちろん0書き込まれた後にTrueをReturnします。

Sub

Reset Methodは内部変数を1引くだけで、Return TypeはBoolのままでOKです。

そしてプログラムに直接CurrentValueを引き1にします。

最後ににTrueをReturnします。

GetCurrentValue

そにMethodは内部変数CurrentValueを出力します。

なのでReturn TypeはBoolではなくINTします。

プログラムも簡単で内部変数CurrenValueを出力だけです。

Call in Main

最後はInstanceを定義し、プログラムを呼び出しましょう。

このようなプログラムです。もしbAddがTrueであればAdd Methodを呼び出し、最後はそのbAddをリセットします。


Result

実際でbAddなどをONして試してください。

Use the Return value

今回はReturn Valueを使用してみます。実際メーカからリリースされたLibraryには、Return ValueがMethodの実行状態を示すケースが多く、例えばTrueがReturnしたら実行OKとか、Siemensだとよく16#7000ならOK、16#8000からはエラーのような表現です。

下記のExampleではもしFB_WithMethod.Add()がFalseなら、エラー処理するプログラムをするのような分岐になっています(実際いまMethod内に常TrueがReturnしてるのでそのdoSomethingsの分岐に流れないが。)

Is it Really?

では、そのReturn Valueが本当に使えるかどうかを検証してみます。

Function BlockにSimErrorCodeというMethodを追加します。

Signature>Return TypeをINTに設定します。

MethodにはINPUTを定義できますので、bSimErrorを定義します。

プログラムはそのbSimErrrorがTrueになると出力値を16#8400に変わります。

では実際に試してみましょう。Line38から40まではSimErroCodeのMethodがTrueが渡されたのでReturn値が16#8400になり、SimError BitがTrueになります。

そしてLine41から43まではSimErroCodeのMethodがTrueが渡されたのでReturn値がDefaultの16#7000になりSimNormalがTrueになります。

ではLine38から40までのLineでSimErroCodeのMethodがFalse渡したらどうでしょう。

SimErrorがFalseのままになります。

このようにMethodの実行が成功かどうかを判断するプログラムを作成できます。それもMethodの強いところです。

Private Access?

最後にPrivate Accessの話をします。Private Callはつまり内部のみ使用するMethodです。最初にMethodがPublicとPrivate 2種類のAccess specifierが設定できると言いましたね。その内部のみっていうのは、Private Methodは Function block内部のみ使用可能ということです。

ST言語ではTHIS Keywordを使用します。

This.myprivateMethodのような構文です。

では実際にPrivate Methodを作成してみましょう。

Signatrue>Access specifierをPrivateにします。

Privateの機能を試すだけなので難しいことをする必要がありません。

まずMain、つまりFunction Blockの外部ではそのPrivate Methodを呼び出すことができません。

次はFunction Block本体の内部ならどうでしょう。

THISのKeywordを使えば呼び出せます。

もちろんFunction Block本体の内部使用も可能なので、Methodも呼び出すことできます。

はい、以上になります。

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする