«前の日記(2017年05月11日) 最新 次の日記(2017年05月25日)» 編集

一往確認日記


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

_ LadderDriveでPLCデバイスの読み書きがものすごく簡単になりました。

LadderDriveというのは、各種PLCがメーカーや機種毎にプロジェクトデータが異なるため互換性がなく、移植するのが大変なのを解決しようとして進めてましたが、本来の目的での進行は一時停止状態です。

LadderDrive

代わりに、PLCデバイスの読み書きツールとして充実してきました。

前回のLadder Driveでデバイスの読み書き
ではRuby言語で下の様にプログラムを書いてデバイスにアクセスしていました。

require 'ladder_drive'

@protocol = LadderDrive::Protocol::Mitsubishi::McProtocol.new host:"192.168.0.10"

puts @protocol.get_bit_from_device("M1000")

@protocol.get_bit_from_deviceなんて長ったらしいので、後になるとメソッド名を忘れてしまってなんだっけとなってしまうことは明白です。

実はこれを書きながらアイディアが浮かんでいました。
それから2ヶ月以上経ってようやく実装しました。

PLCに接続するまでは変わりなく、三菱電機製のPLCにMCプロトコルで接続する場合は、IPアドレスを指定し下の様になります。(ここまでは一緒ですね)

require 'ladder_drive'

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

ここからが本題です。
ladder_drive バージョン 0.4.0 からはデバイスにアクセスするのに配列の様にアクセスできます。
配列だと添え字を使いますが、デバイス名で指定します。*1

この様に直感的でわかりやすくなっています。

plc["D0"] = 123

ブロック転送も簡単です。
例えば0クリアーしたい場合(ラダーだとFMOVなどを使用するシーン)は下の様にかけます。

plc["D0", 10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

D0から10個に0を埋めています。

rubyは配列の掛け算で同じ値を繰り返し追加できるので、10000個になっても楽勝です。
Dメモリーを全部0クリアーさせるということも楽勝です。*2

n = 10000
plc["D0", n] = [0] * n

実際は一度に送信できる個数が決まっていますが、内部でせっせと小分けにして繰り返し通信してますので、読み込みの際に分割の事は全く気にする必要がありません。

1分毎にログデータを取る場合はこんな感じです。

loop do
  puts plc["D0", 10]
  sleep 60
end

これを書いていたら飛び飛びのデバイスも下の様に指定できたら、結果を配列としていっぺんに取得できて便利じゃないかと思い始めました。
近いうちに試してみたいと思います。

puts plc["D0", "D2", "M100", "L10"]

現在はEthernet接続のMC Protocolとキーエンスの上位リンクでの接続に対応しています。

*1 そういう意味ではHashの方が近いですかね?

*2 PLCのツール使っちゃう場合が多いと思いますが、テストの用途の場合は強力な武器になります。