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"