Codesys#Method


#Version
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/72cb9170-c124-748e-2210-e991cb81e003.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の中にでデータをカプセル化するのツールの１つです。Methodsは宣言・実装が含まられています。ただし、MethodはFunctionと違って、Methodは独立なPOUではなく、FunctionやFunction blockの一部です。
Methodは上位のPOUの変数全てアクセスすることができます。

#作成
Methodの定義は名前・戻り値・実装の言語（ST,LAD...）ともう１つすこく大事なAccess Speciferが必要です。そのAccess Speciferにには以下４つのオプションがあります：

- Public
- Private
- Protected
- Internal

##Public
まずFunction Blockのところ右クリックし、Add Object>Method。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/74426b06-ebbd-c25f-3031-de4bddf1cbc8.png)

Addcess speciferにPUBLICを選択し、OK。
CodeSysのOnline helpによりますと
>PUBLIC or not specified: Access is not restricted.

つまり制限なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/bac610a3-50b4-40f2-e8e9-a481a9cf0c6e.png)

Function Blockの下Methodがぶら下がってるのは見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f81f7469-7ac0-b470-97c8-a2edb981b55d.png)

###実装

複雑なもの作っても仕方ないので、BOOLが入ったら反転して戻りします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e7e8586b-46d5-e902-47bc-f055f3aa4817.png)

POUの中にFB3をCallして、直接myPublicMethod()をアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/98249dbc-2278-94fa-cf0e-5ebcffb944fa.png)

###画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2af0d926-15d1-0bd3-602b-97be4f1380a2.png)

###結果
ここっで注意したいのは、FB3の中身は空でなにも書いてない状態です。
![method1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5105167e-f3c3-b1c0-b62c-3aca96a85dee.gif)

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

###Method追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/16b0d4cc-1932-8751-c217-0244593a2ffc.png)

###実装
呼びされたら+１にする。
もしMethod内の変数がKeepできれば、myVarの値は変換続ける。
もしMetohd内の変数がKeepできなければ、myVarの値がずっと１にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/73d65351-5376-aa12-7140-a9efdae126b7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5a9dfd56-1f02-2662-899f-ebca0c8274c0.png)

###結果
うん～どうやら変数のScopeはMethod内だけになりますね。
![method2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/eb30b3fd-36d0-fd89-0c31-98195a1ef17c.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/658fd839-af2d-7771-0875-f547c32f3702.png)

###実装
やってることがPublicの一緒にです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f19d9118-aad6-896b-6754-cd4b4104a2f5.png)

問題が来ました。POUからそのPrivate Methodを呼び出しすると、Auto-FillinがそのPrivate Methodを選択できない。
つまりCallできないってことですかね…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/bb466b42-2b50-9749-c596-91cb5e41668c.png)

と思ったら、意地悪してCallしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/d54df24e-1ca8-1a95-e2fb-86fe7ce438e4.png)

コンパイルするエラーが出ました。Private Methodアクセスできません、と。
ではどうすればよいですか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/08c2b644-c175-9d70-f450-0fe441e6dfec.png)

ここでFunction Block、FB3に戻りましょう。THIS^　Keywordを使うとPrivate Methodもアクセスすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c9de2381-048e-10a2-7df1-40fa3e72cd5a.png)

つまりこんな感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4f7f0e86-53b7-d2b6-72d1-84ce319dea2f.png)

もう一度Callします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/56544712-5128-4bbb-a141-e575e8128b67.png)

###結果
![method3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/29a44f8e-1724-bbae-a20d-c21574c62377.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/8bedecd9-b8c0-ce86-532a-5638d8874155.png)

Methodの中身は一緒にですー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/df7cc0d7-8418-398e-2246-539c32ad8551.png)

POUの中にProtected methodをアクセスするとやっばりだめでしたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/45b26af2-22f9-ff31-d124-04949fb5a2a9.png)

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

##INTERNAL

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

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

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

###実装

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/38152ce3-f3da-57a6-1f92-ce751bd54f30.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/453a0df9-912d-6668-6b9f-bca5fd987fbf.png)

FB3のところに_intの定義も忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/661a97e3-a6b7-2066-8019-ec72c6ea84ab.png)

最後MainPOUでCallのタイミング修正。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/27896ec8-ef7a-abff-ca53-6e08ceb5fa9d.png)

###結果
![method5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/abf4e098-b3bc-817a-f2d5-de1f184e7be6.gif)

はーい、お疲れ様です。