一往確認日記

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

本日1月15日より3月31日まで、irBoard関連製品が半額に!

本日1月15日より3月31日まで、irBoard関連製品半額セールを開催します!
お安くirBoardを手に入れるチャンスです。この機会をぜひご活用ください。

irBoardはiOSアプリで、iPhoneiPadを使用しFA装置のタッチパネルデバイスとして使用する事ができます。
普段お使いのPLC向けタッチパネルと同様に通信でデバイスのON/OFFやデータの読み書きができます。

価格などの詳細はこちらから! irboard.itosoft.com

📱 Lite版で体感できる魅力

FA装置に固定されたタッチパネルから解放され、持ち歩けるタッチパネルの利便性をぜひ体感してみてください。
irBoard Lite版はほぼ全ての機能を無料で試すことができます。ぜひ手に取ってお確かめください。

💡IoTにも

irBoard Liteのアプリ内アイテム「IoTデバイス接続の解除」は特にお安くなっており、通常の半額以下の3,980 円で提供します。
ESP32マイコンのタッチパネルとしても活用できますのでぜひご検討ください。

パーサとスキャナの学習 (1)

ラダーを生成するというのは前のブログでもよく読まれていて関心がある内容なんだなと感じてます。

ラダーの自動生成(1) - 一往確認日記(2016-03-30)

個人的にはerbでテンプレートを作ってデバイスを埋め込むということを今だにしています。これについては改めて記事にできたらと思っています。

本当は自由にラダーを生成できる様になればいいのですが、今のところそんなところまでできる知識はありません。
Rubyで書いてラダーに変換してくれるという様なことができたらな〜というのはかなり前から思っているのですが糸口をつかめないままです。

CPUのアセンブラでは順番は関係なくニーモニックを書けますが、ラダーのニーモニックは自由に書けるというわけではなくて、ある塊をブロックとして扱ったりするので文法的な事も意識しないと正しく書けないです。
(順番は関係なくニーモニックを書けますというのはプログラムが正しく動くという事ではなくてエラーが出ないという意味で、ラダーの場合は順番が違うとエラー(回路が構成できない)が出るという意味です。)

正しく書くためにコンパライ的なことが必要になるのではないかと考えてます。

コンパイラは深いところまでの知識はなくて、青木峰郎さんの書かれた解説を読み始めました。

i.loveruby.net

GX WorksやKV STUDIOなどで書き出したラダーのニーモニックから木構造が作れるところまでできたらなというのが最初の目標です。

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"

irBoard賞とversion 2.2.1

ヒーローズ・リーグ 2023 の決勝が12月2日に行われirBoard賞として「どこでも万歩計 」を選ばせていただきました。

irboard.itosoft.com

また、irBoardがversion 2.2.1 にアップデートになっています。お使いの方はバージョンアップしてみてください。

irboard.itosoft.com

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ディレクトリに配置するなど必要でしたが、ライブラリー一覧から検索して使う事ができる様になりました。