ST言語での位置決め制御:PLCopen準拠のMCFBを活用した状態遷移設計
1. はじめに
PLC(プログラマブル・ロジック・コントローラ)では、モーション制御の標準規格であるPLCopen Motion Control Function Blocks(MCFB) を使用することで、異なるメーカーのPLCでも統一的なモーション制御が可能になります。
本記事では、MCFBを活用して、ST言語で「初期設定 → 軸始動 → 原点復帰 → 位置決め制御」までの一連の流れを実装 します。
インターロック(非常停止・エラー処理)も考慮し、安定した制御 を実現します。
2. 位置決め制御の全体フロー
PLCopen準拠の位置決め制御は、以下の手順で実行されます。
- 初期設定(変数の定義、制御準備)
- 軸始動(MC_PowerでサーボON)
- 原点復帰(MC_Homeで基準位置を設定)
- 位置決め制御(MC_MoveAbsoluteで目標位置へ移動)
- 非常停止・エラー処理(MC_Stopを活用)
3. MCFB(Motion Control Function Blocks)の活用
PLCopenのモーション制御関数ブロック(MCFB)を活用することで、
軸制御を簡潔に記述 できます。
MCFB関数 | 機能 |
---|---|
MC_Power |
サーボON/OFF |
MC_Home |
原点復帰 |
MC_MoveAbsolute |
絶対位置指定での移動 |
MC_MoveRelative |
相対位置指定での移動 |
MC_Stop |
緊急停止 |
4. ST言語による位置決め制御の実装(状態遷移あり)
PROGRAM Positioning_Control VAR (* 状態管理 *) State : INT := 0; (* 現在の状態 *) NextState : INT := 0; (* 次の状態 *) (* MCFBインスタンス *) ServoPower : MC_Power; (* サーボON/OFF *) Home : MC_Home; (* 原点復帰 *) MoveAbs : MC_MoveAbsolute; (* 絶対位置移動 *) StopCmd : MC_Stop; (* 停止 *) (* パラメータ *) TargetPosition : REAL := 1000.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 *) ServoPower.Enable := FALSE; Home.Execute := FALSE; MoveAbs.Execute := FALSE; StopCmd.Execute := FALSE; ErrorFlag := FALSE; NextState := 1; (* サーボON *) 1: (* ENABLE *) ServoPower.Axis := 1; (* 1軸目を制御 *) ServoPower.Enable := TRUE; IF ServoPower.Status THEN NextState := 2; END_IF; (* 原点復帰 *) 2: (* HOMING *) Home.Axis := 1; Home.Execute := TRUE; IF Home.Done THEN NextState := 3; END_IF; (* 位置決め待機(READY) *) 3: (* READY *) IF Home.Done THEN MoveAbs.Execute := FALSE; NextState := 4; END_IF; (* 位置決め実行 *) 4: (* MOVING *) MoveAbs.Axis := 1; MoveAbs.Position := TargetPosition; MoveAbs.Velocity := Velocity; MoveAbs.Acceleration := Acceleration; MoveAbs.Deceleration := Deceleration; MoveAbs.Execute := TRUE; (* 目標位置到達の判定 *) IF MoveAbs.Done THEN MoveAbs.Execute := FALSE; NextState := 3; (* READY に戻る *) END_IF; (* 非常停止 *) 5: (* STOP *) StopCmd.Axis := 1; StopCmd.Execute := TRUE; IF StopCmd.Done THEN ErrorFlag := TRUE; NextState := 6; (* ERROR *) END_IF; (* エラーハンドリング *) 6: (* ERROR *) ServoPower.Enable := FALSE; ErrorFlag := TRUE; (* 非常停止解除でリセット可能 *) IF NOT EmergencyStop THEN ErrorFlag := FALSE; NextState := 0; (* INIT へリセット *) END_IF; END_CASE; (* 状態の更新 *) State := NextState;
5. コードのポイント
- PLCopenのMCFB (
MC_Power
,MC_Home
,MC_MoveAbsolute
,MC_Stop
) を活用 - 状態遷移(State Machine)を使用し、各プロセスを明確に
- 非常停止(
EmergencyStop
)やエラー処理を組み込み、安全性を向上 - 原点復帰 (
MC_Home.Done
) が完了したらREADY
ステートへ遷移 - 目標位置到達 (
MC_MoveAbsolute.Done
) を確認し、次の動作を決定
6. 位置決め制御の全体フロー(状態遷移)
状態 | 処理内容 |
---|---|
INIT | 変数初期化、制御準備 |
ENABLE | MC_Power を使いサーボON |
HOMING | MC_Home を実行し原点復帰 |
READY | 位置決め準備完了(待機状態) |
MOVING | MC_MoveAbsolute で目標位置へ移動 |
STOP | MC_Stop により停止処理 |
ERROR | 異常発生時の処理 |
7. まとめ
項目 | 内容 |
---|---|
MCFBを活用 | MC_Power , MC_Home , MC_MoveAbsolute , MC_Stop を使用 |
状態遷移(State Machine) | フローを明確にし、制御の安定性を向上 |
インターロック | 非常停止 EmergencyStop で安全対策を実装 |
エラーハンドリング | ERROR ステートで異常時の処理を管理 |
PLCopenのMCFBを活用することで、より安定したモーション制御 が可能になります。
このコードをベースに、多軸制御やジョグ機能の追加など、さらなる応用にも挑戦してみましょう!