【ST言語ことはじめ】マスターコントロールを使ってみる

## はじめに

この記事では、モーションコントロール（MC）の利用例をラダー図とST言語で比較します。モーションコントロールは、PLCでのモーション制御を容易にするための機能であり、さまざまなアプリケーションで活用されています。

## 使用機材

|   |機種など   |
|:---:|------|
|PLC  |Q02CPU, QX41, QY41P, Q62P, Q38B    |
|アプリ  |GX Works 2    |

I/O割り付けは\[こちら\](https://qiita.com/so2/items/0f0cab2e324179718b89 "I/O割り付け表")を参照してください。

## ラダー図とST言語での比較

### サンプルプログラムの動作

起動後にランプ０が常時点灯します。ボタン1が押されている間、ランプ１が点灯します。その後、ボタン2が押されると、ランプ２が点灯します。ただし、ボタン２はボタン１がオンの状態でないと機能しません。

### ラダー図の例

```batch:ラダー図
  (+)                                               (-)
   |    X1                                  MC N0 M0   |
   +----| |----------------------------------(    )----+
   |                                                   |
N0 = M0                                                |
   |                                                   |
   |   SM400                                  Y71      |
   +----| |----------------------------------(    )----+
   |                                                   |
   |    X2                                  MC N1 M1   |
   +----|↑|---+------------------------------(    )----+
   |          |                                        |
   |    M1    |                                        |
   +----| |---+                                        |
   |                                                   |
N1 = M1                                                |
   |                                                   |
   |   SM400                                  Y72      |
   +----| |----------------------------------(    )----+
   |                                                   |
   |                                         MCR N1    |
   +-----------------------------------------(    )----+
   |                                                   |
   |                                         MCR N0    |
   +-----------------------------------------(    )----+
   |                                                   |
   |   SM400                                  Y70      |
   +----| |----------------------------------(    )----+
   |                                                   |
```

上記のラダー図では、MC1の実行はMC0の状態に依存し、MC0がオンでない場合はMC1も実行されません。具体的には、MC0がオンでなければMC1の条件が満たされず、MC1の出力も実行されません。
N0とN1は入れ子構造になっている上、一箇所にまとまっているため、最も小さい番号のMCR N0だけを残してMCR N1を削除しても同様の動きとなる。

:::note info
SM400 : RUN中は常にオンとなる特殊リレー。
:::

### ST言語の例

```st
MC(X1, 0, M0);
    Y71 := TRUE;

    MC(X2, 1, M1);
        (* 空っぽの回路。ラダー図に合わせてMCの入れ子状態にするため *)
    MCR(TRUE, 1);

    IF M1 THEN
        Y72 := TRUE;
    END_IF;
            
MCR(TRUE, 0);

Y70 := TRUE;
```

ST言語のコードでは、同様の動作をST言語で記述しています。MC命令を使用してモーションコントロールを実行し、その後に各出力を制御します。

:::note info
MC(入力デバイス, 深度, 出力デバイス) : 入力デバイスと出力デバイスはビットデバイス。深度は後述のMCRとのペアリングのための識別番号
:::
:::note info
MCR(TRUE, 深度) : マスタコントロールの解除命令。MCからMCRまでの間がマスターコントロールの範囲となる。深度に使用した番号でペアを識別する。
:::
:::note warn
MCの内部でSET構文を用いてデバイスの状態を設定した場合は、MCの状態とは独立して設定を保持します。
```st
MC(X2, 2, M2);
    SET(M2, Y73); (* MCがOFFになってもY73のデバイスはONのまま *)

    Y7４ := TRUE;　　(* MCがOFFになるとY74のデバイスも連動してOFF *)
MCR(TRUE, 2);
```
:::

## まとめ

この記事では、ラダー図とST言語でのモーションコントロールの利用例を比較しました。どちらの方法も同じ動作を実現することができますが、ラダー図はグラフィカルな表現であり、ST言語はテキストベースの表現であるため、利用者の好みやプロジェクトの要件に応じて選択することが重要です。