一往確認日記

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

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"