Help us understand the problem. What is going on with this article?

CodeSys#Function Blockを作る

Version

image.png

Function Blockとは?

ここでまたCodeSysのOnline Helpを見てみましょう。

A function block is a POU that yields one or more values when executed.

Function Blockは実行すると多数の値を生むものです。

The values of the output variables and the internal variables remain unchanged after execution until the next execution. This means that the function block does not necessarily return the same output values for multiple calls with the same input variables.

Function Blockの出力変数・内部変数の値は実行してから次のCycleまでキープすることができます。つまり、Function Block複数回に呼び出しされても、たとえ入力変数が同じなものだとしても必ず同じな出力になるとは限らないです。

You can access only input and output variables of a function block from outside the function block instance, not the internal variables.

あなたがFunction Blockの変数をアクセスするには入力と出力だけになります。内部変数はアクセスしないように。

Access to a function block instance is restricted to the POU in which the instance is declared, unless you have declared the instance globally.

Function Blockのインスタンスは呼び出しされたPOUのの中だけになります。グローバルに宣言することも可能です。

呼び出しの方法

instance : function block;

MyFnction:FB1;

変数をアクセス方法

instance . variable

MyFunction.iInputs

Input・Outputの割り付け方

Inputなら:=
Outputなら=>

FB1_1(in:=myInput,Out=>myOut);

実装

Function Block作成

Application>Add Object>POU

image.png

Function Blockの名前決めて、“Function Block”を選んでOK。
Extends、Implementsなどは別で説明します。

image.png

画面は基本Program・Functionと一緒です。

image.png

プログラム

  • Input
    • iStart2Count:Trueの立ち上げでCounter+1する
    • iReset:Trueの時間が1s以上だとCounter=0する
    • iCountUpSetting:Counterの設定値
  • Output:
    • qCount: いま内部Counterの値
    • qCountIsReached: Counter値>CountUp設定のとき、True

変数は以下のように定義します。
image.png

NTW1:

R_TRIGは立ち上げを検知するFunction Blockです。
ここはStartのポタンを押したことを検知します。
image.png

NTW2:

TONはDelay On Timerですね。1秒以上ONになるとリセットします。
image.png

NTW3:

Countボタン押したらCounter+1します。
image.png

NTW4

Resetだったら0を入れます。
image.png

NTW5/6

現在のCount数とCount状態を出力するだけです。
image.png

呼び出し

Function Blockの説明はまだ覚えています?
image.png

Function Blockの出力変数・内部変数の値は実行してから次のCycleまでキープすることができます。

つまり、それら値のをキープするにはメモリ領域が必要です。
そのメモリ領域はインスタンスです。
まずインスタンスを作成し与えます。
mygif.gif

変数を定義しますね。

image.png

次はそれそれの変数をInput/Outputに割り付けます。

あなたがFunction Blockの変数をアクセスするには入力と出力だけになります。

方法1

直接その“Pin”に変数を割り付ける。
image.png

方法2

別のネットワークでそれそれのInput、Outputを .
のようにアクセスする。
image.png

内部変数はアクセスしないように。

たとえ自分が直接インスタンスの内部変数アクセスしようとしたらどうになる?
Siemens,Melsはそのようなアクセスやろうと思えばできますが、CodeSysはどうやらそれを自動変数入力のところ出てこないですね。(一応無理やり名前入れてコンパイルしてもエラーない)
image.png

画面作成

ADDしたら+1、Resetは0に戻す、現在Count表示されており、Count設定もあり、Counterが設定より大きならランプが光るって感じですね。

image.png

モーメンタリースイッチ

調べるには5分かかった…
ボタンを選んで、プロパティのところにInput configuration>Tap>Variableを変数割り付けます。

image.png

実装

こんな感じになりますね。
functionblock1.gif

ひとこと

Function BlockにInput・Outputを割付るときに、方法2があるって見せましたね。

  1. Function Blockの“Pin”のところに直接変数と紐つける。
  2. Function BlockのINPUT・OUTPUTを呼び出す前・後に紐付けます。

どっちのほうがよいでしょう?
私からはこうみます。
もしそのFunction BlockのTrigger条件などそんな複雑でなければ方法1のほうがプログラムが見やすいだと思います。全てどんなものが入るか、どんなものが出るか一気にみえるから。

image.png

逆にもしプログラムのTrigger条件はかなり複雑なら、方法2のほうが逆に見やすいと思いますし、プログラムの組み方がもっとやりやすくなります。
例えばこんのようなロジックをInputのリセットに取り込むになると、結構見にくいになりますよね。もう1つに変数追加してこのロジックの結果にふって、FunctionBlockの入力として入れてもよいです。あくまでも好みです。

image.png

余談ですが、
ラダーにこのようなロジックを組むときどう操作方法すれば作れるかちょっと迷ってた。
image.png

実際はこんな感じです作りますね。
functionblock2.gif

Function・Function Blockの違い

Pythonからみるとdef とClassの違い、だといっています。でもお客さんにラダーしかやったことない人が多くて、いままでずっと三菱のラダー(ベタ書きで、ラベルなしアドレス使用)のスタイルで歩いてきたので、そもそも保持しない?する?だけでも説明がかなり時間かかります。
ここで新しいFunctionとFunction Blockを作りました。

image.png

中身はまったく一緒で、INPUTがTrueだと+1する。

FB1_1
FUNCTION_BLOCK FB1_1
VAR_INPUT
    iCount:BOOL;
END_VAR
VAR_OUTPUT
    qCount:int;
END_VAR
VAR
    Count:INT;
END_VAR

IF iCount THEN
    Count:=Count+1;
END_IF

qCount:=Count;
FC1
FUNCTION FC1:INT 
VAR_INPUT
    iPlus:BOOL;
END_VAR


VAR
    count:INT;
END_VAR

IF iPlus THEN
    count:=count+1;
END_IF

FC1:=count;

結果はどうになるでしょう?
FCのほうが常に1で、FBの方が数字がどんどん上がっています。
それはまさにHelpの“FCが演算結果が次のサイクルまで持たない”と“FBが次のCycleでも演算結果が持つ”ってことです。

functionblock3.gif

以上ですーお疲れ様です。

soup01
free access to information is important. 仕事でFA AREAをやって趣味はPythonなど。 楽しいことたくさんやりたい。 知らない世界へ飛び込みたい。 あと、外国人です。
http://soup01.com/ja/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした