«前の日記(2019年04月29日) 最新 次の日記(2019年05月14日)» 編集

一往確認日記


2019年05月08日 [長年日記]

_ シリンダーの例。 - PLCのRuby言語コントロールユニット(6)

PLCのソフトをラダーの代わりにRubyで書けたらという企画です。
今までの内容はこちらでご覧いただけます。

前回は簡単な入力がそのまま出力になったり、自己保持回路で試しました。

実際に試してみる。 - PLCのRuby言語コントロールユニット(5) - 一往確認日記(2019-04-29)

今回はシリンダー動作に関する回路で考えてみます。

前回同様に結果から

Rubyでも意図した様に動作させる事ができています。
後半に実際のタッチパネルでの使用を意識した配置で試しています。

Timerの置き換えからRubyらしい考え方 - PLCのRuby言語コントロールユニット(4) - 一往確認日記(2019-04-27)

でRubyで表現する場合に、シリンダーオブジェクトとして次の様に表現したらということを書いていました。

cs = CylinderSensor.new(x4, x5, 5)
m4 = cs.moved?
m5 = cs.returned?
m6 = cs.error?

今回はそれを実践したことになります。

最初にsetupでシリンダーを動作させるソレノイドとシリンダーセンサーのオブジェクトを生成しています。
SingleSolenoidとCylinderSensorクラスが肝となっています。
この中身については全く知る必要がなく使い方が分かっていれば良いです。

setup do |plc|
  sol = SingleSolenoid.new out:plc.dev.y0
  plc.add_device sol:sol
  cyl_sen = CylinderSensor.new solenoid:sol, moved_sensor:plc.dev.x2, org_sensor:plc.dev.x3, timeout:3.0
  plc.add_device cyl_sen:cyl_sen
end

plc.add_device sol:solで登録しているため以降はplc.solでソレノイドを扱う事ができる様になっています。

実際に制御する方ですが、plc.solの自己保持回路でx0でONさせてx1でOFFさせる様にしています。
センサーの状態を(4)で提案した様にメソッドで得られる様になっていて、m0〜m2に取り込んでいます。

sequence do |plc|
  plc.sol = (plc.x0 || plc.sol) && !plc.x1
  plc.m0 = plc.dev.cyl_sen.moved?
  plc.m1 = plc.dev.cyl_sen.returned?
  plc.m2 = plc.dev.cyl_sen.error?
end

こちらにもう少し詳しく説明しています。

thought_of_ladder_to_ruby/README_JA.md at master · ito-soft-design/thought_of_ladder_to_ruby · GitHub

今後は…

シリンダーが増えても下の様にどんどん登録していけるはずですし、

  plc.add_device sol0:SingleSolenoid.new(out:plc.dev.y0)
  plc.add_device sol1:SingleSolenoid.new(out:plc.dev.y1)
  plc.add_device sol2:SingleSolenoid.new(out:plc.dev.y2)
  plc.add_device sol3:SingleSolenoid.new(out:plc.dev.y3)

色んな役割をするクラスを追加して行けば良いはずです。
後々もっと深く考えてみます。