本記事はラダー言語を主に使用する電気技術者を対象として記述しています。
はじめに
その場しのぎのST言語プログラミング その2として下記について記事にします。
- シーケンス命令でのパルスキャッチの記述方法
- シーケンス命令でのタイマー記述方法
1.シーケンス命令でのパルスキャッチの記述方法
シーケンス命令でパルスの立上りを検出するにはLDP(EN,s)命令を使用します。
ディスティネーションを持たないので戻り値を使用する格好になります。
ENの実行条件には"TRUE"を記述してください。
sで指定したビットの変化を捉えます。
例
ラダープログラム
│ X0 Y0 │
├┤ ↑ ├───────────────────────────────○────┤
│ │
//ST代入文
Y0 := LDP(TRUE,X0);
2.シーケンス命令でのタイマー記述方法
あれこれ説明するより、回路例を示します。
1)~3)のプログラムはt_1の接点出力をランプの点滅に使用するような交番タイマープログラムです。
1)ラダープログラムの例
ラベル名 データ型 クラス
t_1 タイマ VAR
t_2 タイマ VAR
ラダープログラム
│ t_2 │
(0)├┤ / ├──┬────────────────────────────────[OUT t_1 K50 ]┤
│ │ │
│ │ t_1 │
│ └┤ ├──────────────────────────[OUT t_2 K50 ]┤
│ │
2)IF文で記述したST言語プログラムの例(非推奨)
ラベル名 データ型 クラス
t_1 タイマ VAR
t_2 タイマ VAR
STプログラム
IF NOT t_2.S THEN
OUT_T(TRUE,t_1.C,50);
IF t_1.S THEN
OUT_T(TRUE,t_2.C,50);
END_IF;
ELSE;
OUT_T(FALSE,t_1.c,0);
OUT_T(FALSE,t_2.c,0);
END_IF;
ラダーとの相違点
- タイマーラベルを記述する際は接点なのかコイルなのか等、メンバにて明示するのが無難
- タイマーをリセットさせる文を記述する必要がある
ただし、同じタイマーラベルを指定した命令をプログラムの複数箇所に記述するような書き方は推奨されません。
IF文内ではタイマーの実行条件を制御し、END_IF;の後にタイマー実行文を記述するのが良いでしょう。
ちなみにマニュアルによると、実行条件TRUEで同じタイマーラベルを指定した命令をプログラムの複数箇所に記述すると記述した個数倍の速さでタイマーがカウントされるそうです。
3)シーケンス命令の実行条件で制御したST言語プログラムの例
ラベル名 データ型 クラス
t_1 タイマ VAR
t_2 タイマ VAR
STプログラム
OUT_T(NOT t_2.s,t_1.c,50);
OUT_T(t_1.s,t_2.c,50);
ラダーとの相違点は2)と同じく
- タイマーラベルを記述する際は接点なのかコイルなのか等、メンバにて明示するのが無難
- タイマーをリセットさせる文を記述する必要がある
タイマー命令の実行条件にタイマー接点を直接記述するとこのような書き方になります。
タイマー命令は常に駆動状態にあり、実行条件が変化することにより動作が変化します。
ラダープログラムの場合は回路ブロックとしてまとめる為に2行目もt_2接点にぶら下げる格好で記述しましたが、ST言語の場合は回路ブロックを意識する必要は無いので、2行目に関して
OUT_T(NOT t_2.s AND t_1.s,t_2.c,50);
では無く
OUT_T(t_1.s,t_2.c,50);
と記述しました。
おわりに
ラダープログラムの感覚の延長で記述すると思い通りに動かないタイマーやパルスについて記事にしました。
- 命令が戻り値を使用するのかディスティネーションに結果を返すのかよく確認する
- ディスティネーションをOFFするときに命令が駆動状態にないといけない
この部分が理解できれば他の命令にも応用が利くと考えています。
いまのところ、私の場合、メインの機械制御ファンクションブロックはラダーで組んで、その呼び出しはST言語で組むと云うスタイルになっています。
今後、機械制御ファンクションブロックの部分もST言語で組むことを検討していますが、その際はその場しのぎというわけでは無く、CASE文を活用した状態遷移の管理が必要と考えています。