信号灯制御プログラム
このプログラムについて
このプログラムはRS232-C接続の信号灯「PHE-3FB」(パトライト社製)を制御するプログラムです。環境
動作確認OS
WindowsXP SP2WIndows2003 R2
動作確認rubyバージョン
ruby 1.8.5 (2006-08-25) [i386-mswin32]動作確認信号灯
PHE-3FB通信プロトコル等の仕様は以下のURL参照
http://www.patlite.co.jp/product/sensor/phe.html
動作確認はしていませんが、同じ通信プロトコルで制御できるリレーユニットでも使用可能なはずです。
http://www.patlite.co.jp/product/03network/phc.htm...
※注意 パトライト社純正の信号灯では動作しますが、他社のオーダーメイド製品では通信プロトコルが異なるため使用できません。私自身罠にはまりました。
使用ライブラリ
COMポートとの通信は以下のwincom.rbライブラリを使用させて頂いております。Rubyシリアル通信ライブラリ(Windwos用)
http://www.texcell.co.jp/ruby/wincom/rubywincom.ht...
使い方
コマンドプロンプトから# ruby patlite.rb -c [on|off] -d [R Y G P p r y g]
-v バージョン表示 -h ヘルプ Usage -c ランプ/ブザーのON,OFF -d 動作
R | 赤ランプの点灯 |
Y | 黄ランプの点灯 |
G | 緑ランプの点灯 |
P | ブザー(ピピピピピ) |
p | ブザー(ピーピー) |
r | 赤ランプの点滅 |
y | 黄ランプの点滅 |
g | 緑ランプの点滅 |
- 例1 赤ランプを点灯させる
- 例2 黄ランプを点滅させる+ブザー(ピーピー)
- 例3 すべてのランプを消す
[-d]オプションは重複していても一つとして扱われます。
Gを何個書いてもG1個としてのみ扱われます。
- 例4 緑ランプを点灯させる [-d G]と同じ動作
[-d]オプションの要素はどのような順序でも構いません。
ランプの優先度は 点灯>点滅 です。
ブザーの優先度は ・・・忘れました。
プログラム本体 patlite.rb [version0.1]
require 'optparse' require "wincom.rb" ###################### flg_header = '@' flg_ID1 = '?' flg_ID2 = '?' flg_command = 0 flg_data1 = 48 # ASCIIcode 48(30H) = 0 flg_data2 = 48 # ASCIIcode 48(30H) = 0 flg_footer = '!' OPTS = {} ############ 引数処理 #### -c on/off #### -d R Y G P p r y g 点灯色,ブザー指定 OptionParser.new do |opt| Version = "0.1" opt.on('-c [value]','switch on/off light') {|v| OPTS[:c] = v } opt.on('-d [value]','light-color or BEEP') {|v| OPTS[:d] = v.split(//).uniq } opt.parse!(ARGV) end #### -c -d そのものがない エラー if ( !(OPTS.key?(:c)) or !(OPTS.key?(:d)) ) then print "エラー:オプションが足りないよ\n" exit end #### -c -d の引数がない = nilの場合 エラー if ( !(OPTS[:c]) or !(OPTS[:d]) ) then print "エラー:引数がないよ\n" exit end #### -c の中身判別 コマンドデータを更新 on = 1 , off = 0 case OPTS[:c] when 'on' flg_command = 1 when 'off' flg_command = 0 else print "エラー:-cの中身がおかしいよ\n" exit end #### -d の中身判別 データ1, データ2を更新 OPTS[:d].each {|input_data| case input_data when 'R' flg_data2+=1 when 'Y' flg_data2+=2 when 'G' flg_data2+=4 when 'P' flg_data2+=8 when 'p' flg_data1+=1 when 'r' flg_data1+=2 when 'y' flg_data1+=4 when 'g' flg_data1+=8 else print "エラー:-dの中身がおかしいよ\n" exit end } #### 送信ASCIIコード決定 send_msg = flg_header + flg_ID1 + flg_ID2 + flg_command.to_s + flg_data1.chr + flg_data2.chr + flg_footer #### RS232Cコネクト com1=Serial.new com1.open(1,0,9600,8,0,0,64,64) com1.send(send_msg) com1.close
2007年04月18日(水) 17:09:03 Modified by glass57