CodeSys#Function作る

#初めに

今回はCodeSysでFunctionとFunction blockの作成について書きます。
https://help.codesys.com/webapp/_cds_obj_function;product=codesys;version=3.5.16.0
CodeSysのOnline Helpによりますと、Functionとはー

>A function is a POU that supplies precisely one data element when executed and whose call in textual languages can occur as an operator in expressions. The data element can also be an array or a structure.

FunctionはPOUとして、実行すると一連の処理し最後は正確に処理結果が返してくるってことです。この処理結果は配列でも構造でもOKです。

>Functions have no internal status information, which means that functions do not save the values of their variables until the next call. Calls of a function with the same input variable values always supply the same output value. Therefore, functions must not use global variables and addresses!

Functionは内部メモリがないーつまりFunctionは自分の変数値を次呼び出すまで保持することができません。同じなInput変数と何回呼び出しても常に同じ出力になる。
なので、FunctionはGlobal変数とアドレスを使うべきではありません。

>The output variable of a function is the function name.

その処理結果の変数名はFunctionの名前になります。

```
FUNCTION MyFun:INT
.....
MyFunc:=1;
```

>According to the IEC 61131-3 standard, functions can have additional outputs. You declare the additional outputs in the function between the keywords VAR_OUTPUT and END_VAR. 

IEC61131-3によりますとFunctionはOutputsを追加することができます。追加されるOutputはVAR_OUTPUTとEND_VARの間に定義してください。

#Functionの作成
円の面積計算するFunctionを作ります。
Add Object>POU
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6f7b0fcb-9bc4-5b14-95bf-bc54dcf3f357.png)

Functionを選んで、Return type(戻り値)を実数にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/556fa875-1070-13dd-c8a4-dfb19c568ca7.png)

INPUTは円の半径ですね。r32Radiusは実数です。
PIは定数でよいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/73144245-0844-4a4f-11fc-b92b6c25ec4b.png)

先にも書きましたが、Functionの戻り値はそのFunctionの名前自身です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ec2fb52c-95cf-bc58-71bb-5de013e06eb0.png)

Function用意終わったら次はそれを飛び出すPOUを作ります。
Add Object>POU
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/b44a5499-413c-6347-9aaf-f011c6c66ed4.png)

Programを選んでOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/cfb90504-1ffd-6a80-503d-58fc6ac787ea.png)

2つの変数r33myValとr32myAreaを定義します。
右のToolboxから“Box with EN/ENO”を選択し右にひっばります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/7e682fd9-062b-fbf9-ffb6-fbae17f342b4.png)

操作は同じく、…の白いボタンを押し、Text searchで検索し選択、OK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/dac4dc83-ef00-d323-1977-4f372af7d1b9.png)

 r32Radiusは半径の変数として入力、r32myAreaはその演算結果を格納する変数です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/81206d17-f23b-fb4e-7224-fde05298c413.png)

次は先作ったmyPOU2をTaskとして呼び出す必要があります。
Task Configuration>MainTaskを開いて、myPOU2をそのままひっばります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/acacbd19-5cfc-0dd2-6a77-e459c26beca3.png)

そうするとCallされるPOUが1つ追加されましたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e6e908c2-0bb1-c416-f2ef-6dd837f27181.png)

#画面

今度は入力画面を作ります。
Labelを選んでひっばります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/68a14732-b6ad-d792-d7d9-a7d6d33a4efb.png)

Textのところに表示文字を変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/99bd91bc-58de-fb7d-83cb-966312c767bc.png)

入力BOXを作ります。
Text fieldを選んでひっばります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/77772242-e72d-db02-eb4c-eac4ce9c9c5f.png)

Text variableのとなりにある…のボタンをクリックし、先POUの中に定義したr32myValを選び、OK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/b1eac6d5-8384-2487-cd48-57a1873ac61a.png)

それだけでなにも反応もありません。
1. Input configuration>OnMouseClickの
2. 隣Configur..のあたりにクリックします。
3. Write a Variable
4. 右への矢印を選びます
5. Input typeは“VisDialogs.Numpad”
6. OK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2d71dc51-2f0d-495c-9cac-a13a9bc1b7ea.png)

最後は表示のほうです。
Text>Textに％fを入れれて実数の表示になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c7ebf9cb-ae46-83d5-4fab-15e7a7b738eb.png)

#結果
![mygif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/d2d24554-8beb-1e3d-610a-4e5823502c50.gif)