0
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#Method

Posted at

#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

はーい、お疲れ様です。

0
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
0
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?