TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

ST言語応用 MCFBを利用した基本的な位置決めまで

ST言語での位置決め制御:PLCopen準拠のMCFBを活用した状態遷移設計

1. はじめに

PLC(プログラマブル・ロジック・コントローラ)では、モーション制御の標準規格であるPLCopen Motion Control Function Blocks(MCFB) を使用することで、異なるメーカーのPLCでも統一的なモーション制御が可能になります。

本記事では、MCFBを活用して、ST言語で「初期設定 → 軸始動 → 原点復帰 → 位置決め制御」までの一連の流れを実装 します。
インターロック(非常停止・エラー処理)も考慮し、安定した制御 を実現します。


2. 位置決め制御の全体フロー

PLCopen準拠の位置決め制御は、以下の手順で実行されます。

  1. 初期設定(変数の定義、制御準備)
  2. 軸始動(MC_PowerでサーボON)
  3. 原点復帰(MC_Homeで基準位置を設定)
  4. 位置決め制御(MC_MoveAbsoluteで目標位置へ移動)
  5. 非常停止・エラー処理(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を活用することで、より安定したモーション制御 が可能になります。
このコードをベースに、多軸制御やジョグ機能の追加など、さらなる応用にも挑戦してみましょう!