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

　前回、Motionライブラリのファンクションブロックの中から、電源ON、絶対位置の設定、位置の読み取りの三つを、MAINエリアに記述しました。
　フィールドバスのEtherCATの規格上、数msに1回、MAINは実行されます。このシステムでは、2msの周期です。電源ONと位置の読み取りは、なにも問題は起こらないと思います。
　「絶対位置の設定」では、速度と加速度だけを実行するように記述をしているので、位置の指定である**Position**を別途指定します。その値は、Din0とDin1のスイッチの入力と、結果を示すDout0のLEDとともに指定します。

###ディジタル入力部分のプログラム
　``IF NOT Din0 THEN``を入れてリターンを押すと、自動宣言の画面が出ます。型はBOOL、初期値は負論理なので1を入れます。
![t301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0f981250-a693-ed67-239a-a672afe4b42e.png)
　つづけて

```
    Position_Move.Position := 2;
    Position_Move.Execute := TRUE;		
    Dout0 := 1;	
```

まで入力すると、Dout0の自動宣言が出ます。型はBOOL、初期値は0を入れます。
![t302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/20314813-a5ca-88e5-b3fa-5e1c8adf3cf3.png)



```
ELSIF Din1 THEN
```

まで入力すると、Din1の自動宣言が出ます。型はBOOL、初期値は0を入れます。
![t303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/3a432a53-b147-ddb2-f642-d4ec00a190f6.png)

　残りを全部入れます。
```
    // Position_Move.Execute := FALSE;
    Position_Move.Position := -2;
    Position_Move.Execute := TRUE;		
    Dout0 := 1;
ELSE
    Dout0 := 0;
    Position_Move.Execute := FALSE;
```
　追加した部分です。
![t304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/3e43be20-95dc-c2e9-033c-623b4f6e9e26.png)
　これらの追加によって、先頭部分の宣言のところに3行追加されています。
![t305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/071f327b-8f84-330c-0335-e8c66ec9d160.png)
　これを次のように、ハードとのリンクを張るために、修正します。

```
	Din1 AT %I*: BOOL := 1;
	Din0 AT %I*: BOOL := 0;
	Dout0 AT %Q*: BOOL := 0;
```
　すべて保存し、ビルドします。
###リンクを張る
　ディジタル入力のChannel1を右クリックして、リンクの変更を選択します。
![t306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/099b6be6-70e3-a982-897a-5c5441d366e0.png)

　アタッチの画面が出るので、MAINの中のDin1変数を選択します。
![t307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/361ea83a-b06d-48bc-c157-c83acc533789.png)

　ディジタル入力のChannel2を右クリックして、同様にDin0変数を選択します。
![t308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/8d38129b-a4eb-7c3e-ff4a-f888e6087d5e.png)

　　ディジタル出力のChannel1を右クリックして、同様にDout0変数を選択します。
　アタッチは、一度ビルドしておくと表示されます。
![t309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/fd458b51-4e8a-851e-caa2-547bcec83377.png)

　すべて保存します。
　メニューのビルドから、untiled1のクリーン、untiled1のリビルド、ソリューションのクリーン、ソリューションのリビルドを行います。構成の有効化をクリックし、AX1をダブルクリックします。
　中央にはMAINと TwinCAT3 ProjectXXのタブができます。MAINのタブの上で右クリックし、垂直タブグループの新規作成をクリックすると、MAINのソースとAX1の機能ページが出るので、オンラインをクリックします。
　中央にプログラムのソース、右側に、モータを動かす操作画面が同時に出ます。デバッグ時にとても便利な状態です。構成の有効化を押すと、操作画面が消えることがあるので、その場合は、同じ操作をして、画面を出しなおします。
![t310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/afc2e918-6a62-73df-91fc-34f9d76c430c.png)

　この時点でエラーに**4650**が出ていることがあります。Drive hardware not ready to operate；は、

:::note info「ドライブハードウェアが動作する準備ができていません」ドライブハードウェアは、動作の準備ができていません。考えられる原因は次のとおりです
: ドライブがエラー状態 (ハードウェア エラー)
- ドライブが起動フェーズ (たとえば、ハードウェア エラーが発生した軸リセット後)
- ドライブがコントローライネーブル (ENABLE)
を使用できません。
:::
です。

 電源が入っていないときのエラーは4466　Invalid IO data for more than n subsequent NC cycles (encoder)です。

:::note info
　軸 (エンコーダ) が検出された以降のサイクル (タスク) 以上の無効なエンコーダー データ (例えば)。通常、EtherCAT メンバーに関しては、デバイスとコントローラ間のデータ転送が妨害される、動作カウンタ エラー(WcState)に関するものです。nNCNCSAFIOn=3IO
このエラーが連続的に長い期間設定されている場合、この状況は軸参照を失う可能性があります ("homed" フラグはリセットされ、エンコーダーは「参照されていない」状態になります)。
このエラーの原因として考えられる理由: EtherCAT スレーブが状態を離れたか、リアルタイムの使用が高すぎるか、リアルタイムジッターが高すぎる可能性があります。
:::

###最終プログラム

```C
PROGRAM MAIN
VAR
	Power_On: MC_Power;
	AX1: AXIS_REF;
	Position_Move: MC_MoveAbsolute;
	Read_Position: MC_ReadActualPosition;
	Sposition: STRING;
	Din1 AT %I*: BOOL := 1; // jiki
	Din0 AT %I*: BOOL := 0; // hikari
	Dout0 AT %Q*: BOOL := 0; // LED
END_VAR

```

```C
Power_On(
	Axis:= AX1, 
	Enable:= TRUE, 
	Enable_Positive:= TRUE, 
	Enable_Negative:= TRUE, 
	Override:= 99, 
	BufferMode:= , 
	Options:= , 
	Status=> , 
	Busy=> , 
	Active=> , 
	Error=> , 
	ErrorID=> );

Position_Move(
	Axis:= AX1, 
	Execute:= , 
	Position:= , 
	Velocity:= 25, 
	Acceleration:= 20, 
	Deceleration:= , 
	Jerk:= , 
	BufferMode:= , 
	Options:= , 
	Done=> , 
	Busy=> , 
	Active=> , 
	CommandAborted=> , 
	Error=> , 
	ErrorID=> );
	
Read_Position(
	Axis:= AX1, 
	Enable:= TRUE, 
	Valid=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> , 
	Position=> );	
	
Sposition := LREAL_TO_STRING(Read_Position.Position);

// hikari
IF Din0 THEN
    Position_Move.Position := 2;
    Position_Move.Execute := TRUE;		
    Dout0 := 1;
// jiki	
ELSIF NOT Din1 THEN
    Position_Move.Position := -2;
    Position_Move.Execute := TRUE;		
    Dout0 := 1;
ELSE
    Dout0 := 0;
    Position_Move.Execute := FALSE;
END_IF

```

　構成の有効化をクリックしたら、エラー4650が出る場合があります。ビルドで、クリーン、リビルド、構成の有効化を実行したり、すべてを保存、終了、再度TwinCAT3の起動したりすると、エラーがなくなることもあります。このあたりは、他社のモータコントローラを使っていることも影響があるのかもしれません。

　うまく動作するときに設定内容です。オンライン画面で、位置（大きな文字で表示）が0付近から大きく外れていると、エラーになりやすいです。手で軸を回して0に近づけます。
　エンコーダのパラメータです。
![スクリーンショット 2021-08-18 11.17.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/6b90e99f-9898-ba56-a53a-4c3314eb0ec9.png)

　AX1のパラメータです。
![スクリーンショット 2021-08-18 11.20.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/69fea7e9-c7d1-7678-00dd-0216bc05eda3.png)

　実行中の様子です。
![スクリーンショット 2021-08-18 11.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/bd379416-a4a2-5fd7-a855-0919c65faf25.png)