OTO - Ohshima Tamashima Observatory- - windowsdll_from_linux Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
市販のCCDカメラや望遠鏡などの制御ソフトはどうしてもWindows用に作られていることが多く、Linuxからそれらのハードウェアを使いたい時にはLinux用ドライバーが存在しない場合に困ることがある。
しかし、以下の方法を使えば、LinuxからWindowsのAPIやDLLを使うことができる。
(1)まず、Windows上のRubyでWindowsソフトを利用する。その方法は、筆者が勉強したところでは、2つある。
a)RubyのライブラリRuby/DLを使えば、同一マシン上ののWindowsのAPIやDLLをRubyで書いたソフトから利用できる
b)RubyのライブラリRuby/Win32OLEを使えば、同一マシン上のWinowdsソフトのOLE・COMを利用できる。
(2)そのソフトを分散ruby(dRuby)を使ってサーバソフトとして書ける。そうすれば、ネット上の別のマシンに(あるいは同一マシン上のバーチャルマシンに)サービスを提供できる。
(3)ネット上にあるLinuxマシン(あるいは同一マシン上のバーチャルLinuxマシン)のruby(dRuby)でクライアントソフトを書けば、ネット上のWindowsマシンにつながったハードウェアをリモートで制御できるようになる。
[[LinuxマシンからWindowsマシンにつながった冷却CCDの情報を得れいる画面|http://otobs.org/tech/ccd_stat_s.jpg]]|http://otobs.org/tech/ccd_stat.jpg]]
[[ここを押す|http://otobs.org/tech/ccd_stat.jpg]]と大きな画面が表示される
!(1)Windows上のRubyでWindowsソフトを利用する。
!! (a)RubyのライブラリRuby/DLで、WindowsのAPIやDLLを利用する方法
速さが必要な処理でもそれはDLLに任せて、Rubyでインターフェース部を書ける。
参考リンク
[[Rubyリファレンスマニュアル - dl|http://www.ruby-lang.org/ja/man/html/dl.html]]
[[Ruby/DL tutorial日本語|http://ttsky.net/ruby/ruby-dl-doc-ja/rbdl.pdf]]
[[Ruby/DLをWindowsで使う|http://wiki.raccy.org/?Ruby%2FDL%A4%F2Windows%A4%C7%BB%C8%A4%A6]]
[[Ruby/DLでWin32 APIのMessageBoxを呼んでみた|http://d.hatena.ne.jp/NAT_programming/20070818/1187449018]]
!! (b)Rubyでは、WindowsアプリのCOMオブジェクトを使うライブラリWIN32OLEが利用できるので、これを使う方法
以下はその例。
!(2)そのソフトを分散ruby(dRuby)を使ってサーバソフトとして書く
druby作者による[[解説サイト|http://www2a.biglobe.ne.jp/~seki/ruby/druby.html]]
druby作者による[[「dRubyによる分散・Webプログラミング 」(単行本)|http://www.amazon.co.jp/dRuby%E3%81%AB%E3%82%88%E3%82%8B%E5%88%86%E6%95%A3%E3%83%BBWeb%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%96%A2-%E5%B0%86%E4%BF%8A/dp/4274066096]]
例 分散Rubyによるサーバソフトの例(冷却CCDを制御するWindowsマシンに置く)
require 'drb' #dRubyライブラリを読み込む
require 'win32ole'
class WIN32OLE
@const_defined = Hash.new
def WIN32OLE.new_with_const(prog_id, const_name_space)
result = WIN32OLE.new(prog_id)
unless @const_defined[const_name_space] then
WIN32OLE.const_load(result, const_name_space)
@const_defined[const_name_space] = true
end
return result
end
end
module CCDSoft #CCDSoftのCOMを利用する
def CCDSoft.new()
ccdsoft = WIN32OLE.new_with_const('CCDSoft.Camera', CCDSoft)
return ccdsoft
end
def CCDSoft.runDuring(&block)
begin
ccdsoft = new()
block.call(ccdsoft)
ensure
ccdsoft.quit
end
end
end
DRb.start_service('druby://:12345', CCDSoft.new) #「12345」はポート番号で任意の指定ができる
puts DRb.uri
sleep #この3行でdRubyを使ったサーバになる
!(3)dRubyで書いたクライアントソフトからdRubyを使ったサーバを利用する(linuxマシンに置くソフト)
#! /usr/bin/ruby1.8
# Ver.0.20 2010.12.18 add CCD status from CCDSoft of Windows machine
require 'drb'
require "dispConsole.rb"
require "DACS1500.rb" #望遠鏡を制御するクラス
include Disp
dt=DRbObject.new_with_uri('druby://localhost:12345')
@ccdt=DRbObject.new_with_uri('druby://winndy:12345') #CCDstat serverに接続
def ccd_exp #サーバからCCDの露出ステータスを得るメソッド
str=@ccdt.status
end
def ccd_temp #サーバからCCDの温度を得るメソッド
str=@ccdt.temperature
sprintf("%.3g",str)
end
def temp_power #サーバからCCDの冷却パワー情報を得るメソッド
str=@ccdt.thermalelectriccoolerpower
sprintf("%.2g",str)
end
c = Controll_Terminal.new
dacs15k=DACS1500.new
loop do
begin
dt.renew
ha=dt.ha.to_f
$ha=Angle.new(ha)
hour=Time.new.hour
if (hour>5)and(hour<17) then
dacs15k.stopSiderealTracking
c.disp(22,10, "Siderial clock was stopped!! ")
end
lst=Angle.new(dt.lst).to_hms
rA=Angle.new(dt.ra)
dEc=Angle.new(dt.dec)
c.disp(3,3,"Date: "<<dt.date_t)
c.disp(3,48,"JD:"<<dt.jd.to_s)
(中略)
c.disp(15,17, ccd_exp)
c.disp(16,17, ccd_temp<<"deg("<<temp_power<<"%)")
rescue => ex
c.disp(15,17, "Telescope Error !!")
ex.message
end
sleep(0.8)
end
----
[[技術的な覚書き]]へ戻る
[[OTO-Ohshima Tamashima Observatory-]]トップへ戻る
{{counter}}
しかし、以下の方法を使えば、LinuxからWindowsのAPIやDLLを使うことができる。
(1)まず、Windows上のRubyでWindowsソフトを利用する。その方法は、筆者が勉強したところでは、2つある。
a)RubyのライブラリRuby/DLを使えば、同一マシン上ののWindowsのAPIやDLLをRubyで書いたソフトから利用できる
b)RubyのライブラリRuby/Win32OLEを使えば、同一マシン上のWinowdsソフトのOLE・COMを利用できる。
(2)そのソフトを分散ruby(dRuby)を使ってサーバソフトとして書ける。そうすれば、ネット上の別のマシンに(あるいは同一マシン上のバーチャルマシンに)サービスを提供できる。
(3)ネット上にあるLinuxマシン(あるいは同一マシン上のバーチャルLinuxマシン)のruby(dRuby)でクライアントソフトを書けば、ネット上のWindowsマシンにつながったハードウェアをリモートで制御できるようになる。
[[LinuxマシンからWindowsマシンにつながった冷却CCDの情報を得れいる画面
!(1)Windows上のRubyでWindowsソフトを利用する。
!! (a)RubyのライブラリRuby/DLで、WindowsのAPIやDLLを利用する方法
速さが必要な処理でもそれはDLLに任せて、Rubyでインターフェース部を書ける。
参考リンク
[[Rubyリファレンスマニュアル - dl|http://www.ruby-lang.org/ja/man/html/dl.html]]
[[Ruby/DL tutorial日本語|http://ttsky.net/ruby/ruby-dl-doc-ja/rbdl.pdf]]
[[Ruby/DLをWindowsで使う|http://wiki.raccy.org/?Ruby%2FDL%A4%F2Windows%A4%C7%BB%C8%A4%A6]]
[[Ruby/DLでWin32 APIのMessageBoxを呼んでみた|http://d.hatena.ne.jp/NAT_programming/20070818/1187449018]]
!! (b)Rubyでは、WindowsアプリのCOMオブジェクトを使うライブラリWIN32OLEが利用できるので、これを使う方法
以下はその例。
!(2)そのソフトを分散ruby(dRuby)を使ってサーバソフトとして書く
druby作者による[[解説サイト|http://www2a.biglobe.ne.jp/~seki/ruby/druby.html]]
druby作者による[[「dRubyによる分散・Webプログラミング 」(単行本)|http://www.amazon.co.jp/dRuby%E3%81%AB%E3%82%88%E3%82%8B%E5%88%86%E6%95%A3%E3%83%BBWeb%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%96%A2-%E5%B0%86%E4%BF%8A/dp/4274066096]]
例 分散Rubyによるサーバソフトの例(冷却CCDを制御するWindowsマシンに置く)
require 'drb' #dRubyライブラリを読み込む
require 'win32ole'
class WIN32OLE
@const_defined = Hash.new
def WIN32OLE.new_with_const(prog_id, const_name_space)
result = WIN32OLE.new(prog_id)
unless @const_defined[const_name_space] then
WIN32OLE.const_load(result, const_name_space)
@const_defined[const_name_space] = true
end
return result
end
end
module CCDSoft #CCDSoftのCOMを利用する
def CCDSoft.new()
ccdsoft = WIN32OLE.new_with_const('CCDSoft.Camera', CCDSoft)
return ccdsoft
end
def CCDSoft.runDuring(&block)
begin
ccdsoft = new()
block.call(ccdsoft)
ensure
ccdsoft.quit
end
end
end
DRb.start_service('druby://:12345', CCDSoft.new) #「12345」はポート番号で任意の指定ができる
puts DRb.uri
sleep #この3行でdRubyを使ったサーバになる
!(3)dRubyで書いたクライアントソフトからdRubyを使ったサーバを利用する(linuxマシンに置くソフト)
#! /usr/bin/ruby1.8
# Ver.0.20 2010.12.18 add CCD status from CCDSoft of Windows machine
require 'drb'
require "dispConsole.rb"
require "DACS1500.rb" #望遠鏡を制御するクラス
include Disp
dt=DRbObject.new_with_uri('druby://localhost:12345')
@ccdt=DRbObject.new_with_uri('druby://winndy:12345') #CCDstat serverに接続
def ccd_exp #サーバからCCDの露出ステータスを得るメソッド
str=@ccdt.status
end
def ccd_temp #サーバからCCDの温度を得るメソッド
str=@ccdt.temperature
sprintf("%.3g",str)
end
def temp_power #サーバからCCDの冷却パワー情報を得るメソッド
str=@ccdt.thermalelectriccoolerpower
sprintf("%.2g",str)
end
c = Controll_Terminal.new
dacs15k=DACS1500.new
loop do
begin
dt.renew
ha=dt.ha.to_f
$ha=Angle.new(ha)
hour=Time.new.hour
if (hour>5)and(hour<17) then
dacs15k.stopSiderealTracking
c.disp(22,10, "Siderial clock was stopped!! ")
end
lst=Angle.new(dt.lst).to_hms
rA=Angle.new(dt.ra)
dEc=Angle.new(dt.dec)
c.disp(3,3,"Date: "<<dt.date_t)
c.disp(3,48,"JD:"<<dt.jd.to_s)
(中略)
c.disp(15,17, ccd_exp)
c.disp(16,17, ccd_temp<<"deg("<<temp_power<<"%)")
rescue => ex
c.disp(15,17, "Telescope Error !!")
ex.message
end
sleep(0.8)
end
----
[[技術的な覚書き]]へ戻る
[[OTO-Ohshima Tamashima Observatory-]]トップへ戻る
{{counter}}