追記

一往確認日記


2019年10月06日 [長年日記]

_ * [ruby][ladder_drive] RubyWorld Conference 2019でLadder Driveについて講演します

11月7日と8日に島根県立産業交流会館 「くにびきメッセ」で開催されるRubyWorld Conference 2019で講演することになりました。

Ladder Driveについて話せたらなと思いスピーカーとして応募していました。
結果が来た時は久しぶりのどきどき感でファイルを開くのを少しためらいましたが、ありがたいことに採択されました。

「製造業のIoTを始めるためのLadder Drive」という題でLadder Driveについて話させていただきます。

島根は初めてで、交通手段確保を簡単に考えてましたが、なかなかに大変でした。

プログラム | RubyWorld Conference 2019


2019年07月31日 [長年日記]

_ 秋田ICTフェア2019にLadder Driveを出展

8月2日、3日と秋田駅東の秋田拠点センターアルヴェきらめき広場にて 開催される「秋田ICTフェア2019」にLadder Driveを出展します。

【公式】秋田ICTフェア2019特設サイト

Ladder Driveは紆余曲折ありましたが、最近はIoTハブという位置付けで開発しています。

今回の展示ではRaspberry PiでLadder Driveを動作させて、装置(PLC)から情報を取得し、アラーム発生や装置の運転、停止をスマホに通知したり、定期的にデータを送りグラフ(Ambient)やスプレッドシートに記録するというデモをします。

最初環境構築がありますが、それさえ済んでしまえば設定ファイルの変更のみで済む様になっています。

Ladder Driveのデモは今回が初めてになります。
3日は竿灯の開催日でもあり、ちょうどこのタイグで秋田に来られるという方がいましたらお立ち寄りください。

Ladder Driveの情報を確認するのにirBoardを用いますのでirBoardについても興味がありましたらお越しいただければと思います。

GitHub - ito-soft-design/ladder_drive

Ambient – IoTデーター可視化サービス

irBoard - トップ


2019年07月02日 [長年日記]

_ ラトックシステムのUSBシリアル変換器をMacで使用できなくなっていた

ラトックシステムのUSBシリアル変換器 REX-USB60F を長年使用していてMacでも使用できていましたが、いつの間にか使用できなくなっていました。

ドライバーはこちらでダウンロードできるので、再インストルーしてみました。

REX-USB60F MacOS X 10.9.x~10.11.x用ドライバー

しかし、認識せず。

今使っているのは macOS Mojave 10.14 なので10.11.xまでとあるのでそのせいかなとも思いましたが、何が起こっているか分からないので、手動でドライバーをロードしてみます。

$ cd /Library/Extensions
$ sudo kextload FTDIUSBSerialDriver.kext
/Library/Extensions/FTDIUSBSerialDriver.kext failed to load - (libkern/kext) system policy prevents loading; check the system/kernel logs for errors or try kextutil(8).

とエラーがでています。

システム環境設定のセキュリティとプライバシーを開くとブロックされている旨の表示がありますで、許可を押します。

Image from Gyazo

その後もう一度ロードすると無事にロードできてデバイスも認識されました。

$ sudo kextload FTDIUSBSerialDriver.kext
$ ls /dev/tty.usb*
/dev/tty.usbserial-00006214

ラトックシステム USBシリアルコンバータ REX-USB60F


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

_ 距離測定プログラム - M5STACKでIoT水位計 (4)

M5Stackで田んぼの水位を計測する企画です。

実は17日(土)から実戦投入しています。
写真などは追々掲載することとして、距離を測定する部分について書いていきます。

Grove製の超音波センサーを使っていますが、そのものずばりのGrove Ultrasonic Rangerというライブラリーがあります。

Arduino IDEのスケッチメニューからライブラリーをインクルード > ライブラリの管理... を選択します。

ライブラリの管理を開く

Grove Ultrasonicで検索すると該当ライブラリーが見つかりますので、インストールボタンでインストールします。

Grove Ultrasonic Rangerをインストール

このライブラリーを使うと下の様にMeasureInCentimeters()で簡単に距離が測定できます。

実行しているのがこちらになります。

プログラムを実行し距離を表示している様子


M5Stackを実機に入れてしまったので、実験用に2台目を購入しました。

M5Stack Basic


Grove-超音波距離測定センサー


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

_ 読書 : コンビニ人間

コンビニ人間 | 村田 沙耶香 |本 | 通販 | Amazon

冒頭はコンビニ店員の手際の良い思考が描かれていて、なるほどそういう風に考えながら仕事してるんだと思っていたら、急に展開が変わってどうなるんだというのがずっと続いて、どんどん先が読みたくなり一気に読めてしまいました。

本日のツッコミ(全1件) [ツッコミを入れる]

_ 池澤一廣 [「殺人出産」も]


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)

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


2019年04月29日 [長年日記]

_ 実際に試してみる。 - PLCのRuby言語コントロールユニット(5)

実際にRubyで制御することを試してみます。

どの様にしようかな…と考えるまでもなく、LadderDriveがあるので(やっててよかった)それとirBoardを組み合わせて試してみます。
(ここでは安全と速度については無視して進めます)

まずは結果から。 こんな感じで制御できています。
X0を押すとY0がONになり、X1を押すとY1がONになりX2を押すとY1がOFFになります。
右側にある白い画面でRubyプログラムを走らせています。

構成図

構成図

Mac Book Proでsequene_1.rbというプログラムを実行してPLCを制御します。 中身は動画で確認した動きになる様にこうなってます。(今までなんども出てますね)

require './plc_base'

sequence do |plc|
  plc.y0 = plc.x0
  plc.y1 = (plc.x1 || plc.y1) && !plc.x2
end

y0 = x0と書かせたかったのですが、plc.y0 = plc.x0で妥協しています。 この様に書けるのはplc_base.rbで頑張ってるからです。
それ以上にRubyが柔軟に書ける様な仕組みを持っているためですね。

irBoardでスイッチとランプの代わりをさせています。
実際に配線したりするのは大変なので便利です。
無料のLite版で試せますので、試したい方は使ってみてください。  

手順はこちらに書いています。(不足があれば追記します)

https://github.com/ito-soft-design/thought_of_ladder_to_ruby/blob/master/README_JA.md

irBoard Lite


2019年04月27日 [長年日記]

_ Timerの置き換えからRubyらしい考え方 - PLCのRuby言語コントロールユニット(4)

PLCのソフトをラダーの代わりにRubyで書けたらという企画です。

Rubyらしい置き換え

それではどうだったら考えやすいかと切り替えて考えます。

Rubyはオブジェクト指向言語ですから、シリンダーセンサーというオブジェクトとしてとらえます。

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

csというのがシリンダーセンサーオブジェクトです。 これはCylinderSensorというクラスから実態化したものです。 クラスとは何?ということになりますが、ここでは無視して進みます。 x4とx5のセンサー入力があって、5秒のタイムアウトが絡んでいる程度の認識でいいです。

m4はシリンダーが動作状態かどうかということですからcs.moved?で動作状態かどうか問い合わせて代入しているということになります。 m5、m4も同様です。

実際にmoved?やreturned?やerror?の中身はどうなっているか?ということは知る必要がなく、CylinderSensorクラスの中に隠蔽していて私がごりごり頑張ればいいだけの事です。(前回の例の様に分かりにくくにっているかもしれません)

ファンクションブロックの様なものと考えてもらえればなんとなくお分かりかと思います。


2019年04月26日 [長年日記]

_ Timerの置き換えからRubyらしい考え方 - PLCのRuby言語コントロールユニット(3)

前回はタイマーの置き換えで詰まってしまいました。

シリンダーセンサー

Image from Gyazo

Timerクラスを作ってブロックを使ってこんな感じでしようか? やっぱりラダーの方が簡単ですね。

t6 = Timer.new(5)

m4 = x4 && !x5
m5 = x5 && !x4
if (x4 && x5) || (!x4 && !x5)
  t6.start_if_not_started{|canceled|
    m6 = true unless canceled
  }
else
  t6.cancel
  m6 = false
end

タイマーの仕様を変えてちょっとスッキリした様なしない様な…

t6 = Timer.new(5)

m4 = x4 && !x5
m5 = x5 && !x4
t6 = (x4 && x5) || (!x4 && !x5)
m6 = t6.fired?

いきなり暗礁に乗り上げてしまいました。


2019年04月22日 [長年日記]

_ ラダーをRubyに置き換え - PLCのRuby言語コントロールユニット(2)

PLCのソフトをラダーの代わりにRubyで書けたらという企画です。

実際にRubyで置き換えた場合に、同時にいろんな事をさせようとすると排他処理を考える必要があります。
別々に動作している間でデータの塊をやり取りするときに、途中で値が変わってしまうと、予想もしていなかった動作になることがしばしばあります。
Rubyの場合はこの点が難しいところではないかと考えています。

ラダーの場合は順番に進んでいくのでスキャン単位で考えるとデータの塊が途中で変わってというのはあまり意識しなくてもいいところは利点です。

そういうのは後々考えるとしてRubyだとどんな感じになるかなというのを考えていきます。

単純にスイッチとランプを接続した回路

単純にスイッチを押している間ランプが点灯する回路で考えます。

Image from Gyazo

入出力デバイスX0, Y0は、Rubyでそのままx0, y0という変数としてアクセスできると仮定して、単純な代入になります。

y0 = x0

自己保持回路

ONスイッチでモーターが回転して、OFFスイッチで停止する回路で考えます。

Image from Gyazo

Rubyは論理演算ができるので、|| (or) と && (and) 演算子でそのまま表現できます。

y1 = (x1 || y1) && !x2

論理演算で置き換えればラダーそのままをRubyに置き換えられます。 ただ、デバイスが3つなのでまだ分かりますが、デバイスが増えてきたらラダーの方が断然分かりやすそうですね。

他の場合もこの置き換えで考えましょう。

シリンダーセンサー

Image from Gyazo

B接点は! (not)で表せますが、
はて、センサー異常はタイマーを使ってますが、Rubyではどうしましょうか…

次回への宿題とします。