class Labcom::Retriever
Authors-
S.imazu
Version-
25.0.0
Date-
2024-06-20
Comment-
Deprecated labcom module
[クラス名] Retriever¶ ↑
[メンバー]¶ ↑
- timeout (int)
-
取得時の待ち時間(秒) 0は待ち時間なし
- server (string)
-
データ取得ホスト(ホスト指定)
- path (string)
-
データ取得時のパス(ホスト指定)
- port (int)
-
データ転送サーバ(transd)のサービスポート番号
[クラスメソッド]¶ ↑
-
new( timeout=0, server=nil, path=nil, port=0 )
-
version( )
[インスタンスメソッド]¶ ↑
-
get( diag, shot, sub_shot, channels, range_type, range_str) -
get_frames( diag, shot, sub_shot, channel, frames) -
get_ch( channel) -
open( diag, shot, sub_shot, range_type, range_str) -
close( ) -
set_raw_mode( )
[ 説明 ]¶ ↑
-
LABCOM計測データを取得する制御クラス
[UPDATE履歴]¶ ↑
- 18.0.0
-
初版
- 19.0.0
-
部分取り出しの対応、時間軸データの取得メソッドをRetrieve.time_infoに変更。
- 19.1.0
-
共有ライブラリ(libretrieve.so)のdata_length64ビット拡張による変更。(retrieve.so)
- 22.0.0
-
rawモードを追加。
- 25.0.0
-
require(Labcom_m.rb)
- 25.2.0
-
first sample time adjustment
[DEPRECATED]¶ ↑
This class is scheduled to be removed in the next version 26.0.0.
[ 前提 ]¶ ↑
rubyは配列で引数に渡すと参照渡しとなる。 単純変数は値渡しとなる。
Constants
- RANGE_EXP
取得範囲:実験時刻
- RANGE_FRAMES
取得範囲:フレーム数
- RANGE_NOSET
取得範囲なし
- RANGE_SAMPLES
取得範囲:サンプル数
- RANGE_TRIG
取得範囲:トリガ基準
Public Class Methods
- 引 数
- timeout (int)
-
データの出現を待つ時間(秒) default 0 : no wait
- server (string)
-
データ取得ホスト(ホスト指定) default なし : INDEXのSHOTテーブルを参照する。
- path (string)
-
データ取得時のパス(ホスト指定)default なし : INDEXのSHOTテーブルを参照する。
- port (int)
-
データ転送サーバ(transd)のサービスポート番号 default 0 : INDEXのSHOTテーブル等を参照する。
- 説 明
-
コンストラクタ
# File lib/labcom/Retriever.rb, line 117 def initialize( timeout=0, server=nil, path=nil, port=0 ) @timeout = timeout @server = server @path = path @port = port @__desc = [0] # デストラクタに変数オブジェクトを参照したいので配列とする。 @__diag ='' @__shot = 0 @__sub_shot = 0 @__n_channel = 0 @__self_open = false @__range_type = RANGE_NOSET @__range_str = '' @__raw = false ObjectSpace.define_finalizer( self, Retriever.del_callback(@__desc) ) end
- 引 数
-
なし
- 返 値
-
バージョン番号(String)
- 説 明
-
共有ライブラリのバージョン番号(String)を戻す
# File lib/labcom/Retriever.rb, line 87 def self.version return Retrieve.version() end
Public Instance Methods
- 引 数
-
なし
- 返 値
-
なし
- 説 明
-
データ取得の終了宣言をする。(retrieveディスクリプタを閉じる。)
openされていたらcloseする。
# File lib/labcom/Retriever.rb, line 145 def close if 0 < @__desc[0] then Retrieve.close(@__desc[0]) Retrieve.release() @__desc[0] = 0 end end
- 引 数
- diag (string)
-
取得したいデータの計測名
- shot (int)
-
取得したいデータのショット番号
- sub_shot (int)
-
取得したいデータのサブショット番号
- channels (int, String, Range, Array(int), Array(String))
-
取得したいデータのチャネル番号(int)または信号名(String) 複数可
- range_type (int)
-
取得範囲の種別(
RANGE_NOSET,RANGE_EXP,RANGE_TRIG,RANGE_SAMPLES,RANGE_FRAMES) - range_str (string)
-
取得範囲 “1:2s” “1.5:2.5ms”
- 返 値
- 例 外
-
Retrieve::RetrieveError, etc
- 説 明
# File lib/labcom/Retriever.rb, line 237 def get( diag, shot, sub_shot, channels, range_type=RANGE_NOSET, range_str=nil) begin range_str = '' if nil == range_str @__self_open = false if( 1 > @__desc[0] or shot != @__shot or sub_shot != @__sub_shot \ or diag != @__diag or range_type != @__range_type or range_str != @__range_str) then open(diag, shot, sub_shot, range_type, range_str) @__self_open = true end is_list = false if( channels.is_a?(Array) ) then is_list = true l_channel = channels elsif( channels.is_a?(Range) ) then is_list = true l_channel = channels elsif( channels.is_a?(Integer) ) then if( 0 == channels ) then is_list = true l_channel = Range.new(1,@__n_channel) else l_channel = [channels] end elsif( channels.is_a?(String) ) then l_channel = [channels] else close() if @__slef_open raise RuntimeError, 'Illegal type(format) of channel' end l_channel.each {|ch| if( ch.is_a?(Integer) ) then if( 0 > ch || ch > @__n_channel ) then close() if @__slef_open raise RuntimeError, 'Illegal channel number' end end } # 2024-06-19 Retrieve.make_ch_pool(@__desc[0], l_channel ) ret_obj = Array.new() if( is_list ) for x_channel in l_channel do obj = get_ch(x_channel) ret_obj.push(obj) if( is_list ) end rescue Retrieve::RetrieveError => ex close() raise ex end close() if @__slef_open return ret_obj if( is_list ) return obj end
- 引 数
- channel ( int, String)
-
取得したいチャネル番号または信号名
- 返 値
-
ArcDataオブジェクト - 例 外
-
Retrieve::RetrieveError, etc
- 説 明
-
open()されたショットのチャネル単位の計測データを取得する。
# File lib/labcom/Retriever.rb, line 307 def get_ch( channel) begin raise "Not Retriever::open" if( 1 > @__desc[0] ) raise "Illegal type of channel " unless ( channel.is_a?(Integer) || channel.is_a?(String) ) ch_no, byte_length, comp_length, param_count, data_type, \ image_type, value_len, is_nframe, c_management, c_comment \ = Retrieve.ch_info(@__desc[0], channel) params = Retrieve.ch_params(@__desc[0], ch_no) if( is_nframe == 0 ) then data_length, image_type = Retrieve.to_data_len( byte_length, image_type, value_len) begin syn_num = Retrieve.ch_v_synthesized_num(@__desc[0], ch_no) if( 0 < syn_num and !@__raw ) then data_length = data_length/syn_num block = Retrieve.ch_volts_dbl(@__desc[0], ch_no, data_length) image_type = 'FLT64' else block = Retrieve.ch_data(@__desc[0], ch_no, byte_length) end rescue Retrieve::RetrieveError => ex block = Retrieve.ch_data(@__desc[0], ch_no, byte_length) # warnings.warn("Data type is not voltage.") end begin sampling_cycle, trigger_delay, start_timing, first_sample_adjust, num_times \ = Retrieve.time_info(@__desc[0], ch_no ) rescue => ex sampling_cycle = nil start_timing = nil num_times = nil first_sample_adjust = nil end ad = ArcData.new( start_timing+first_sample_adjust, sampling_cycle,nil, params, num_times) # ary.set_samples(image_type, block, byte_length) ad.set_samples(image_type, block) else # is_nframe begin sampling_cycle, trigger_delay, start_timing, first_sample_adjust, num_times \ = Retrieve.time_info(@__desc[0], ch_no ) rescue => ex sampling_cycle = nil start_timing = nil num_times = nil first_sample_adjust = nil end begin begin_no, end_no = Retrieve.retrieve_no(@__desc[0], ch_no ) rescue => ex begin_no = 1 end_no = is_nframe end length, image_type, frame_x, frame_y = Retrieve.frame_info( @__desc[0], ch_no, begin_no) bytes = Retrieve.bytes_per_data(image_type, value_len) byte_length = frame_x * frame_y * bytes ad = ArcData.new( start_timing+first_sample_adjust, sampling_cycle, nil, params, num_times) ad.init_frames(image_type, frame_x, frame_y) for fno in Range.new(begin_no, end_no) do length, image_type, frame_x, frame_y = Retrieve.frame_info( @__desc[0], ch_no, fno) block = Retrieve.frame_data(@__desc[0], ch_no, fno, length) # ary.add_frame(block, length) ad.add_frame(block) end end # is_nframe rescue Retrieve::RetrieveError => ex raise ex end return ad end
- 引 数
- diag (string)
-
取得したい計測名
- shot (int)
-
取得したいショット番号
- sub_shot (int)
-
取得したいサブショット番号
- channel(int, String )
-
取得したいチャネル番号、信号名
- frames(int, Range, Array(int) )
-
取得したいフレーム番号
- 返 値
- 説 明
-
フレーム番号を指定して計測データ(フレーム構造)を取得する。
内部でopen()し、close()する。
時間軸データは付加しない。(間欠の場合はできない。)
部分取り出しをしたい場合は、get_ch()メソッドを使用する。
# File lib/labcom/Retriever.rb, line 398 def get_frames( diag, shot, sub_shot, channel, frames) begin @__self_open = false if( 1 > @__desc[0] or shot != @__shot or sub_shot != @__sub_shot \ or diag != @__diag or RANGE_NOSET != @__range_type ) then open(diag, shot, sub_shot) @__self_open = true end if( channel.is_a?(Integer) ) then if( 0 > channel || channel > @__n_channel ) then close() if @__slef_open raise RuntimeError, 'Illegal channel number' end elsif( !channel.is_a?(String) ) then close() if @__slef_open raise RuntimeError, 'Illegal type(format) of channel' end ch_no, byte_length, comp_length, param_count, data_type, \ image_type, value_len, is_nframe, c_management, c_comment \ = Retrieve.ch_info(@__desc[0], channel) if( is_nframe == 0 ) then close() if @__slef_open raise RuntimeError, 'Not frame format' end l_frame = nil if( frames.is_a?(Array) ) then l_frame = frames elsif( frames.is_a?(Range) ) then l_frame = frames elsif( frames.is_a?(Integer) ) then if( 0 == frames ) then l_frame = Range.new(1, is_nframe) else l_frame = [frames] end else close() if @__slef_open raise RuntimeError, 'Illegal type(format) of frame' end l_frame.each { |fno| if( 0 > fno || fno > is_nframe ) then close() if @__slef_open raise RuntimeError, 'Illegal frame number' end } params = Retrieve.ch_params(@__desc[0], ch_no) length, image_type, frame_x, frame_y = Retrieve.frame_info( @__desc[0], ch_no, 1) obj = ArcData.new( nil, nil, nil, params) obj.init_frames(image_type, frame_x, frame_y) for fno in l_frame do length, image_type, frame_x, frame_y = Retrieve.frame_info( @__desc[0], ch_no, fno) block = Retrieve.frame_data(@__desc[0], ch_no, fno, length) obj.add_frame(block) end rescue Retrieve::RetrieveError => ex close() raise ex end close() if @__slef_open return obj end
- 引 数
- diag (string)
-
取得したいデータの計測名
- shot (int)
-
取得したいデータのショット番号
- sub_shot (int)
-
取得したいデータのサブショット番号
- range_type (int)
-
取得範囲の種別(
RANGE_NOSET,RANGE_EXP,RANGE_TRIG,RANGE_SAMPLES,RANGE_FRAMES) - range_str (string)
-
取得範囲 “1:2s” “1.5:2.5ms”
- 返 値
-
なし
- 例 外
-
Retrieve::RetrieveError
- 説 明
-
指定された計測名、ショット番号およびサブショット番号の取り出しを宣言する。
すでに、open()されていたらclose()する。
# File lib/labcom/Retriever.rb, line 185 def open( diag, shot, sub_shot, range_type=RANGE_NOSET, range_str=nil) begin close() if( nil != @server and nil == @path ) then @path='ShotDataFS' end if( nil == @server ) then range_str = '' if nil == range_str @__desc[0] = Retrieve.open_range(diag, '', shot, sub_shot, @timeout, range_type, range_str) else @__desc[0] = Retrieve.open_direct(\ diag, @server, @path, shot, sub_shot, @port, @timeout) end @__diag = diag @__shot = shot @__sub_shot = sub_shot @__range_type = range_type @__range_str = range_str @__n_channel, s_year, s_month, s_day, s_hour , s_min , s_sec, \ s_management, s_comment, s_server = Retrieve.shot_info(@__desc[0]) rescue Retrieve::RetrieveError => ex close() p ex.to_s raise ex end return end
- 引 数
-
なし
- 返 値
-
なし
- 説 明
-
取得時のデータを(電圧)変換しない。
# File lib/labcom/Retriever.rb, line 164 def set_raw_mode @__raw = true end