久しぶりにPLCNEXTの記事更新です。今回はFunctionについて説明します。FunctionはIEC61131-3で定義されたObjectで、Logicだけ抽出し、パラメータは外部から渡す、結果は戻り値に返すのC/C#/Pythonなどのプログラム言語と同じように動作します。
Functionを使用することはプログラムを標準化する第一Stepです。Global アドレス避け、同じLogicがBlock化し使うたびに呼び出せばよいという考え方で、従来のべた書きにないよい効率です。そしてLogicを変更するにはFunction内のProgramだけを編集すればOKです。
この記事では最初にはIEC61131-3の標準Functionを使用、次は自分だけのFunction作成のような流れです。よろしくおねがいします。
Please Support some devices for my blog
https://www.amazon.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share
Reference Link
http://soup01.com/ja/category/plcnext/
Standard Function
実は私達PLCNEXT EngineeringでプログラムするときもずっとIEC 61131-3やCPU専用の関数を使っています。COMPONENTS>IEC61131-3>Functions & Functions BlocksのFolderに文字操作ならCharacter String、ビットシフトならBit Shift…のように機能ごとに関数と関数がわけられています。
Example
では、まずIEC61131-3の標準関数を使ってみます。
TO_DINTは変数をDINTデータ・タイプに変更する関数。
SHLは左へのBitシフトの関数。
CONCATは2つの文字列を組み合わせて新しい文字列を作る関数。
Result
結果をみますと、SHLはいまの変数の値を3回シフトし16#08になりますね。
そしてCONCATは”hallo world!’の文字列が出力されています。
How to use help?
関数を使うときに必ず迷うのはそのパラメータはなに?なにを渡せばよいの?のですね。
先にSHL関数ではANY_BITというデータ・タイプが必要です。
Functionで右クリック>Helpをクリックします。
そうするとBrowserが自動立ち上げ、該当する項目が表示されます。
関数の種類、機能、パラメータなどの詳しい説明があります。
知りたいのはANY_BITのパラメータなので、Parameterのところで+ボタン押すと各パラメータの詳細が見えます。
でもそれだけじゃまだわかりませんね。左にSEARCH機能があります。
検索機能を使用しANY_BITを検索しましょう。
1つ目があたりですね。クリックします。
説明によりますと、そのANY_BITはByte、Word、DWORD、LWORD変数の特定Bit、WORD、DWORD、LWORDにアクセスできます。使用するのは%Xですね。
+Exampleをクリックすると例が見えます。
%X0、%X1はBit単位でアクセス、%B0、%B1はByte単位でアクセスするような操作です。詳しくはHelpをみてください。
Your Own function
IEC61131-3の標準Functionだけではなくあなただけの関数を作成することもできます。
Create new Function
COMPONENTS>Local>Function & Function Blocksを選択します。
次は右クリック>Add Functionします。
新しいFunctionを作成しました。
Rename
MUSTでもないが、いつもわかりやすい・目的明確なFunction Nameで命名しましょう。
右クリック>Renameします。
まぁ…テストなので自分も適当な名前をつけましたが。
Implement
自分の関数は作成しましたが、今度はCodeを実装します。
今回は2つのINT変数をINPUTパラメタとして入力し、関数の出力はその2つのINPUTの和になります。
Add Code
FunctionをクリックするとPOUを作成するのと同じく実装言語が選べます。STにします。
Signature
Signatureはいわゆる戻り値です。つまり関数の実行結果です。
ここでまずSignatureのTabをクリックします。
Return Typeを設定できます。
これはDrop-Listでアプリケーションに応じてReturn Typeを設定してください。
今回はINTにします。
Define Variables
Return値を定義したところで、今度は変数を定義します。
ここの変数を示すのはINPUTパラメタと内部変数です。
VariablesのTabを開きます。
最初にDefault In1という変数があります。
Create Group
変数を定義するんですが、数が多くなると混乱します。命名から変数がINPUTか?内部か?のやり方もありますが、ここでさらにPLCNEXT EngineeringツールのVariable Group機能を使います。
Create a new variable groupのボタンをクリックします。
そうするとNewGroup1が作成されました。
同じくわかりやすい名前にしましょう。
ここで自分がなれてるVAR_INPUTにします。
Defaultの変数とGroupも削除し、スッキリします。
Create Variables inside Group
Usageを定義します。LocalとInputが選べますが、Localは関数の内部変数でInputは関数に渡すInputパラメタのことを示しています。
変数のTypeから定義します。DefaultはすべでBoolのようです。
Drop-ListからINTを変更します。
二個目の変数も同じく定義します。
Inputで、TypeはINTです。
Code
変数定義が終われば、次はCode実装です。
CodeのTabを開きます。
難しいことは書いていません。
myFunction1はその関数名、そのものです。
つまりmyFunction1が呼び出しされるとInput1とInput2を足し算し計算結果をmyFunction1に戻ります。
Call in Main
最後はMainからmyFunction1を呼び出しします。
実装言語はSTです。
Variablesをクリックし変数定義します。
myFunction1を3回呼び出すので、myFunction1の戻り値、受け皿として同じの数の変数を定義します。
関数を呼び出すので、Code Tabを開きます。
このようにmyFunction1を呼び出しすればOKです。
What is this?
ちょっとまってください、これは実際どんな文法ですか?って聞きたくなりますね。
ここから説明します。
Return
Value1はMuFunction 戻り値の受け皿です。
Function call
MyFunctionを呼び出します。
Paras
そしてmyFunction1を呼び出すときに必要なパラメータ。いまは定数ですが、変数でも構いません。
Call in ESM
もちろん、ESMにTask割付けを忘れずに。
Result
このように、myFunction1が流用され、パラメータにより結果が違うだけで、中の動作はまったく一緒です。
Test2
次は少し実験してみましょう。Functionの内部変数は呼び出しされた後にも値が保持してるかどうかをCheckします。新しい関数を作成します。この関数はBoolのInputパラメータ一つだけ受け、そのパラメータがTrueである限りずっと内部変数を足す1し、戻り値に出力します。
bINCがその足す1かどうかのTriggerです。
もう1つのVariable Groupを作成し、内部変数を定義します。
UsageはLocalを設定すれば、内部変数になります。
SignatrueはINTにします。
関数内はbINCがTrueになると、ずっと足す1のプログラムだけです。
最後はMainプログラムで呼び出し、bINCがずっとTrueを渡しします。
Result
結果は以下の通りです.もし内部変数が保持してるのであれば、戻り値は1ではなくずっと増えるはずです。が、戻り値は1です。なので、内部変数は関数が実行完了したあと、リセットされるとわかります。
この特徴を理解するのは重要です。