一往確認日記

有限会社伊藤ソフトデザインの代表をしています。

PlcAccessに型指定で値にアクセスできる様にしました

RubyでPLCのデバイスの読み書きができるPlcAccessでushort(符号なしWORD)型以外のアクセスができるようにしました。

github.com

ver 0.1.0

version 0.1.0では次の様にushort(符号なしWORD)型として数値を扱うことができました。
PLCのデータ単位はWORDになっているのでushort型の配列として、指定デバイスから順番に読み書きします。

plc["DM0", 10] = [0, 1, 2, ..., 9]
plc["DM0".."DM9"]  # => [0, 1, 2, ..., 9]

しかし他のshort(符号付きWORD)やint(符号付きDWORD)、uint(符号なしDWORD)、float、stringとして扱うのはまだできませんでした。
というのも良いメソッド名が思いつかなかったからで、ここに来て読み込みにはto_xxxで書き込みにはas_xxxとする案が浮かんで実装しました。

ver 0.1.3

PLCへの書込み

PLCにデータを書き込む際にRubyの型はゆるいので配列内の型は如何様にも解釈できます。

plc["DM0", 10] = [0, 1, 2, ..., 9]  # ushortとして書かれてしまう

本当はint型で書きたかったときにushortと解釈されて書き込まれてしまいます。
as_intを使用する事で配列内の数値は符号付きDWORDとして解釈しushort型の配列に変換します。
変換後の配列をPLCに書き込むということをしています。
as_short、as_uintも同様です。

plc["DM0", 20] = [0, 1, 2, ..., 9].as_int   # => [0, 0, 1, 0, 2, 0, ...., 9, 0] ushortに変換した配列を書き込む

文字列の場合もPLCに書き込む際はas_ushortを使用します。
asよりtoの方がしっくりくる感じですが、一貫性を持たせるためasにしました。
引数は格納する文字の長さ(Byte)で指定Byteサイズより短いとNULL文字が末尾に追加され、長いと指定バイト数までで切り捨てられます。
lengthよりWORDサイズで指定した方がいい気もしてます。気が向いたら付け加えるかもしれません。

plc["DM0, 8"] = "01234567".as_ushort(length: 8)  # => [0x3130, 0x3332, 0x3534, 0x3736]

PLCからの読込み

読込みはtoを使用します。

plc["MR0", 10].to_int # => [0, 1, 2, 3, 4]

ushortで10 WORD読み込まれますが、to_intで2 WORDずつint型に変換されて5このDWORDとして得られます。
他のto_short、to_ushort、to_floatなども同様です。

文字列の場合もushort型からString型に変換します。

plc["DM0", 10].to_string() # => "01234567"

plc_access 登録しました

plc_accessRubyGemsに登録しました。
RubyでPLCのデバイスにアクセスできます。

ソースコードはこちら。

github.com

これは Ladder Drive からPLCと通信する部分を抜き出したものになります。

LadderDriveでPLCに接続できますが、仮想的なPLCを目指したもので通信だけするには余計なものが多すぎるので通信だけに特化して軽量化しました。

MC ProtocolでPLCにアクセスするにはRubyでこの様に書くとアクセスできます。
非常に簡単です。

require 'plc_access'

plc = PlcAccess::Protocol::Mitsubishi::McProtocol.new host:"192.168.0.10"

plc["M0"] = true
plc["M0"]         # => true
plc["M0", 10]     # => [true, false, ..., false]

plc["D0"] = 123
plc["D0"]       # => 123
plc["D0", 10] = [0, 1, 2, ..., 9]
plc["D0".."D9"]   => [0, 1, 2, ..., 9]

LadderDriveもこちらを使用する様に変更予定です。

上の構成から下の構成へ

久しぶりにRubyGemsに登録しようとしたらマシンも変わったので ~/.gem/credentials ファイルをコピーして持ってこないとアップロードできなかったです。

irBoard Library for ESP32 をArduino IDEのライブラリーに登録しました

Lang-shipさんの記事を基に

lang-ship.com

Arduino IDEのライブラリーにirBoard Library for ESP32を登録しました。

ライブラリーから irboard で検索していただけると見つかります。
今まで irBoard Library for ESP32 をGithubからダウンロードやCloneしてLibディレクトリに配置するなど必要でしたが、ライブラリー一覧から検索して使う事ができる様になりました。

ESP32のWiFi設定をirBoardから行うExampleを追加しました。

ESP32のWiFi設定をirBoardから行うExample wifi_setup を追加しました。

irboard_esp32/examples/platformio_irboard_wifi_setup at master · ito-soft-design/irboard_esp32 · GitHub

今はM5Stick-Cのみの対応ですが、M5Unifiedを使用しているので他の機種にも対応させる予定です。(他の機種でもこのままで動きました。)

M5Stick-Cにwifi_setupを書き込むとNORMLモードであることとWiFi接続しているIPアドレスを表示します。
最初はWiFi設定されていないと思うので、0.0.0.0 になっていると思います。

Aボタンを1秒以上押してから離すとSETUPモードに切り替わります。 SETUPモードではAPモードになりますのでIPアドレスは 192.168.4.1 になります。

irBoardのプロジェクトがExample内にありますので、irBoardがインストールされているiOSバイスでダウンロードします。

irboard_esp32/examples/platformio_irboard_wifi_setup/WiFi setup.irboard at master · ito-soft-design/irboard_esp32 · GitHub

フォルダアプリでダウンロードフォルダからWiFi setup.irboard ファイルを選択するとirBoardで開く事ができます。

設定アプリのWiFi設定で"irBoard ESP32"のSSIDを選択して接続します。
パスワードには"password"を入力します。

irBoardに戻ってプロジェクトを実行します。

実行画面ではSSIDとパスワードが入力できる様になっているので接続したいWiFiの設定を入力します。
Applyボタンを押すとSSIDとPASSWORDがM5Stick-Cに設定され、NORMALモードに戻ります。
(誤操作防止のため少し長めに押す様になっています。)

設定したSSIDに接続が成功するとIPアドレスが表示されます。

WiFi設定は内部で記録されていますので、電源を入れ直しても設定したSSIDに接続されます。

この様な設定を行うのにirBoardが活用できます。

youtu.be

このExampleを作成するのに色々バグかが見つかってirBoard Library for ESP32を修正しています。

irBoard: 表示、非表示をデバイスで切り替える際にうまく切り替わらないのを修正しました。

irBoardで非表示をデバイスで切り替える事ができますが、いつの間にか動かなくなっていた様で申し訳ありませんでした。

動作は3番のチュートリアルで確認できます。 M1の非表示/表示ボタン(Visible/Invisible)を押すと隠れていた部品が表示される様になるのですが、一度表示してもう一度消すとその後表示されなくなるなどうまく働いていませんでした。

修正してVersion 2.2として申請しています。(Lite版を除いて現在公開になっています)公開されました。

Version 2.2ではこのほかに値部品で入力中にフリックを使用してページ移動すると、画面サイズが変になってしまうのを修正しています。

これは編集中にキーボードで値部品が隠れない様に縮尺を変えて大きさや位置を調整しているのですが、その調整がそのままになってしまってサイズが変になってしまっていました。
キー入力ができる状態であれば改行キーを押すと戻りますが、入力できない場合はなかなか元に戻せない状態でした。
これをページ移動で元に戻す様に修正しています。

もう一点値部品にパスワードなどを入力する際に入力した内容が見えなくなる 秘密 設定を追加しています。

こちらで言及していた内容です。

itosoft.hateblo.jp

公開になりましたら
公開になりましたのでバージョンアップしてみて下さい。

値にシークレット機能を追加しています。

irBoardの値部品でパスワードなどの文字を隠したい場合時に使える様にシークレット表示ができる様に追加しています。

次のリリースには組み込みたいと思っています。