前回、Motionライブラリのファンクションブロックの中から、電源ON、絶対位置の設定、位置の読み取りの三つを、MAINエリアに記述しました。
フィールドバスのEtherCATの規格上、数msに1回、MAINは実行されます。このシステムでは、2msの周期です。電源ONと位置の読み取りは、なにも問題は起こらないと思います。
「絶対位置の設定」では、速度と加速度だけを実行するように記述をしているので、位置の指定であるPositionを別途指定します。その値は、Din0とDin1のスイッチの入力と、結果を示すDout0のLEDとともに指定します。
ディジタル入力部分のプログラム
IF NOT Din0 THEN
を入れてリターンを押すと、自動宣言の画面が出ます。型はBOOL、初期値は負論理なので1を入れます。
つづけて
Position_Move.Position := 2;
Position_Move.Execute := TRUE;
Dout0 := 1;
まで入力すると、Dout0の自動宣言が出ます。型はBOOL、初期値は0を入れます。
ELSIF Din1 THEN
まで入力すると、Din1の自動宣言が出ます。型はBOOL、初期値は0を入れます。
残りを全部入れます。
// Position_Move.Execute := FALSE;
Position_Move.Position := -2;
Position_Move.Execute := TRUE;
Dout0 := 1;
ELSE
Dout0 := 0;
Position_Move.Execute := FALSE;
追加した部分です。
これらの追加によって、先頭部分の宣言のところに3行追加されています。
これを次のように、ハードとのリンクを張るために、修正します。
Din1 AT %I*: BOOL := 1;
Din0 AT %I*: BOOL := 0;
Dout0 AT %Q*: BOOL := 0;
すべて保存し、ビルドします。
リンクを張る
ディジタル入力のChannel1を右クリックして、リンクの変更を選択します。
アタッチの画面が出るので、MAINの中のDin1変数を選択します。
ディジタル入力のChannel2を右クリックして、同様にDin0変数を選択します。
ディジタル出力のChannel1を右クリックして、同様にDout0変数を選択します。
アタッチは、一度ビルドしておくと表示されます。
すべて保存します。
メニューのビルドから、untiled1のクリーン、untiled1のリビルド、ソリューションのクリーン、ソリューションのリビルドを行います。構成の有効化をクリックし、AX1をダブルクリックします。
中央にはMAINと TwinCAT3 ProjectXXのタブができます。MAINのタブの上で右クリックし、垂直タブグループの新規作成をクリックすると、MAINのソースとAX1の機能ページが出るので、オンラインをクリックします。
中央にプログラムのソース、右側に、モータを動かす操作画面が同時に出ます。デバッグ時にとても便利な状態です。構成の有効化を押すと、操作画面が消えることがあるので、その場合は、同じ操作をして、画面を出しなおします。
この時点でエラーに4650が出ていることがあります。Drive hardware not ready to operate;は、
: ドライブがエラー状態 (ハードウェア エラー)
- ドライブが起動フェーズ (たとえば、ハードウェア エラーが発生した軸リセット後)
- ドライブがコントローライネーブル (ENABLE)
を使用できません。
です。
電源が入っていないときのエラーは4466 Invalid IO data for more than n subsequent NC cycles (encoder)です。
軸 (エンコーダ) が検出された以降のサイクル (タスク) 以上の無効なエンコーダー データ (例えば)。通常、EtherCAT メンバーに関しては、デバイスとコントローラ間のデータ転送が妨害される、動作カウンタ エラー(WcState)に関するものです。nNCNCSAFIOn=3IO
このエラーが連続的に長い期間設定されている場合、この状況は軸参照を失う可能性があります ("homed" フラグはリセットされ、エンコーダーは「参照されていない」状態になります)。
このエラーの原因として考えられる理由: EtherCAT スレーブが状態を離れたか、リアルタイムの使用が高すぎるか、リアルタイムジッターが高すぎる可能性があります。
最終プログラム
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
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に近づけます。
エンコーダのパラメータです。