MATLAB®と連動するX-Stream COMオブジェクト

Application Brief LAB_831 TECHNICAL BRIEF Rev 2
MATLAB®と連動するX-Stream
COMオブジェクト・プログラミング法
はじめに ................................................................................ Error! Bookmark not defined.
MATLAB について............................................................................................................... 2
LeCroy Oscilloscope COM オブジェクトサーバー ............................................................. 2
XStream Browser ................................................................................................................3
オシロスコープ・アプリケーションへの接続 ...................................................................... 4
推奨するコーディング方法................................................................................................... 4
頻繁に使われるコード・ブロック ........................................................................................ 5
A)チャンネルの波形データへのアクセス.......................................................................... 5
B)パラメータの計測結果へのアクセス ............................................................................. 5
コード作成方法..................................................................................................................... 6
1)Out.Result や Collections のタイプである CVARS へアクセスするコードの作成方法
.......................................................................................................................................... 6
2) Out.Result オブジェクト内にあるアイテムへのアクセス方法 .................................... 7
その他のテクニック ............................................................................................................. 8
まとめ................................................................................................................................... 9
1
はじめに
MATLAB R14から構造化オブジェクトでプロパティにアクセスする構文が大きく変更されました。
R13では、サンプリングポイント間隔を取得するコードは下記のようになります。
get(app.Acquisition.Horizontal.TimePerPoint,’Value’) % <= R13
R14から次のようになります。
get(app.Acquisition.Horizontal.TimePerPoint,’Value’) % <= R14
構造化オブジェクトとやり取りするための構文は、オブジェクトを的確に、そして正しく取得するために以
前のコードに比べて複雑になりました。 アイテムとアイテムの間の構造は参照しているプロパティによっ
て異なります。 このドキュメントでは、オシロスコープのプロパティにアクセスするために必要とされる
コードの書き方を解説しています。
MATLAB について
MATLABは、MathWorksにより開発されたプログラミング言語で、機器のコントロールや測定、データの分析、
GUIベースのアプリケーションの作成、テストシステムの構築などに使われます。 MATLABはデジタルフィ
ルタや信号処理、変調、カーブ・フィッティング、統計分析のようなデータ分析に便利なコマンド・ライン
関数やインタラクティブ・グラフィックツールを提供します。 MATLABの測定器コントロール・ツール・ボ
ックスを使用して測定器(レクロイ・オシロスコープを含む)とのコミュニケーションをサポートし、 ツ
ールボックスはMATLABコードなしで機器とのコミュニケーションができるようにTest & Measurement Tool
を呼ぶためのGUI、TCP/IP通信やMatlabインスツルメント・ドライバをサポートしています。しかしながら、
このアプリケーション・ノートは、こうしたMathWorksから提供されるMATLABの使用方法を解説するもので
はありません。 ツールボックスの使用方法はwww.mathworks.com/lecroy からダウンロードできる“Using
MATLAB with LeCroy Oscilloscopes in 15 Minutes” と呼ばれる解説文章を参照ください。
LeCroy Oscilloscope COM オブジェクトサーバー
レクロイのWindowsベースのオシロスコープ“X-Stream”は、従来から使われてきたASCIIベースのリモート・
コマンドのサポートに加え、Microsoftの Component Object Model (COM)をベースとしたオートメーション・
インタフェースによるコントロールをサポートしています。 COMの使用では、アプリケーションのコントロ
ールはGPIBなどの外部のコントローラを必要とせずに、その代わりにネットワーク上のPCからDCOMを使用し
てオシロスコープを直接リモートさせることができます。 オシロスコープのアプリケーションは
Acquisition、Math、Measureなどを含んだ多くのシステムから成るオブジェクト構造のCOMサーバーです。
それぞれのシステムはAcquisitionシステムがC1、C2、C3、C4、HorizontalやTriggerを含んでいるように多
くのサブシステムを含んでいます。 その結果、プロパティやメゾットやアクションなどにアクセスする場
合、複数の構造が積み重なった階層構造にアクセスする必要があります。
2
XStream Browser
レクロイはWindowsベースのオシロスコープにXStream Browserと呼ばれるオブジェクト・ブラウザを提供し
ており、標準でインストールされています。 オシロスコープのデスクトップ上にショートカットがありま
す。 このユーティリティは、作成するアプリケーション・ソフトウェアの中で必要とするオブジェクトやプ
ロパティ、アクションを見つけるために使用し、MATLABコードのプログラミングでも間接的に使われます。
図1はXStream Browserユーティリティの動作画面を示しています。ユーザー・インタフェースは
WindwosExploerに似ています。ウィンドの左側のフレームにはツリーコントロールでオブジェクト構造を表
したナビゲータになっており、右側のフレームにはそのツリーで選択されたフォルダのアイテムが表示され
ています。
左側のフレーム中のフォルダの色に注目してください。 黄色いフォルダによって表された
システムはオブジェクトとして考えることができます。そしてそのオブジェクトは子オブジェクトを含んで
いるサブフォルダである可能性があります。 紫色のフォルダ(ほとんどの場合Resultフォルダです)もオ
ブジェクトになります。しかしわずかに違う方法でハンドリングされ、 Resultフォルダは計測や波形の結
果を含んでいます。 ピンク色のフォルダはコレクションです。 右側のフレームにあるほとんどのアイテ
ム (Resultフォルダを除く)は制御変数またはCVARsです。 CVARsはアクションやメソッドの実行やオシロ
スコープの設定にアクセスするためのインタフェースを提供しています。 XStream Browserからの見た場合、
多くのCVARsはプロパティであるように見えます。しかし、実際には、2,3例をあげるとValue、Name、Type、
Rangeのようなプロパティと共にオブジェクトがあります。 右側のフレームはそれぞれのCVARの有用なプロ
パティ列が表示されています。
図 1 – XStream Browserのビュー 左側のフレームはオシロスコープのアプリケーション階層を表します。右側の
フレームは左側のフレームのオブジェクトで選択されたコントロール変数を示します。
3
オシロスコープ・アプリケーションへの接続
オシロスコープ・アプリケーションに接続させるため、MATLABのactxserverコマンドを使用します。
app = actxserver('LeCroy.XStreamDSO.1', '172.28.15.55')
2番目の引数はオシロスコー
プのIPアドレスを入れてください。 オシロスコープ上でMATLABを動作させているときは127.0.0.1のルー
プバックアドレスをIPアドレスにセットしてください。 リモートPCからMATLABを使うときは注意が必要で
す。リモートするPCとオシロスコープの両方共にDCOMの接続を行えるように設定しておく必要があります。
(DCOMの設定はAutomation Manualを参照してください。)
初めの引数は ProgIDです。こちらは必ず'LeCroy.XStreamDSO.1'としてください。
推奨するコーディング方法
階層構造を持つオートメーション・コマンドをハンドリングするために複雑なMATLABの構文を使用すること
になりますが、コードを読みやすくするため、それぞれの階層毎にオブジェクト変数を作ることをお勧めし
ます。 MATLAB内でこの変数はハンドルとして参照されます。 コーディング方法の変更によりコードが読み
やすくなり、またデバックがしやすくなります。 ここに参考までにスクリプトで直接使われるオブジェク
ト変数のいくつかの例を示します。
例:app.Acquisition.C1.Out.Result, app.Measure.P1.Out.Result そしてapp.Math.F1.Out.Resultなど
% IPアドレス参照でのオシロスコープ・アプリケーション・オブジェクトの例
% (オシロスコープ上でMATLABを使う場合には 127.0.0.1 を使用します。)
app = actxserver('LeCroy.XStreamDSO.1', '172.28.15.55')
% オブジェクトの一番上のレベルから一つ下のオブジェクト変数を作成
acq = app.Object.Item('Acquisition');
math = app.Object.Item('Math');
meas = app.Object.Item('Measure');
PF = app.Object.Item('PassFail');
% 更に一つ下のオブジェクト変数を作成
c1 = acq.Object.Item('C1');
f1 = math.Object.Item('F1');
p1 = meas.Object.Item('P1');
p1Operator = p1.Object.Item('Operator')
% Resultsへのオブジェクト変数を作成
c1_results = c1.Out.Result;
f1_results = f1.Out.Result;
p1_results = p1.Out.Result;
オブジェクト変数の使用により、結果にアクセスするためのコードやプロパティの取得が読みやすく、デ
バックも簡単です。
% P1へのいくつかのプロパティをセット
% ( P1=per@level と仮定、又はCVARSに似た他のパラメータ)
set(p1Operator, 'LevelType', 'Percent');
set(p1Operator, 'PercentLevel', 66);
4
set(p1Operator, 'Slope', 'Neg');
% リードバックやいくつかの結果の表示
p1_Val = p1_results.Value
p1_status = p1_results.Status
p1_time = p1_results.FirstEventTime
下記のコードは上記コマンドと同じですが、中間オブジェクト変数を使っていません。
% オブジェクト変数を使わない同じコード
set(app.Object.Item('Measure').Object.Item('P1').Object.Item('Operator'), 'LevelType', 'Percent')
set(app.Object.Item('Measure').Object.Item('P1').Object.Item('Operator'), 'PercentLevel', 66)
set(app.Object.Item('Measure').Object.Item('P1').Object.Item('Operator'), 'Slope', 'Neg') val =
get(app.Object.Item('Measure').Object.Item('P1').Out.Result, 'Value');
status = get(app.Object.Item('Measure').Object.Item('P1').Out.Result, 'Status');
evtime = get(app.Object.Item('Measure').Object.Item('P1').Out.Result, 'FirstEventTime');
頻繁に使われるコード・ブロック
このセクションは頻繁に使われるコード・ブロックについての記述です。
A) チャンネル Result へのアクセス
% 階層の中でのC1 resultsへのアクセス
app = actxserver('LeCroy.XStreamDSO.1', '172.28.15.55')
acq = app.Object.Item('Acquisition');
c1 = acq.Object.Item('C1');
c1_results = c1.Out.Result;
% 配列の取得
c1_data = get(c1_results, 'DataArray', -1, -1, 0, 1);
% C1のプロパティの取得
c1_AcqTStamp = c1_results.FirstEventTime;
c1_status = c1_results.Status;
c1_NumSweeps = c1_results.Sweeps;
c1_VperStep = c1_results.VerticalPerStep;
B) パラメータ Result へのアクセス
% 階層構造の中でP1 results へのアクセス
app = actxserver('LeCroy.XStreamDSO.1', '172.28.15.55')
meas = app.Object.Item('Measure'); p1 = meas.Object.Item('P1');
p1_results = p1.Out.Result;
p1_meanresults = p1.Object.Item('mean').Result;
p1_numresults = p1.Object.Item('num').Result;
% 配列の取得
P1_array = get(p1_results, 'ValueArray', -1, 0, 1)
% 最後の計測データや他のプロパティを取得
p1_Val = p1_results.Value
5
p1_status = p1_results.Status
p1_statdesc = p1_results.StatusDescription
p1_res = p1_results.VerticalResolution
p1_time = p1_results.FirstEventTime
p1_mean = p1_meanresults.Value
p1_num = p1_numresults.Value
コード作成方法
1) Out.Result や Collections の CVARS へアクセスするコードの作成方法
この作り方はXStream Browserの左側のフレーム中にある黄色いフォルダで表されているオブジェクトを選
択している時、フレームの右側にある制御変数にアクセスする方法です。
A) XStream Browserで制御変数を見つけます。 例えば、入力チャンネルの電圧軸の設定を変更するには
VerScale CVARが使われます。 app.Acquisition.C1.VerScale がそのパスになります。
B) 階層の中でのそれぞれのオブジェクトを取得するために階層レベルのオブジェクト変数を作成するのに
Object.Item(„ Object Name‟ ) 構文を使用します。 例として、コードの下記のラインはVerScaleが含まれ
ているフォルダの階層を取得しています。
app = actxserver('LeCroy.XStreamDSO.1', '172.28.15.55')
acq = app.Object.Item('Acquisition');
c1 = acq.Object.Item('C1');
ライン2,3はそれ以前の行で作成されたオブジェクト変数を使用していることに注意してください。 そ
のため、ドキュメントの初めにあるような長くて読みづらいコードよりもオブジェクト変数を階層毎に持つ
方が分かりやすくなります。
メジャーのapp.Measure.P1.mean.Resultやapp.Measure.P1.num.Resultの例
meas = app.Object.Item('Measure');
p1 = meas.Object.Item('P1');
p1_meanresults = p1.Object.Item('mean').Result;
p1_numresults = p1.Object.Item('num').Result;
C) 読み込みや書き込みを行う値が入っている制御変数へはその制御変数のプロパティへアクセスするため
にgetやsetファンクションを使います。 その Valueプロパティは もっとも良く使われますが、Rangeを含
む他の物も取得可能です。
これはCh1のVerScale CVARのプロパティの取得や設定の例です。
% VerScale CVARの値の読み込み
C1VDiv = get(c1.Item('VerScale'), 'Value')
% VerScale CVAR のRangeや Type プロパティ の読み込み
range = get(c1.Item('VerScale'), 'Range')
type = get(c1.Item('VerScale'), 'Type')
% VerScale を 0.789 V/div に設定
set(c1.Item('VerScale'), 'Value', 0.789)
6
D) アクションの制御変数へは, invokeファンクションを使います。 アクション CVARs は参照されるこ
とができるActNow と呼ばれるインタフェースを持つことができますがこれは必要としません。
% Clear Sweepsアクションの実行
app.invoke('ClearSweeps','ActNow');
% AutoSetup アクションの実行
app.invoke('AutoSetup','ActNow');
% MathシステムへのResetAll アクションの実行
math.invoke('ResetAll','ActNow');
E) メゾットの制御変数にはinvokeファンクションを使います。メゾットを実行するために必要な変数を含
んでいます。
% トリガーの実行なしで5秒のタイムアウトを条件としてAcquireメゾットを実行します。
acq.invoke('Acquire', 5, false);
2) Out.Result オブジェクト内にあるアイテムへのアクセス方法
この作り方はXStream Browserの中で紫色のフォルダに表されている選択されているオブジェクトの右側の
制御変数へ適用されます。
A) XStream Browserで制御変数を見つけます。
例として、計測パラメータのP1が設定され、そして実効可能な状態であるならばP1のValueプロパティは取
得可能です。 このパスはapp.Measure.P1.Out.Result.Valueになり、その値はCVARではなくプロパティにな
ります。CVARsのAcquisitionオブジェクトのような黄色いフォルダとResultsフォルダでは、その中にある
アイテムはとても異なっています。
B) ) Resultオブジェクトのペアレントオブジェクトを含んでいないオブジェクトは階層レベル毎にオブジ
ェクト変数を作成するためにObject.Item(„ Object Name‟ ) 構文を使用します。
例として、下記のコードはResultオブジェクトのペアレントオブジェクトであるOutオブジェクトを含んで
いるP1オブジェクトをItem構文により取得しています。
app = actxserver('LeCroy.XStreamDSO.1', '172.28.15.55')
meas = app.Object.Item('Measure');
p1 = meas.Object.Item('P1');
C) 下記の構文を使いResultオブジェクト変数を作成
p1_results = p1.Out.Result
D) Resultオブジェクト内でプロパティを読むため、2つの構文の一つを使用します。
p1_val = p1_results.Value or p1 = get(p1_results,'Value')
初めの構文は目で見ても簡単であり、特に複数のResultプロパティを返すときには明白です。
7
E) DataArrayやValueArrayのような多数の値を読むためにはgetファンクションを使います。 ValueArrayは
パラメータの全ての計測された値を返します。DataArrayは波形のデータを返します。 DataArrayや
ValueArrayは値の型式やデータ数など必要な幾つかの変数を含んでいます。 ValueArrayやDataArrayにつ
いてはAutomation Manual (rev B 以上)を参照してください。
P1_array = get(p1_results, 'ValueArray', -1, 0, 1)
C1_data = get(c1_results, 'DataArray', -1, -1, 0, 1)
その他のテクニック
MATLABでは、セミコロンは各行で発生した出力を抑えることができます。 オシロスコープ・オブジェクト
の構造について調査、収集をする時にはセミコロンを省くと簡単に調べることができます。
例:
A) Acquisition のオブジェクト変数の作成
>> acq = app.Object.Item('Acquisition')
acq =
Interface.LeCroy_Maui_Persona_Interfaces_1.0_Type_Library.ILecMauiAcquisitionAutomation
B) パラメータ Result オブジェクト変数の作成
>> P1OutResult = P1.Out.Result
P1OutResult =
C) 波形
Interface.LeCroy_ResultAutomationInterfaces_1.0_Type_Library.ILecAutomationParamResult
Result オブジェクト変数の作成
>> C1_Result = C1.Out.Result
C1_Result =
Interface.LeCroy_ResultAutomationInterfaces_1.0_Type_Library.ILecAutomationWformResult
BとCではわずかに異なっていることに注意してください。
BはParamRewult、CはWFormRewult
D)
inspectファンクションはCVARのプロパティ値をすばやく見るのに使うことができます。
>> inspect(c1.Item('VerScale'))
8
まとめ
すべてのプログラミング言語は構文条件があり、正しい構文を学ぶことは面倒なことで、時間をかけなけれ
ばなりません。しかし、レクロイのX-Streamオブジェクトの構造やMATLABソフトウェア環境などの基礎とな
る方法を理解することで、MATLABでLeCroy X-Stream COM オブジェクトプログラミングを学ぶために必要な
時間は短縮することができます。
更に多くのことはMATLABやX-Streamのドキュメントを参照してください。
MATLAB® is a registered trademark of The MathWorks, Inc.
9