ST言語での位置決め制御:多軸制御・ジョグ機能の追加とさらなる応用
1. はじめに
前回の記事では、ST言語を使用して、PLCopen Motion Control Function Blocks(MCFB)を活用した位置決め制御の基本 を解説しました。
今回はさらに発展させ、多軸制御、ジョグ(手動移動)、位置決めシーケンス制御の追加 を行います。
2. 多軸制御の導入
複数の軸を並列で制御 するには、MCFBインスタンスを複数作成し、それぞれの軸に割り当てる 必要があります。
2.1. 多軸制御の考え方
複数の軸を管理するため、配列を利用して各軸のパラメータやMCFBを管理 します。
PROGRAM MultiAxis_Positioning VAR (* 状態管理 *) State : INT := 0; (* 現在の状態 *) NextState : INT := 0; (* 次の状態 *) (* MCFBインスタンス(2軸) *) ServoPower : ARRAY[1..2] OF MC_Power; Home : ARRAY[1..2] OF MC_Home; MoveAbs : ARRAY[1..2] OF MC_MoveAbsolute; StopCmd : ARRAY[1..2] OF MC_Stop; (* パラメータ *) TargetPosition : ARRAY[1..2] OF REAL := [1000.0, 500.0]; Velocity : REAL := 500.0; Acceleration : REAL := 100.0; Deceleration : REAL := 100.0; (* 入出力信号 *) EmergencyStop : BOOL := FALSE; ErrorFlag : BOOL := FALSE; END_VAR (* 状態遷移 *) CASE State OF (* 初期化 *) 0: (* INIT *) FOR i := 1 TO 2 DO ServoPower[i].Enable := FALSE; Home[i].Execute := FALSE; MoveAbs[i].Execute := FALSE; StopCmd[i].Execute := FALSE; END_FOR; ErrorFlag := FALSE; NextState := 1; (* サーボON *) 1: (* ENABLE *) FOR i := 1 TO 2 DO ServoPower[i].Axis := i; ServoPower[i].Enable := TRUE; END_FOR; IF ServoPower[1].Status AND ServoPower[2].Status THEN NextState := 2; END_IF; (* 原点復帰 *) 2: (* HOMING *) FOR i := 1 TO 2 DO Home[i].Axis := i; Home[i].Execute := TRUE; END_FOR; IF Home[1].Done AND Home[2].Done THEN NextState := 3; END_IF; (* 位置決め待機(READY) *) 3: (* READY *) IF Home[1].Done AND Home[2].Done THEN FOR i := 1 TO 2 DO MoveAbs[i].Execute := FALSE; END_FOR; NextState := 4; END_IF; (* 位置決め実行 *) 4: (* MOVING *) FOR i := 1 TO 2 DO MoveAbs[i].Axis := i; MoveAbs[i].Position := TargetPosition[i]; MoveAbs[i].Velocity := Velocity; MoveAbs[i].Acceleration := Acceleration; MoveAbs[i].Deceleration := Deceleration; MoveAbs[i].Execute := TRUE; END_FOR; IF MoveAbs[1].Done AND MoveAbs[2].Done THEN NextState := 3; (* READY に戻る *) END_IF; (* 非常停止 *) 5: (* STOP *) FOR i := 1 TO 2 DO StopCmd[i].Axis := i; StopCmd[i].Execute := TRUE; END_FOR; IF StopCmd[1].Done AND StopCmd[2].Done THEN ErrorFlag := TRUE; NextState := 6; (* ERROR *) END_IF; (* エラーハンドリング *) 6: (* ERROR *) FOR i := 1 TO 2 DO ServoPower[i].Enable := FALSE; END_FOR; ErrorFlag := TRUE; (* 非常停止解除でリセット可能 *) IF NOT EmergencyStop THEN ErrorFlag := FALSE; NextState := 0; (* INIT へリセット *) END_IF; END_CASE; (* 状態の更新 *) State := NextState;
✅ 2軸を並行制御し、それぞれの目標位置に移動
✅ FOR
ループを活用し、各軸の処理を統一
3. ジョグ(手動移動)の追加
オペレーターが手動で移動する機能(ジョグ)を追加します。
3.1. ジョグ用のMC_MoveVelocity
MC_MoveVelocity
を使用して、連続的に移動するジョグ機能 を実装します。
VAR JogForward : BOOL := FALSE; (* 前進ボタン *) JogBackward : BOOL := FALSE; (* 後退ボタン *) MoveVel : ARRAY[1..2] OF MC_MoveVelocity; END_VAR (* ジョグ動作 *) FOR i := 1 TO 2 DO MoveVel[i].Axis := i; IF JogForward THEN MoveVel[i].Velocity := 200.0; MoveVel[i].Execute := TRUE; ELSIF JogBackward THEN MoveVel[i].Velocity := -200.0; MoveVel[i].Execute := TRUE; ELSE MoveVel[i].Execute := FALSE; END_IF; END_FOR;
✅ ジョグ用の MC_MoveVelocity
を使用し、ボタン入力で手動移動
✅ JogForward
や JogBackward
に応じて動作を制御
4. 位置決めシーケンス制御
複数の位置を順番に移動させるには、シーケンスを管理する状態を追加 します。
VAR SequenceStep : INT := 0; PositionList : ARRAY[1..3] OF REAL := [1000.0, 2000.0, 500.0]; END_VAR (* 位置決めシーケンス *) CASE SequenceStep OF 0: (* 初期位置 *) MoveAbs[1].Position := PositionList[1]; MoveAbs[1].Execute := TRUE; IF MoveAbs[1].Done THEN SequenceStep := 1; END_IF; 1: (* 次の位置へ移動 *) MoveAbs[1].Position := PositionList[2]; MoveAbs[1].Execute := TRUE; IF MoveAbs[1].Done THEN SequenceStep := 2; END_IF; 2: (* 最後の位置へ移動 *) MoveAbs[1].Position := PositionList[3]; MoveAbs[1].Execute := TRUE; IF MoveAbs[1].Done THEN SequenceStep := 0; END_IF; END_CASE;
✅ 複数の位置を順番に移動するシーケンスを実装
5. まとめ
機能 | 説明 |
---|---|
多軸制御 | 2軸のサーボモーターを並列に制御 |
ジョグ機能 | MC_MoveVelocity を使用し、手動で移動 |
位置決めシーケンス | CASE 文で複数の位置を順番に移動 |
ST言語とMCFBを活用することで、柔軟な位置決め制御が可能 になります。
次のステップとして、外部入力による制御やセンサーフィードバックを取り入れた最適化 にも挑戦してみましょう!