#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。
Addcess speciferにPUBLICを選択し、OK。
CodeSysのOnline helpによりますと
PUBLIC or not specified: Access is not restricted.
Function Blockの下Methodがぶら下がってるのは見えます。
###実装
複雑なもの作っても仕方ないので、BOOLが入ったら反転して戻りします。
POUの中にFB3をCallして、直接myPublicMethod()をアクセスします。
###画面
###結果
ここっで注意したいのは、FB3の中身は空でなにも書いてない状態です。
##MethodのScopeについて
Method内の変数は実行終わったらどうになる?Keepする?それどもなくなる?
ここで実験してみましょう。
###実装
呼びされたら+1にする。
もしMethod内の変数がKeepできれば、myVarの値は変換続ける。
もしMetohd内の変数がKeepできなければ、myVarの値がずっと1にする
###結果
うん~どうやら変数のScopeはMethod内だけになりますね。
##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できると認識していいと思います。
問題が来ました。POUからそのPrivate Methodを呼び出しすると、Auto-FillinがそのPrivate Methodを選択できない。
つまりCallできないってことですかね…
コンパイルするエラーが出ました。Private Methodアクセスできません、と。
ではどうすればよいですか?
ここでFunction Block、FB3に戻りましょう。THIS^ Keywordを使うとPrivate Methodもアクセスすることができます。
##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と似ていますが、少し継承に絡んでいますのでまた後ほどで説明します。
POUの中にProtected methodをアクセスするとやっばりだめでしたね。
そういう場合も、Privateと同じようなやり方でアクセスすればOKです。
##INTERNAL
Addcess speciferにINTERNALを選択し、OK。
CodeSysのOnline helpによりますと、
INTERNAL: Access to the method is restricted to the namespace (library).
少しライブラリにコンセプトに絡んでしまいますね。また後ほどで説明します。
###実装
直接アクセスしてもコンパイルエラーないみたいですね。
##THIS
いわゆるMethodが自分に属するFunction Blockの中にあるMethod・変数をアクセスするときに使うKeywordです。
先のPrivate metohd・Protected methodのみたように、THIS^を使ってMethodをアクセスしたこと、覚えています?
###実装の例
文字だけだとちょっとわかりつらいので簡単プログラムを作ってみましょう。
- FB3の中に_intがあり
- myPublicMethod呼びされたら、2になります。
- myPrivateMethod呼びされたら、4になります。
- myProtectedMethod呼びされたら、3になります。
- myInternalMethod呼びされたら、1になります。
はーい、お疲れ様です。