Codesys#Method

https://qiita.com/soup01/items/b88f8d29d849c98d57d9

Version

image.png

Methodとは?

今回はMehtodについて話ししたいと思います。ここでひとまずCodeSysのOnlineを見てみましょう。
https://help.codesys.com/webapp/_cds_obj_method;product=codesys;version=3.5.16.0

Methods are an extension of the IEC 61131-3 standard and a tool for object-oriented programming which is used for data encapsulation. A method contains a declaration and an implementation. However, unlike a function, a method is not an independent POU, and it is subordinated to a function block or program. A method can access all valid variables of the superordinate POU.

MethodsはIEC61131-1標準の拡張でOOPの中にでデータをカプセル化するのツールの1つです。Methodsは宣言・実装が含まられています。ただし、MethodはFunctionと違って、Methodは独立なPOUではなく、FunctionやFunction blockの一部です。
Methodは上位のPOUの変数全てアクセスすることができます。

作成

Methodの定義は名前・戻り値・実装の言語(ST,LAD…)ともう1つすこく大事なAccess Speciferが必要です。そのAccess Speciferにには以下4つのオプションがあります:

  • Public
  • Private
  • Protected
  • Internal

Public

まずFunction Blockのところ右クリックし、Add Object>Method。
image.png

Addcess speciferにPUBLICを選択し、OK。
CodeSysのOnline helpによりますと

PUBLIC or not specified: Access is not restricted.

つまり制限なし。
image.png

Function Blockの下Methodがぶら下がってるのは見えます。
image.png

実装

複雑なもの作っても仕方ないので、BOOLが入ったら反転して戻りします。
image.png

POUの中にFB3をCallして、直接myPublicMethod()をアクセスします。
image.png

画面

image.png

結果

ここっで注意したいのは、FB3の中身は空でなにも書いてない状態です。
method1.gif

MethodのScopeについて

Method内の変数は実行終わったらどうになる?Keepする?それどもなくなる?
ここで実験してみましょう。

Method追加

image.png

実装

呼びされたら+1にする。
もしMethod内の変数がKeepできれば、myVarの値は変換続ける。
もしMetohd内の変数がKeepできなければ、myVarの値がずっと1にする
image.png

image.png

結果

うん~どうやら変数のScopeはMethod内だけになりますね。
method2.gif

Private

Addcess speciferにPRIVATEを選択し、OK。
CodeSysのOnline helpによりますと、

PRIVATE: Access is restricted to the program, function block, or GVL.
The object is marked as (private) in the POU or device view. The declaration contains the keyword PRIVATE.

Private MethodはProgram、Function Block、GVLに制限されています。私からみるとFunction Block自分自身だけCallできると認識していいと思います。

image.png

実装

やってることがPublicの一緒にです。
image.png

問題が来ました。POUからそのPrivate Methodを呼び出しすると、Auto-FillinがそのPrivate Methodを選択できない。
つまりCallできないってことですかね…
image.png

と思ったら、意地悪してCallしてみます。
image.png

コンパイルするエラーが出ました。Private Methodアクセスできません、と。
ではどうすればよいですか?
image.png

ここでFunction Block、FB3に戻りましょう。THIS^ Keywordを使うとPrivate Methodもアクセスすることができます。
image.png

つまりこんな感じですね。
image.png

もう一度Callします。
image.png

結果

method3.gif

Protected

Addcess speciferにPROTECTEDを選択し、OK。
CodeSysのOnline helpによりますと、

PROTECTED: Access is restricted to the program, function block, or GVL with its derivations. The declaration contains the keyword PROTECTED.

Protected MethodはProgram、Function Block、GVLと”その派生されたもの”に制限されています。基本はPrivateと似ていますが、少し継承に絡んでいますのでまた後ほどで説明します。
image.png

Methodの中身は一緒にですー
image.png

POUの中にProtected methodをアクセスするとやっばりだめでしたね。
image.png

そういう場合も、Privateと同じようなやり方でアクセスすればOKです。

INTERNAL

Addcess speciferにINTERNALを選択し、OK。
CodeSysのOnline helpによりますと、

INTERNAL: Access to the method is restricted to the namespace (library).

少しライブラリにコンセプトに絡んでしまいますね。また後ほどで説明します。

実装

直接アクセスしてもコンパイルエラーないみたいですね。

image.png

THIS

いわゆるMethodが自分に属するFunction Blockの中にあるMethod・変数をアクセスするときに使うKeywordです。
先のPrivate metohd・Protected methodのみたように、THIS^を使ってMethodをアクセスしたこと、覚えています?

実装の例

文字だけだとちょっとわかりつらいので簡単プログラムを作ってみましょう。

  • FB3の中に_intがあり
  • myPublicMethod呼びされたら、2になります。
  • myPrivateMethod呼びされたら、4になります。
  • myProtectedMethod呼びされたら、3になります。
  • myInternalMethod呼びされたら、1になります。

このような感じですね~
image.png

FB3のところに_intの定義も忘れずに。
image.png

最後MainPOUでCallのタイミング修正。
image.png

結果

method5.gif

はーい、お疲れ様です。

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

シェアする

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

フォローする