日記；回すだけ ⑩ST言語でモータを回す記述＜その2＞

###プログラムはPLCに記述する
　ソリューションエクスプローラにあったC++（非表示にした）は、ファンクションなどの開発用らしいです。
　ソリューションエクスプローラのPLCを右クリックし、新しい項目の追加を選択します。このエリアで、IEC61131-3にそったプログラミング言語が利用できるようになります。

<img width="450" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/efc62990-417a-4764-8e2a-04e7e8107f1c.png">

　Stardard PLC Projectを選択します。
![t202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/718499f5-9cbc-6d41-41c0-9ec31a70533b.png)

　ソリューションエクスプローラのPLCの下に、Untitled1以下、プロジェクトに必要な項目が追加されます。POUsがプログラム類の収録する場所で、デフォルトのMAIN（PRG）が作られているので、ダブルクリックすると、中央のエリアにエディタが開きます。

<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/a7d0a35e-f591-8b35-f525-4e02240e4721.png">

###Motionの基本ライブラリを追加する
　ソリューションエクスプローラの Referencesを開きます。Referencesを右クリックして、ライブラリの追加を選択します。

<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/cc0477e1-7c1a-8c96-bcab-0dcb7cb6e433.png">

　検索欄にMC2を入れると、関連ライブラリを探し出してくれます。TC2_MC2を選択し、OKを押します。ライブラリが追加されました。
![t205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/594cbd41-5102-2d20-272c-aa091b19b5ec.png)
###プログラミング開始

　MAIN(PRG)の中央にあるエディタの上部は、変数定義で、その下が本体です。本体部分の1行目で右クリックし、入力アシスタントを選択します。


![t206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/85f44d92-c272-df07-5247-9274e1ed0459.png)

　入力アシスタントの画面が出ます。ファンクションブロックの中から、MotionライブラリのTc2_MC2をクリックし、MC_Powerを表示します。
![t207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/c68479f7-4870-6c2c-bc88-824dd9576ff0.png)

　MC_Powerを選択し、OKをクリックすると、自動宣言の画面が出るので、名称、ここではPower_Onと入力してOKをクリックします。
![t208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0e6d43dd-7fa4-0ae2-20e0-6e3bee5f76e5.png)

　ST言語なので、図は貼り込まれず、テキストの記述が挿入されます。
　エディタ上部の宣言領域には、先ほど名前を付けた宣言が挿入されています。
　エディタの本体には、入力パラメタは := で、出力パラメタは => で値を記入できるような状態で貼り込まれています。
![t209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/7cf1a2d6-8e69-b834-db9c-85cdba000be1.png)
　最初の項目Axisは軸の名前ですが、左のソリューションエクスプローラを見ると「軸 1」です。じつは、コンパイルしたときにエラーになりました。なので、アルファベットAX1に変更しました。
![t210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/1684e8ff-0cbd-41f9-beab-52409e6b8034.png)

　エディタでAxis:=AX1と軸の名前を追加します。
![t211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/8330637c-17d0-f292-aa97-7a24befe599a.png)

　メニューのビルドから、ソリューションのビルドを選び、コンパイルします。
　AX1をダブルクリックし、中央に出てきた情報の設定タブを開きます。PLCにリンクをクリックしたら出てくる画面で、 MAIN.AX1（Untitled1 Instance）を選択し、OKを押します。
![t212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/4f32226d-329d-71be-3a9e-008370a03584.png)
　これで、物理的なハードEPOS4とプログラムがリンクされた状態になりました。
![t213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/f6cec249-326c-51d7-f30d-a1aa5bbec001.png)

　Power_Onの必要と思われる残りの項目を記入します。
![t214a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/26bb2501-e145-28ea-63d1-4988db0dbd15.png)

``Enable:= TRUE``は、Power_Onが呼ばれたら実行するという意味？です。
``Enable_Positive:= TRUEとEnable_Negative:= TRUE``は、動きの方向がどちらでもよいという意味です。
``Override:= 99 ``は、モータに対する何らかの値で、0から100までの整数値を入れます。設定したことが明白になるよう99にしました。
###モータを回転（移動）する
　エディタで、Power_Onの下にカーソルを動かし、右クリックで入力アシスタントを選択します。入力アシスタントの画面が出ます。ファンクションブロックの中から、MotionライブラリのTc2_MC2をクリックし、MC_MoveAbsoluteを表示します。OKを押します。
![t215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/b806570a-5699-7e17-4eb9-345fcce7553b.png)
　自動宣言のパネルが出るので、Position_Moveと名前を付けてOKを押しました。

![t216.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/cbdb10e2-d420-2dc0-8b77-b10df706c194.png)

　ソースが追加されました。
![t217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/db9e127d-cca5-63c8-2e11-37fea6a6a7f6.png)
　値は、次の2か所だけいれます。

```	Velocity:= 25, 
	Acceleration:= 20, 
```

　Positionに値を入れると、その位置に移動した後、変更ができなくなります。

###位置の読み出し
　Positionを読み出します。
　上記と同様に、ファンクションブロックMC_ReadActualPositionを追加します。名前はRead_Positionにしました。
　値を入れるのは2か所です。
　読みだしたPositionは実数です。あとで表示に使えるように文字列に変換したのがSpositionです。

```
Read_Position(
	Axis:= AX1, 
	Enable:= TRUE, 
	Valid=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> , 
	Position=> );
	
Sposition := LREAL_TO_STRING(Read_Position.Position);
```
　以上で、最低限必要だと思われるファンクションブロックを記述しました。
![t218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/eb049f5a-4517-294d-e823-d71b5ab388d7.png)

　すべてを保存し、ビルドしてエラーが出ないことを確認しておきます。

　次回は、二つのスイッチを使って、モータを回転させる指示を追加します。