一往確認日記 |
2019年04月22日 [長年日記]
_ ラダーをRubyに置き換え - PLCのRuby言語コントロールユニット(2)
PLCのソフトをラダーの代わりにRubyで書けたらという企画です。
実際にRubyで置き換えた場合に、同時にいろんな事をさせようとすると排他処理を考える必要があります。
別々に動作している間でデータの塊をやり取りするときに、途中で値が変わってしまうと、予想もしていなかった動作になることがしばしばあります。
Rubyの場合はこの点が難しいところではないかと考えています。
ラダーの場合は順番に進んでいくのでスキャン単位で考えるとデータの塊が途中で変わってというのはあまり意識しなくてもいいところは利点です。
そういうのは後々考えるとしてRubyだとどんな感じになるかなというのを考えていきます。
単純にスイッチとランプを接続した回路
単純にスイッチを押している間ランプが点灯する回路で考えます。
入出力デバイスX0, Y0は、Rubyでそのままx0, y0という変数としてアクセスできると仮定して、単純な代入になります。
y0 = x0
自己保持回路
ONスイッチでモーターが回転して、OFFスイッチで停止する回路で考えます。
Rubyは論理演算ができるので、||
(or) と &&
(and) 演算子でそのまま表現できます。
y1 = (x1 || y1) && !x2
論理演算で置き換えればラダーそのままをRubyに置き換えられます。 ただ、デバイスが3つなのでまだ分かりますが、デバイスが増えてきたらラダーの方が断然分かりやすそうですね。
他の場合もこの置き換えで考えましょう。
シリンダーセンサー
B接点は!
(not)で表せますが、
はて、センサー異常はタイマーを使ってますが、Rubyではどうしましょうか…
次回への宿題とします。