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を活用することで、柔軟な位置決め制御が可能 になります。
次のステップとして、外部入力による制御やセンサーフィードバックを取り入れた最適化 にも挑戦してみましょう!