PLCNEXT#IEC61131-3 Function

久しぶりに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です。なので、内部変数は関数が実行完了したあと、リセットされるとわかります。

この特徴を理解するのは重要です。

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

シェアする

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

フォローする