テクセル
Rubyタスクコードイーサネット通信ライブラリ(Windows用)

ehtcp.rbは、(株)日立産機システム製PLCであるH/EHシリーズのRuby用タスクコードイーサネット通信ライブラリです。 動作確認は、ruby 2.2.0p0 (ActiveScriptRuby)で行っています。
ehtcp.rbのダウンロード(ehtcpV101.lzh)

Ethtcpクラス タスクコードイーサネット通信用クラスです。

アクセサ

time_out
PLCからの応答受信に対するタイムアウト時間の取得、設定を行います。単位:秒 初期値1秒

クラスメソッド

connect(shost,iport)
イーサネット接続します。
shost
接続先PLCのIPアドレス 例:"192.168.1.100"
iportt
ポート番号
戻り値
正常時:0 接続失敗:-1
disconnect
切断します。
戻り値
なし
cancel
以前に発行した要求タスクコードの処理を打ち切ります。
戻り値
なし
打ち切りコマンド"FF"を送信します。
unlock(isubcmd)
占有強制解除を行います。
isubcmd
機能選択を指定します。
・0:すべての占有を強制解除
・1:自局の占有を強制解除
戻り値(irt, ircの3変数)
irt:応答タスクコード 正常時:0 -1の時は、タイムアウトエラー
irc:リターンコード 応答タスクコード>0の場合セットされます。
cpustatus(isubcmd)
CPUのステータスを読み出します。
isubcmd
機能選択を指定します。
0:CPUステータスを読み出します。
1:メモリステータスを読み出します。
2:システムステータスのバージョンを読み出します。
3:エラーコードを読み出します。
4:CPUの名称を読み出します。
戻り値(irt, irc, ardの3変数)
irt:応答タスクコード 正常時:0 -1の時は、タイムアウトエラー
irc:リターンコード 応答タスクコード>0の場合セットされます。
ard:読み込んだステータス(詳細についてはタスクコード通信のマニュアルを参照して下さい。)
read(sio,itop,inum)
指定されたI/Oの値を読み込みます。
sio
I/O名称 指定出来るI/Oは、R,L,M,WR,WL,WM,WNです。(WNは、EHVで使用可能)
itop
指定I/Oの先頭番号
inum
読み込み個数
戻り値(irt, irc, ardの3変数)
irt:応答タスクコード 正常時:0 -1の時は、タイムアウトエラー
irc:リターンコード 応答タスクコード>0の場合セットされます。
ard:読み込みデータの整数配列 ビットの場合は、0,1の配列
write(sio, itop, ardd)
指定されたI/Oへ値を書き込みます。
sio
I/O名称 指定出来るI/Oは、R,L,M,WR,WL,WM,WNです。(WNは、EHVで使用可能)
itop
指定I/Oの先頭番号
inum
書き込みデータの整数配列 ビットの場合は、0,1の配列
戻り値(irt, ircの2変数)
irt:応答タスクコード 正常時:0 -1の時は、タイムアウトエラー
irc:リターンコード 応答タスクコード>0の場合セットされます。

・応答タスクコード、リターンコードは、(株)日立産機H/EHシリーズマニュアルのタスクコード仕様を参照して下さい
・LUMPアドレスは、"FFFF0000"です。
・読み書きは占有不要のタスクコードを使用しています。

使用例

PLCのイーサネット接続先は、IPアドレスを「192.168.1.198」、ポート番号を9001としています。 設定方法の詳細については、H/EHシリーズマニュアルを参照してください。
プログラムは、WR100から10ワード、R10から10ビットの読み込みを行い、「WR100=WR100+1」を行っています。 qキーで終了します。

「wincons.rb」の説明及びダウンロード

# coding: utf-8
require './ehtcp'
require './wincons'

wcons = Console.new(__ENCODING__)

ehtcpd = Ethtcp.new
ir = ehtcpd.connect("192.168.1.198",9001)
if ir != 0
   print "PLC接続失敗¥r¥n"
   exit
end
print "PLC接続¥r¥n"

ehtcpd.cancel
ir,ic = ehtcpd.unlock(0)          #占有強制解除
ir,ic,sd = ehtcpd.cpustatus(4)    #cpuの名称
print sd + "¥r¥n"
ir,ic,sd = ehtcpd.cpustatus(2)    #システムソフトのバージョン
print sd + "¥r¥n"

while true do
   ir,ic,sd = ehtcpd.read("WR",0x100,10) # WR100から10ワード読み込み
   if ir != 0
      print "PLCエラー1 ir=" + ir.to_s + ",ic=" + ic.to_s + "¥r¥n"
      break
   end
   ic = 1
   sa = ""
   sd.each{|s1|
      sa += sprintf("%04X", s1) + ","
   }
   print sa + "¥r¥n"
   iv = sd[0] + 1
   ehtcpd.write("WR",0x100,[iv])  # WR100 = WR100 + 1

   ir,ic,sd = ehtcpd.read("R",0x10,10) # R10から10ビット読み込み
   if ir != 0
      print "PLCエラー2 ir=" + ir.to_s + ",ic=" + ic.to_s + "¥r¥n"
      break
   end
   sa = ""
   sd.each{|s1|
      sa += s1.to_s + ","
   }
   print sa + "¥r¥n"
   ca = wcons.inkey
   if ca[0] == "q" || ca[0] == "Q"
      break
   end
   sleep(0.1)
end
ehtcpd.disconnect
print "end¥r¥n"

履歴

2015.11 Ver.1.01 unlock, cpustatus関数追加
2013.10 Ver.1.00
参考資料
・EH-150 アプリケーションマニュアル((株)日立産機システム)
・イーサネットモジュール(EH-ETH)アプリケーションマニュアル((株)日立産機システム)
Rubyユーティリティ
©2011-2015 TEXCELL CORPORATION