Beckhoff#MC_MoveContinuousAbsoluteとMC_MoveContinuousRelativeを使ってみよう

こちらは新しいシリーズでFATEKのSC シリーズSERVOを使用し様々な記事を展開していきます。第3話はBeckhoff TwinCAT3のMC_MoveContinuousAbsoluteとMC_MoveContinuousRelativeのFB使用を紹介します。

さ、FAを楽しもう。

Reference Link

http://soup01.com/ja/category/fatek/sc-series/

MC_MoveContinuousAbsolute

FB MC_MoveContinuousAbsoluteは、絶対目標位置への位置決めを開始し、全移動経路にわたる軸の動きを監視します。目標位置では一定の終端速度に達し、その速度が維持されます。目標位置に到達すると「InEndVelocity」出力が設定されます。それ以外の場合、出力「CommandAborted」が設定されるか、エラー発生時には出力「Error」が設定されます。

注意するのは、目標位置に到達すると、FBの動作は終了し、軸は監視されなくなります。

VAR_INPUT

名前説明
ExecuteBOOLコマンドは立ち上がりエッジで実行される。
PositionLREAL目標の絶対位置。
VelocityLREAL目標位置への移動における最大速度(>0)。
EndVelocityLREAL目標位置に到達した後に維持される終端速度。
AccelerationLREAL加速度(≥0)。値が 0 の場合、System Manager の軸設定で標準加速度が使用される。
DecelerationLREAL減速度(≥0)。値が 0 の場合、System Manager の軸設定で標準減速度が使用される。
JerkLREALジャーク(≥0)。値が 0 の場合、System Manager の軸設定で標準ジャークが適用される。
BufferModeMC_BufferMode
OptionsST_MoveOptions使用されるパラメータを含むデータ構造。通常は未接続のままでよい。

VAR_IN_OUT

名前説明
AxisAXIS_REF軸を明確に識別するための軸データ構造。位置、速度、エラー状態など、現在の軸ステータスを含む他のパラメータも含まれる。
名前説明
InEndVelocityBOOL目標位置に到達したとき TRUE となる。関数ブロックは新しいコマンドが発行されるまで「Busy」および「Active」のままになる。
BusyBOOLコマンドが Execute で開始され、移動コマンドが処理されている間 TRUE。「Busy」が FALSE の場合、関数ブロックは新たな命令を受け付けられる状態となる。同時に「CommandAborted」または「Error」のどちらかがセットされる。
ActiveBOOLコマンドが実行中であることを示す。コマンドがバッファリングされていた場合、実行中のコマンドが完了すると Active になる。
CommandAbortedBOOLコマンドが完全に実行できなかった場合 TRUE。軸が停止した場合、または現在のコマンドが別の Move コマンドに置き換えられた場合に発生。
ErrorBOOLエラーが発生した場合 TRUE。
ErrorIDUDINTError 出力がセットされたとき、そのエラー番号が格納される。

MC_MoveContinuousRelative

FB MC_MoveContinuousRelativeは、相対距離による位置決めを開始し、全移動経路にわたる軸の動きを監視するために使用されます。目標位置では一定の終端速度に達し、その速度が維持されます。目標位置に到達すると「InEndVelocity」出力が設定されます。それ以外の場合、「CommandAborted」出力、またはエラー発生時には「Error」出力が設定されます。

注意するのは、目標位置に到達すると、FB機能は完了し、軸は監視されなくなります。

VAR_INPUT

名前説明
ExecuteBOOL立ち上がりエッジでコマンドが実行されます。
DistanceLREAL位置決めに使用する相対距離。
VelocityLREAL「Distance」区間を移動する際の最大速度(>0)。
EndVelocityLREAL相対距離「Distance」完了後に維持される最終速度(>0)。
AccelerationLREAL加速度(>0)。値が0の場合、System Manager の軸設定にある標準加速度が使用されます。
DecelerationLREAL減速度(>0)。値が0の場合、System Manager の軸設定にある標準減速度が使用されます。
JerkLREALジャーク(>0)。値が0の場合、System Manager の軸設定にある標準ジャークが適用されます。
BufferModeMC_BufferMode軸がすでに別コマンドを実行中かどうかを評価します。MC_MoveContinuousRelative は現在のコマンド終了後に有効になり、現在のコマンドを中断します。現在→次のコマンドへの遷移も BufferMode により決まります。BufferMode を使うには常に2つ目のファンクションブロックが必要です。アクティブ中は、新しいパラメータで別のFBをトリガできません。
OptionsST_MoveOptions追加の(あまり使われない)パラメータを含むデータ構造。通常この入力は未接続のままで問題ありません。

VAR_IN_OUT

名前説明
AxisAXIS_REF軸を明確に識別するための軸データ構造。位置、速度、エラー状態など、現在の軸ステータスを含む他のパラメータも含まれる。

VAR_OUT

名前説明
InEndVelocityBOOL目標位置に到達すると TRUE。以降、新しいコマンドが発行されるまで「Busy」と「Active」は TRUE のままになります。
BusyBOOLコマンドが「Execute」で開始されると TRUE。また、移動コマンドが処理中の間は TRUE。「Busy」は、FBが次の呼び出しで新しいコマンドを受け付けられる状態になると FALSE。同時に「CommandAborted」または「Error」のどちらか一方がセットされます。
ActiveBOOLコマンドが実行中であることを示します。コマンドが中断された場合、完了後に Active は TRUE になります。
CommandAbortedBOOLコマンドを最後まで実行できなかった場合に TRUE。これは、コマンドが別のムーブコマンドにより停止された(置き換えられた)こと、または現在のコマンドが別のムーブコマンドにより置き換えられたことを意味します。
ErrorBOOLエラーが発生した場合に TRUE。
ErrorIDUDINTError 出力がセットされた場合、このパラメータにエラー番号が入ります。

Implementation

こちらは今回の構成です。

TwinCAT Side

MAIN

次はMAINプログラムを作成します。それは前回の記事のプログラムを編集したものです。

VAR

VARでMC_MoveContinuousAbsoluteとMC_MoveContinuousRelativeのInstanceを定義します。

PROGRAM MAIN
VAR
fbMC_Power :MC_Power;
fbMC_Home :MC_Home;
fbMC_Stop :MC_Stop;
fbMC_Jog :MC_Jog;
fbMC_MoveAbsolute :MC_MoveAbsolute;
fbMC_MoveRelative :MC_MoveRelative;
fbMC_MoveContinuousAbsolute :MC_MoveContinuousAbsolute;
fbMC_MoveContinuousRelative :MC_MoveContinuousRelative;
fbMC_ReadActualPosition :MC_ReadActualPosition;
fbMC_ReadActualVelocity :MC_ReadActualVelocity;
fbMC_ReadStatus :MC_ReadStatus;
fbMC_Reset :MC_Reset;
END_VAR
VAR
fbMC_MoveAbsolutePosition
,fbMC_MoveAbsoluteVelocity :LREAL;
fbMC_MoveRelativePosition
,fbMC_MoveRelativeVelocity :LREAL;
xInited :BOOL;
xExeAbs,xExeRel,xReset,xPWON :BOOL;
xExeAbsCont,xExeRelCont :BOOL;
xExeStop :BOOL;
END_VAR

Program

最後はプログラムを作成します。MC_MoveContinuousAbsoluteとMC_MoveContinuousRelativeのFBを呼び出してください。

IF NOT xInited THEN
fbMC_MoveAbsolutePosition:=0.0;
fbMC_MoveAbsoluteVelocity:=6.0;
fbMC_MoveRelativePosition:=6.0;
fbMC_MoveRelativeVelocity:=30.0;
xInited:=TRUE;
END_IF

fbMC_Power(
Axis:=GVL.axis[0]
,Enable:=xPWON
,Enable_Negative:=TRUE
,Enable_Positive:=TRUE
);
fbMC_Reset(
Axis:=GVL.axis[0]
,Execute:=xReset
);

fbMC_Stop(
Axis:=GVL.axis[0]
,Execute:=xExeStop
);
IF fbMC_Stop.Busy THEN
xExeStop:=False;
END_IF

fbMC_Home(Axis:=GVL.axis[0]);
fbMC_Jog(Axis:=GVL.axis[0]);
fbMC_MoveAbsolute(
Axis:=GVL.axis[0]
,Execute:=xExeAbs
,Position:=fbMC_MoveAbsolutePosition
,Velocity:=fbMC_MoveAbsoluteVelocity
);
IF fbMC_MoveAbsolute.Busy THEN
xExeAbs:=FALSE;
END_IF

fbMC_MoveRelative(
Axis:=GVL.axis[0]
,Execute:=xExeRel
,Distance:=fbMC_MoveRelativePosition
,Velocity:=fbMC_MoveRelativeVelocity
);
IF fbMC_MoveRelative.Busy THEN
xExeRel:=FALSE;
END_IF

fbMC_ReadActualPosition(
Axis:=GVL.axis[0]
,Enable:=TRUE
);

fbMC_ReadActualVelocity(
Axis:=GVL.axis[0]
,Enable:=TRUE
);

fbMC_ReadStatus(
Axis:=GVL.axis[0]
,Enable:=TRUE
);

fbMC_MoveContinuousAbsolute(
Axis:=GVL.axis[0]
,Execute:=xExeAbsCont
,Position:=fbMC_MoveAbsolutePosition
,Velocity:=fbMC_MoveAbsoluteVelocity
);
IF fbMC_MoveContinuousAbsolute.Busy THEN
xExeAbsCont:=FALSE;
END_IF

fbMC_MoveContinuousRelative(
Axis:=GVL.axis[0]
,Execute:=xExeRelCont
,Distance:=fbMC_MoveRelativePosition
,Velocity:=fbMC_MoveRelativeVelocity
,EndVelocity:=10
);
IF fbMC_MoveContinuousRelative.Busy THEN
xExeRelCont:=FALSE;
END_IF

Result

こちらはServoがFBを実行したときのグラフです。軸はMC_MoveContinuousAbsoluteが位置決め完了したあと、EndVelocityの設定値で定速出力してることがわかります。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする