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

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

ST言語の応用 多軸位置決め・ジョグ

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 を使用し、ボタン入力で手動移動
JogForwardJogBackward に応じて動作を制御


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