Module labcom.Retriever
計測データの取り出しを制御する。
計測名、ショット番号、サブショット番号、チャネル番号を指定して取り出す。 計測データはArcDataオブジェクトに格納される。 複数のチャネルを指定した場合は、配列に格納される。
Retrieve+dbStoreパッケージがインストールされている必要がある。
Classes
class RetrieveError (func, msg, code)-
Expand source code
class RetrieveError(Exception): ''' ''' def __init__(self,func,msg,code): self.func = func self.msg = msg self.code = codeAncestors
- builtins.Exception
- builtins.BaseException
class Retriever (timeout=0, server=None, path=None, port=0)-
Expand source code
class Retriever(object): RANGE_NOSET = 0 RANGE_EXP = 1 RANGE_TRIG = 2 RANGE_SAMPLES = 3 RANGE_FRAMES = 4 ''' [ クラス名 ] Retriever < パブリックメンバー > timeout(int) : 取得時の待ち時間(秒) 0は待ち時間なし server(string) : データ取得ホスト(ホスト指定) path(string) : データ取得時のパス(ホスト指定) port(int) : データ転送サーバ(transd)のサービスポート番号 < 説明 > LABCOM計測データの取得制御クラス ''' # #< プライベートメンバー > # __desc(int) : オープンされたRetrieve記述子(0<、0の場合、オープンされていない) # __diag(string) : 取得したデータの計測名 # __shot(int) : 取得したデータのショット番号 # __sub_shot(int) : 取得したデータのサブショット番号 # def __init__(self, timeout=0, server=None, path=None, port=0): ''' [ コンストラクタ ] < 引数 > timeout(int) : データの出現を待つ時間(秒) default=0 : no wait server(string) : データ取得ホスト(ホスト指定) default=None : INDEXのSHOTテーブルを参照する。 path(string) : データ取得時のパス(ホスト指定) default=None : INDEXのSHOTテーブルを参照する。 port(int) : データ転送サーバ(transd)のサービスポート番号 default=None : INDEXのSHOTテーブル等を参照する。 ''' self.timeout = timeout self.server = server self.path = path self.port = port self.raw_mode = 0 self.__desc = 0 self.__diag ='' self.__shot = 0 self.__sub_shot = 0 self.__range_type = Retriever.RANGE_NOSET self.__range_str = '' def __del__(self): ''' ''' self._end() def _end(self): ''' [ 関数名 ] _end < 引数 > なし < 返値 > なし < 説明 > retrieveをクローズする。 ''' if 0 < self.__desc : _retrieve.close(self.__desc) _retrieve.release() self.__desc = 0 def get(self, diag, shot, sub_shot, channels, range_type=0, range_str='', first_read=True) : """ [ 関数名 ] get < 引数 > diag(string) : 取得したいデータの計測名 shot(int) : 取得したいデータのショット番号 sub_shot(int) : 取得したいデータのサブショット番号 channels(int,str,[],()) : 取得したいデータのチャネル番号,信号名 range_type(int) : 取得範囲の種別 range_str(string): 取得範囲の文字列 first_read(bool) : True, read channel data at first. < 返値 > ArcDataオブジェクトまたは配列 < 説明 > 計測データを取得する。 可能であれば、電圧値に変換する。 < 例外 > TypeError : チャネル番号の型があわない。 ValueError : チャネル番号が不正である。 RetrieveError : retrieveライブラリでエラーが発生した。 """ # # 前回のget(),get_frames()時と同じdiag,shot,sub_shotでないならば、close、openする。 # このメソッドの中ではcloseしないが、エラーが発生したらcloseする。 # closeはデストラクタで行う。 # is_list = False try: if( 1 > self.__desc or shot != self.__shot or sub_shot != self.__sub_shot or diag != self.__diag or range_type != self.__range_type or range_str != self.__range_str) : self._end() if self.server is None or self.path is None : self.__desc = _retrieve.open_range(diag, '', shot, sub_shot, self.timeout, range_type, range_str) else: self.__desc = _retrieve.open_direct( diag, self.server, self.path, shot, sub_shot, self.port, self.timeout) self.__diag = diag; self.__shot = shot; self.__sub_shot = sub_shot; self.__range_type = range_type; if Retriever.RANGE_NOSET == range_type : self.__range_str = ''; else : self.__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(self.__desc) if isinstance(channels, list ) or isinstance(channels, tuple ) : is_list = True l_channel = channels elif isinstance(channels, int ) : if channels == 0 : is_list = True l_channel = list(range(1,n_channel+1)) else : l_channel = [channels] elif isinstance(channels, str ) : l_channel = [channels] else : raise TypeError("channel") for x_channel in l_channel : if isinstance(x_channel, int ) : if n_channel < x_channel or 1 > x_channel : raise ValueError("Illegal channel number(%d)" % x_channel) if first_read : _retrieve.make_ch_pool(self.__desc, l_channel) if is_list : ret_obj = [] for x_channel in l_channel : ch_no, byte_length, comp_length, param_count, data_type, \ image_type, value_len, is_nframe, c_management, c_comment \ = _retrieve.ch_info(self.__desc, x_channel) params = _retrieve.ch_params(self.__desc, ch_no) if 0 == is_nframe : data_length, image_type = _retrieve.to_data_len( byte_length, image_type, value_len) if 0 == self.raw_mode : try: syn_num = _retrieve.ch_v_synthesized_number(self.__desc, ch_no) if 0 < syn_num : data_length = data_length // syn_num block = _retrieve.ch_volts_dbl(self.__desc, ch_no, data_length) image_type = 'FLT64' else : block = _retrieve.ch_data(self.__desc, ch_no, byte_length) except _retrieve.error as xxx_todo_changeme: (efunc,emes,ecode) = xxx_todo_changeme.args if -122 == ecode : block = _retrieve.ch_data(self.__desc, ch_no, byte_length) warnings.warn("Data type is not voltage.") else : raise RetrieveError(efunc,emes,ecode) else: try: block = _retrieve.ch_data(self.__desc, ch_no, byte_length) except _retrieve.error as xxx_todo_changeme: (efunc,emes,ecode) = xxx_todo_changeme.args raise RetrieveError(efunc,emes,ecode) try: sampling_cycle, trigger_delay, start_timing, first_adjust, num_times \ = _retrieve.time_info( self.__desc, ch_no) except: sampling_cycle = None start_timing = None num_times = None first_adjust= None ary = ArcData( start_timing+first_adjust, sampling_cycle, None, params, num_times) # ary.set_samples(image_type, block, byte_length) ary.set_samples(image_type, block) else: length, image_type, frame_x, frame_y = _retrieve.frame_info( self.__desc, ch_no, 1) bytes = _retrieve.bytes_per_data(image_type, value_len) byte_length = frame_x * frame_y * bytes ary = ArcData( None, None, None, params) ary.init_frames(image_type, frame_x, frame_y) for fno in range(1, is_nframe+1) : length, image_type, frame_x, frame_y = _retrieve.frame_info( self.__desc, ch_no, fno) block = _retrieve.frame_data(self.__desc, ch_no, fno, length) # ary.add_frame(block, length) ary.add_frame(block) if is_list : ret_obj.append( ary) except _retrieve.error as xxx_todo_changeme1: (efunc,emes,ecode) = xxx_todo_changeme1.args self._end() raise RetrieveError(efunc,emes,ecode) return if is_list : return ret_obj else : return ary def get_frames(self, diag, shot, sub_shot, channel, frames, first_read=True) : """ [ 関数名 ] get_frames < 引数 > diag(string) : 取得したいデータの計測名 shot(int) : 取得したいデータのショット番号 sub_shot(int) : 取得したいデータのサブショット番号 channel(int,str) : 取得したいデータのチャネル番号 frames(int,[],()) : 取得したいデータのフレーム番号 first_read(bool) : True, read channel data at first. < 返値 > ArcDataオブジェクト < 説明 > フレームを指定して、データを取得できる。 ただし、フレーム構造の計測データ(画像)のみである。 < 例外 > TypeError : チャネル番号が型があわない。 ValueError : チャネル番号が不正である。 RetrieveError : retrieveライブラリでエラーが発生した。 """ # # 前回のget(),get_frames()時と同じdiag,shot,sub_shotでないならば、close、openする。 # このメソッドの中ではcloseしないが、エラーが発生したらcloseする。 # closeはデストラクタで行う。 # try: if( 1 > self.__desc or shot != self.__shot or sub_shot != self.__sub_shot or diag != self.__diag ) : self._end() if self.server is None or self.path is None : self.__desc = _retrieve.open(diag, '', shot, sub_shot, self.timeout) else: self.__desc = _retrieve.open_direct( diag, self.server, self.path, shot, sub_shot, self.port, self.timeout) self.__diag = diag; self.__shot = shot; self.__sub_shot = sub_shot; n_channel, s_year, s_month, s_day, s_hour , s_min , s_sec, \ s_management, s_comment, s_server = \ _retrieve.shot_info(self.__desc) if isinstance(channel, int ) : if n_channel < channel or 1 > channel : raise ValueError("Illegal channel number(%d)" % channel) elif not isinstance(channel, str ) : raise ValueError("channel") ch_no, byte_length, comp_length, param_count, data_type, \ image_type, value_len, is_nframe, c_management, c_comment \ = _retrieve.ch_info(self.__desc, channel) if 1 > is_nframe : raise TypeError("channel") if isinstance(frames, list ) or isinstance(frames, tuple ) : l_frame = frames elif isinstance(frames, int ) : if frames == 0 : l_frame = list(range(1,is_nframe+1)) else : l_frame = [frames] else : raise TypeError("frame") for fno in l_frame : if isinstance(fno, int ) : if is_nframe < fno or 1 > fno : raise ValueError("Illegal frame number(%d)" % fno) else : raise TypeError("frame") params = _retrieve.ch_params(self.__desc, ch_no) if first_read : _retrieve.make_ch_pool(self.__desc, ch_no) length, image_type, frame_x, frame_y = _retrieve.frame_info( self.__desc, ch_no, 1) bytes = _retrieve.bytes_per_data(image_type, value_len) byte_length = frame_x * frame_y * bytes ary = ArcData( None, None, None, params) ary.init_frames(image_type, frame_x, frame_y) for fno in l_frame : length, image_type, frame_x, frame_y = _retrieve.frame_info( self.__desc, ch_no, fno) block = _retrieve.frame_data(self.__desc, ch_no, fno, length) ary.add_frame(block) except _retrieve.error as xxx_todo_changeme2: (efunc,emes,ecode) = xxx_todo_changeme2.args self._end() raise RetrieveError(efunc,emes,ecode) return return ary @classmethod def version(cls): return _retrieve.version()[ コンストラクタ ] < 引数 > timeout(int) : データの出現を待つ時間(秒) default=0 : no wait server(string) : データ取得ホスト(ホスト指定) default=None : INDEXのSHOTテーブルを参照する。 path(string) : データ取得時のパス(ホスト指定) default=None : INDEXのSHOTテーブルを参照する。 port(int) : データ転送サーバ(transd)のサービスポート番号 default=None : INDEXのSHOTテーブル等を参照する。
Class variables
var RANGE_EXP-
The type of the None singleton.
var RANGE_FRAMES-
[ クラス名 ] Retriever < パブリックメンバー > timeout(int) : 取得時の待ち時間(秒) 0は待ち時間なし server(string) : データ取得ホスト(ホスト指定) path(string) : データ取得時のパス(ホスト指定) port(int) : データ転送サーバ(transd)のサービスポート番号
< 説明 > LABCOM計測データの取得制御クラス
var RANGE_NOSET-
The type of the None singleton.
var RANGE_SAMPLES-
The type of the None singleton.
var RANGE_TRIG-
The type of the None singleton.
Static methods
def version()
Methods
def get(self, diag, shot, sub_shot, channels, range_type=0, range_str='', first_read=True)-
Expand source code
def get(self, diag, shot, sub_shot, channels, range_type=0, range_str='', first_read=True) : """ [ 関数名 ] get < 引数 > diag(string) : 取得したいデータの計測名 shot(int) : 取得したいデータのショット番号 sub_shot(int) : 取得したいデータのサブショット番号 channels(int,str,[],()) : 取得したいデータのチャネル番号,信号名 range_type(int) : 取得範囲の種別 range_str(string): 取得範囲の文字列 first_read(bool) : True, read channel data at first. < 返値 > ArcDataオブジェクトまたは配列 < 説明 > 計測データを取得する。 可能であれば、電圧値に変換する。 < 例外 > TypeError : チャネル番号の型があわない。 ValueError : チャネル番号が不正である。 RetrieveError : retrieveライブラリでエラーが発生した。 """ # # 前回のget(),get_frames()時と同じdiag,shot,sub_shotでないならば、close、openする。 # このメソッドの中ではcloseしないが、エラーが発生したらcloseする。 # closeはデストラクタで行う。 # is_list = False try: if( 1 > self.__desc or shot != self.__shot or sub_shot != self.__sub_shot or diag != self.__diag or range_type != self.__range_type or range_str != self.__range_str) : self._end() if self.server is None or self.path is None : self.__desc = _retrieve.open_range(diag, '', shot, sub_shot, self.timeout, range_type, range_str) else: self.__desc = _retrieve.open_direct( diag, self.server, self.path, shot, sub_shot, self.port, self.timeout) self.__diag = diag; self.__shot = shot; self.__sub_shot = sub_shot; self.__range_type = range_type; if Retriever.RANGE_NOSET == range_type : self.__range_str = ''; else : self.__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(self.__desc) if isinstance(channels, list ) or isinstance(channels, tuple ) : is_list = True l_channel = channels elif isinstance(channels, int ) : if channels == 0 : is_list = True l_channel = list(range(1,n_channel+1)) else : l_channel = [channels] elif isinstance(channels, str ) : l_channel = [channels] else : raise TypeError("channel") for x_channel in l_channel : if isinstance(x_channel, int ) : if n_channel < x_channel or 1 > x_channel : raise ValueError("Illegal channel number(%d)" % x_channel) if first_read : _retrieve.make_ch_pool(self.__desc, l_channel) if is_list : ret_obj = [] for x_channel in l_channel : ch_no, byte_length, comp_length, param_count, data_type, \ image_type, value_len, is_nframe, c_management, c_comment \ = _retrieve.ch_info(self.__desc, x_channel) params = _retrieve.ch_params(self.__desc, ch_no) if 0 == is_nframe : data_length, image_type = _retrieve.to_data_len( byte_length, image_type, value_len) if 0 == self.raw_mode : try: syn_num = _retrieve.ch_v_synthesized_number(self.__desc, ch_no) if 0 < syn_num : data_length = data_length // syn_num block = _retrieve.ch_volts_dbl(self.__desc, ch_no, data_length) image_type = 'FLT64' else : block = _retrieve.ch_data(self.__desc, ch_no, byte_length) except _retrieve.error as xxx_todo_changeme: (efunc,emes,ecode) = xxx_todo_changeme.args if -122 == ecode : block = _retrieve.ch_data(self.__desc, ch_no, byte_length) warnings.warn("Data type is not voltage.") else : raise RetrieveError(efunc,emes,ecode) else: try: block = _retrieve.ch_data(self.__desc, ch_no, byte_length) except _retrieve.error as xxx_todo_changeme: (efunc,emes,ecode) = xxx_todo_changeme.args raise RetrieveError(efunc,emes,ecode) try: sampling_cycle, trigger_delay, start_timing, first_adjust, num_times \ = _retrieve.time_info( self.__desc, ch_no) except: sampling_cycle = None start_timing = None num_times = None first_adjust= None ary = ArcData( start_timing+first_adjust, sampling_cycle, None, params, num_times) # ary.set_samples(image_type, block, byte_length) ary.set_samples(image_type, block) else: length, image_type, frame_x, frame_y = _retrieve.frame_info( self.__desc, ch_no, 1) bytes = _retrieve.bytes_per_data(image_type, value_len) byte_length = frame_x * frame_y * bytes ary = ArcData( None, None, None, params) ary.init_frames(image_type, frame_x, frame_y) for fno in range(1, is_nframe+1) : length, image_type, frame_x, frame_y = _retrieve.frame_info( self.__desc, ch_no, fno) block = _retrieve.frame_data(self.__desc, ch_no, fno, length) # ary.add_frame(block, length) ary.add_frame(block) if is_list : ret_obj.append( ary) except _retrieve.error as xxx_todo_changeme1: (efunc,emes,ecode) = xxx_todo_changeme1.args self._end() raise RetrieveError(efunc,emes,ecode) return if is_list : return ret_obj else : return ary[ 関数名 ] get < 引数 > diag(string) : 取得したいデータの計測名 shot(int) : 取得したいデータのショット番号 sub_shot(int) : 取得したいデータのサブショット番号 channels(int,str,[],()) : 取得したいデータのチャネル番号,信号名 range_type(int) : 取得範囲の種別 range_str(string): 取得範囲の文字列 first_read(bool) : True, read channel data at first.
< 返値 > ArcDataオブジェクトまたは配列 < 説明 > 計測データを取得する。 可能であれば、電圧値に変換する。 < 例外 > TypeError : チャネル番号の型があわない。 ValueError : チャネル番号が不正である。 RetrieveError : retrieveライブラリでエラーが発生した。
def get_frames(self, diag, shot, sub_shot, channel, frames, first_read=True)-
Expand source code
def get_frames(self, diag, shot, sub_shot, channel, frames, first_read=True) : """ [ 関数名 ] get_frames < 引数 > diag(string) : 取得したいデータの計測名 shot(int) : 取得したいデータのショット番号 sub_shot(int) : 取得したいデータのサブショット番号 channel(int,str) : 取得したいデータのチャネル番号 frames(int,[],()) : 取得したいデータのフレーム番号 first_read(bool) : True, read channel data at first. < 返値 > ArcDataオブジェクト < 説明 > フレームを指定して、データを取得できる。 ただし、フレーム構造の計測データ(画像)のみである。 < 例外 > TypeError : チャネル番号が型があわない。 ValueError : チャネル番号が不正である。 RetrieveError : retrieveライブラリでエラーが発生した。 """ # # 前回のget(),get_frames()時と同じdiag,shot,sub_shotでないならば、close、openする。 # このメソッドの中ではcloseしないが、エラーが発生したらcloseする。 # closeはデストラクタで行う。 # try: if( 1 > self.__desc or shot != self.__shot or sub_shot != self.__sub_shot or diag != self.__diag ) : self._end() if self.server is None or self.path is None : self.__desc = _retrieve.open(diag, '', shot, sub_shot, self.timeout) else: self.__desc = _retrieve.open_direct( diag, self.server, self.path, shot, sub_shot, self.port, self.timeout) self.__diag = diag; self.__shot = shot; self.__sub_shot = sub_shot; n_channel, s_year, s_month, s_day, s_hour , s_min , s_sec, \ s_management, s_comment, s_server = \ _retrieve.shot_info(self.__desc) if isinstance(channel, int ) : if n_channel < channel or 1 > channel : raise ValueError("Illegal channel number(%d)" % channel) elif not isinstance(channel, str ) : raise ValueError("channel") ch_no, byte_length, comp_length, param_count, data_type, \ image_type, value_len, is_nframe, c_management, c_comment \ = _retrieve.ch_info(self.__desc, channel) if 1 > is_nframe : raise TypeError("channel") if isinstance(frames, list ) or isinstance(frames, tuple ) : l_frame = frames elif isinstance(frames, int ) : if frames == 0 : l_frame = list(range(1,is_nframe+1)) else : l_frame = [frames] else : raise TypeError("frame") for fno in l_frame : if isinstance(fno, int ) : if is_nframe < fno or 1 > fno : raise ValueError("Illegal frame number(%d)" % fno) else : raise TypeError("frame") params = _retrieve.ch_params(self.__desc, ch_no) if first_read : _retrieve.make_ch_pool(self.__desc, ch_no) length, image_type, frame_x, frame_y = _retrieve.frame_info( self.__desc, ch_no, 1) bytes = _retrieve.bytes_per_data(image_type, value_len) byte_length = frame_x * frame_y * bytes ary = ArcData( None, None, None, params) ary.init_frames(image_type, frame_x, frame_y) for fno in l_frame : length, image_type, frame_x, frame_y = _retrieve.frame_info( self.__desc, ch_no, fno) block = _retrieve.frame_data(self.__desc, ch_no, fno, length) ary.add_frame(block) except _retrieve.error as xxx_todo_changeme2: (efunc,emes,ecode) = xxx_todo_changeme2.args self._end() raise RetrieveError(efunc,emes,ecode) return return ary[ 関数名 ] get_frames < 引数 > diag(string) : 取得したいデータの計測名 shot(int) : 取得したいデータのショット番号 sub_shot(int) : 取得したいデータのサブショット番号 channel(int,str) : 取得したいデータのチャネル番号 frames(int,[],()) : 取得したいデータのフレーム番号 first_read(bool) : True, read channel data at first.
< 返値 > ArcDataオブジェクト < 説明 > フレームを指定して、データを取得できる。 ただし、フレーム構造の計測データ(画像)のみである。 < 例外 > TypeError : チャネル番号が型があわない。 ValueError : チャネル番号が不正である。 RetrieveError : retrieveライブラリでエラーが発生した。