1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CodeSys#Function Blockを作る

Posted at

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?