こちらは新しいシリーズで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
| 名前 | 型 | 説明 |
| Execute | BOOL | コマンドは立ち上がりエッジで実行される。 |
| Position | LREAL | 目標の絶対位置。 |
| Velocity | LREAL | 目標位置への移動における最大速度(>0)。 |
| EndVelocity | LREAL | 目標位置に到達した後に維持される終端速度。 |
| Acceleration | LREAL | 加速度(≥0)。値が 0 の場合、System Manager の軸設定で標準加速度が使用される。 |
| Deceleration | LREAL | 減速度(≥0)。値が 0 の場合、System Manager の軸設定で標準減速度が使用される。 |
| Jerk | LREAL | ジャーク(≥0)。値が 0 の場合、System Manager の軸設定で標準ジャークが適用される。 |
| BufferMode | MC_BufferMode | |
| Options | ST_MoveOptions | 使用されるパラメータを含むデータ構造。通常は未接続のままでよい。 |
VAR_IN_OUT
| 名前 | 型 | 説明 |
| Axis | AXIS_REF | 軸を明確に識別するための軸データ構造。位置、速度、エラー状態など、現在の軸ステータスを含む他のパラメータも含まれる。 |
| 名前 | 型 | 説明 |
| InEndVelocity | BOOL | 目標位置に到達したとき TRUE となる。関数ブロックは新しいコマンドが発行されるまで「Busy」および「Active」のままになる。 |
| Busy | BOOL | コマンドが Execute で開始され、移動コマンドが処理されている間 TRUE。「Busy」が FALSE の場合、関数ブロックは新たな命令を受け付けられる状態となる。同時に「CommandAborted」または「Error」のどちらかがセットされる。 |
| Active | BOOL | コマンドが実行中であることを示す。コマンドがバッファリングされていた場合、実行中のコマンドが完了すると Active になる。 |
| CommandAborted | BOOL | コマンドが完全に実行できなかった場合 TRUE。軸が停止した場合、または現在のコマンドが別の Move コマンドに置き換えられた場合に発生。 |
| Error | BOOL | エラーが発生した場合 TRUE。 |
| ErrorID | UDINT | Error 出力がセットされたとき、そのエラー番号が格納される。 |
MC_MoveContinuousRelative
FB MC_MoveContinuousRelativeは、相対距離による位置決めを開始し、全移動経路にわたる軸の動きを監視するために使用されます。目標位置では一定の終端速度に達し、その速度が維持されます。目標位置に到達すると「InEndVelocity」出力が設定されます。それ以外の場合、「CommandAborted」出力、またはエラー発生時には「Error」出力が設定されます。
注意するのは、目標位置に到達すると、FB機能は完了し、軸は監視されなくなります。

VAR_INPUT
| 名前 | 型 | 説明 |
| Execute | BOOL | 立ち上がりエッジでコマンドが実行されます。 |
| Distance | LREAL | 位置決めに使用する相対距離。 |
| Velocity | LREAL | 「Distance」区間を移動する際の最大速度(>0)。 |
| EndVelocity | LREAL | 相対距離「Distance」完了後に維持される最終速度(>0)。 |
| Acceleration | LREAL | 加速度(>0)。値が0の場合、System Manager の軸設定にある標準加速度が使用されます。 |
| Deceleration | LREAL | 減速度(>0)。値が0の場合、System Manager の軸設定にある標準減速度が使用されます。 |
| Jerk | LREAL | ジャーク(>0)。値が0の場合、System Manager の軸設定にある標準ジャークが適用されます。 |
| BufferMode | MC_BufferMode | 軸がすでに別コマンドを実行中かどうかを評価します。MC_MoveContinuousRelative は現在のコマンド終了後に有効になり、現在のコマンドを中断します。現在→次のコマンドへの遷移も BufferMode により決まります。BufferMode を使うには常に2つ目のファンクションブロックが必要です。アクティブ中は、新しいパラメータで別のFBをトリガできません。 |
| Options | ST_MoveOptions | 追加の(あまり使われない)パラメータを含むデータ構造。通常この入力は未接続のままで問題ありません。 |
VAR_IN_OUT
| 名前 | 型 | 説明 |
| Axis | AXIS_REF | 軸を明確に識別するための軸データ構造。位置、速度、エラー状態など、現在の軸ステータスを含む他のパラメータも含まれる。 |
VAR_OUT
| 名前 | 型 | 説明 |
| InEndVelocity | BOOL | 目標位置に到達すると TRUE。以降、新しいコマンドが発行されるまで「Busy」と「Active」は TRUE のままになります。 |
| Busy | BOOL | コマンドが「Execute」で開始されると TRUE。また、移動コマンドが処理中の間は TRUE。「Busy」は、FBが次の呼び出しで新しいコマンドを受け付けられる状態になると FALSE。同時に「CommandAborted」または「Error」のどちらか一方がセットされます。 |
| Active | BOOL | コマンドが実行中であることを示します。コマンドが中断された場合、完了後に Active は TRUE になります。 |
| CommandAborted | BOOL | コマンドを最後まで実行できなかった場合に TRUE。これは、コマンドが別のムーブコマンドにより停止された(置き換えられた)こと、または現在のコマンドが別のムーブコマンドにより置き換えられたことを意味します。 |
| Error | BOOL | エラーが発生した場合に TRUE。 |
| ErrorID | UDINT | Error 出力がセットされた場合、このパラメータにエラー番号が入ります。 |
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の設定値で定速出力してることがわかります。
