CodeSys#Properties 

今回はPropertiesについて書きます。

#Properties とは？
Online Helpはいつもあなたの友達です。CodesysのOnline Helpによりますと…

>Properties are an extension of the IEC 61131-3 standard and a tool for object-oriented programming. Properties are used for data encapsulation because they allow for external access to data and act as filters at the same time. For this purpose, a property provides the accessor methods Get and Set which allows for read and write access to the data of the instance below the property.

PropertiesはIEC61131-3標準のOOP拡張ツールです。Propertiesはデータのカプセル化として使われ、それを使うによって外部から内部のデータにアクセスすることができようになり、そして読み書き読みが同時行うことを防止します。PropertiesはGetとSetのMethodがあり、外部からそのProperties持ってる変数をアクセスできます。

ここからは質問です。
下は3つのルートがあります、どっちがアクセスできるでしょうか？
1. FB4のInputをアクセスするルート
2. FB4のInternal変数をアクセスするルート
3. FB4のOutputをアクセスするルート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/16a28d9d-f4a7-5722-d4b6-238f5613a531.png)

ちなみにCodeはこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/33aeed4e-a95c-7549-c88a-2afeda65768f.png)

コンパイルしたらVAR2だけはエラーが出てきますね。つまり、そのまま直接_FB4.VAR2はルール違反です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e4bb9617-7d29-3def-867c-2c0162420d87.png)

#プログラム
ここでPropertiesを作れば、VAR2がアクセスできるようになります。
Function BlockのところにAdd Object>Propertyを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e02185b7-1d27-3575-4e30-e602aefd9795.png)

名前決めて、Return typeはIntにします。Addをクリックし作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/7c438289-1423-1fd2-322b-75994ebe94c0.png)

そうすると、ValueVAR2の下にGetとSetが2つのPropertyがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/3739f487-fb08-b299-35db-f5e24317abe2.png)

Online HelpにはGetとSetは以下のような説明があります：

>When the Set accessor is called, the property is written. It is then used in the same way as an input parameter. When the Get accessor is called, the property is read. It is then used in the same way as an output parameter. Access is restricted by means of access specifiers, and the objects are marked accordingly.
When a property is accessed as read only or write only, you can delete the unneeded accessors.

Setが呼び出しされた場合、Propertyが上書きされ、Inputパラメタとして使われています。
Getが呼び出しされた場合、Propertyが読みされる、Outputパラメタとして使われています。
そして変数のアクセスはAccessによって制限されています。もし変数のPropertyが書きだけ・読みだけを設定したいのであれば、どっちかを削除すればよいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/03e8632f-429b-1e3a-46b3-1a40fded550f.png)

#実装
ここで簡単な例を作ってみましょう。
##FB4
プログラムは空ですね。今回のPropertyを使うの例はVAR2でございます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2f673bb5-92a5-29b4-7029-cffcebd8977a.png)

##Get
VAR2の値をValuveVAR2に渡す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e559aa52-84a0-cc13-6f08-fd4461bab0cb.png)

##Set
ValuveVAR2の値をVAR2へ渡す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6a4de60f-17e5-573e-43a9-3ac2e8e7fe88.png)

##OB125
もしSW1がONすればValueVAR2はSP1の値になります。
そしてSP2はValuveVAR2の値になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f38c1b7b-6797-4e1c-7154-0f5dc3418f72.png)

###Get実際やってること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/d1eb5345-d236-de01-9d4f-26dbda85816d.png)

###Set実際やってること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f4e1c138-a7e8-979e-5f21-fa02979fcecc.png)

#結果
![Prop1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2ebbddc0-3204-0555-267b-83f4a88e74e9.gif)

はーい、お疲れ様です。