MATLABでR&S RTC1002の波形取り込み

##はじめに
MATLABでオシロの波形を取り込みたかったため、手持ちのRTC1002(Rohde&Schwarz)をPCに接続し、MATLABで波形をプロットするまでを実施した。
MATLABはIVIやVXIplug&play、汎用のSCPIコマンドに対応しているとのことだが、計測器のリモートコントロールの常識？について知らなかったため、環境構築として何をしたら良いか悩んだ。

##MATLAB環境
・MATLAB R2021b 64bit
・MATLABツールボックス：Instrument Control Toolbox

##実施環境
・ノートPC（windows10 64bit）
・オシロスコープ（RTC1002）
・ルータ（DHCPサーバ）
・LANケーブル

##参考
・[Rohde & Schwarz Instruments and MATLAB](https://jp.mathworks.com/products/instrument/supported/rohde-and-schwarz.html)
・[How to use Rohde & Schwarz Instruments in MATLAB - Application Note](https://cdn.rohde-schwarz.com/pws/dl_downloads/dl_application/application_notes/1ma171/1MA171_12e_Instruments_in_MATLAB.pdf)

##手順1：RTC1002をwebブラウザ経由で操作
RTC1002はwebブラウザが搭載されており、正常にLANに接続できると、webブラウザでRTC1002のIPを入力することでRTC1002の操作ができる。詳細はRTC1002の[ユーザーズマニュアル](https://www.rohde-schwarz.com/jp/manual/r-s-rtc1000-manuals-gb1_78701-508163.html)の12章"Network Connections and Remote Operation"を参照。
RTC1000はデフォルトでDHCPクライアントとなっているので、DHCPサーバが立っている環境であれば、何も考えずにLANに接続し、SETUPボタンからRTC1002に振られたIPを確認するだけでよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369152/b22506f9-993a-a067-1c13-e2ed10a0b82f.png)

##手順2：ノートPCにR&Sの提供するVXI driverをインストール
RTC1000はSCPIコマンドによる制御、もしくはR&Sのwebページで配布されているVXIドライバーによる制御に対応している。IVIドライバーに対応していれば、[Quick-Control Oscilloscopeによる制御](https://jp.mathworks.com/help/instrument/reading-waveforms-from-an-oscilloscope-using-a-quick-control-oscilloscope-object.html)が可能であるようだが、IVIドライバーの配布はない。VXIドライバーを使う方がSCPIコマンドを直接使うのにに比べてエラー処理等を実施しているというような記載がMATLABにあったため、VXIドライバーを使用することとした。
[VXIplug&play x64 driver hmo](https://www.rohde-schwarz.com/us/driver/rtc1000/?filter%5B_facet.DevelopmentEnvironment%5D%5B0%5D=MATLAB)をダウンロードしインストールする。

##手順3：ノートPCにR&Sの提供するVISAをインストール
VISAは計測器とのインターフェースを提供するライブラリのようで、物理層の違いも吸収してくれる。[RS VISA 5.12.3 Setup for Windows](https://www.rohde-schwarz.com/jp/applications/r-s-visa-application-note_56280-148812.html)をダウンロードしインストールする。

##手順4：VISAに同梱されたアプリで動作確認
VISAをインストールすると、"R&S VISA⇒Tester 64bit"がインストールされるので、これを実行する。
左上の"Find Resource"タブをクリックし、"LXI(mDNS)"と"VXI-11"のチェックボックスをONにして、更新マーク？をクリックする。そうすると、LANで接続したRTC1002がResoucesとして"TCPIP0::192.168.0.6::inst0::INSTR"(環境によって中身は変わる)が発見されるので、これを選択して"OK"を押す(後に再度実施した際に何も発見されなかったが、"TCPIP0::192.168.0.6::inst0::INSTR"への接続はできた)。元の画面で"Connect"を押し、それっぽいログが表示されていればオシロがVISA経由で接続されている。
VISA経由の動作確認として、"Tests"タブのPreformance Testを実施する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369152/ce672302-8500-f870-48cf-f32ae897b85a.png)

##手順5：VXIドライバーのラッパーを作成
MATLAB上でVXIドライバーを使ってVISA経由でRTC1000に接続するが、VXIドライバーはインストールしたままでは使えず、[MATLABとしてのラッパーを作成する必要がある](https://jp.mathworks.com/products/instrument/supported/vxi-plug-and-play.html)。ラッパーの作成は、MATLAB上で

```
midedit
```

と入力し、上記でインストールしたVXIドライバーをインポートし、これを保存する(hmo.mddとした)ことでラッパーが作成される。詳細な手順は[こちらのImporting with the MATLAB Instrument Driver Editor (midedit)](https://jp.mathworks.com/help/instrument/vxi-plug-and-play-drivers.html)を参照。

##手順6：RTC1002の接続・波形プロット
以上で準備は終わりで、あとはMATLAB上で適宜関数を呼び出してRTC1002の波形を取り込み、データをプロットする。

```
%instrhwinfo('vxipnp')
%instrhwinfo('vxipnp','hmo')
deviceObj=icdevice('hmo.mdd','TCPIP0::192.168.0.6::inst0::INSTR')
connect(deviceObj)
%disp(deviceObj)
%get(deviceObj)

waveformArray = zeros(100000,1);
groupObj = get(deviceObj, 'Waveformacquisition');
[waveformArray, actualPoints, initialX, xIncrement] = invoke (groupObj, 'readwaveform', 1, length(waveformArray), 5000, waveformArray);
plot(waveformArray)

disconnect(deviceObj)
%delete(deviceObj)
```
RTC1000の外部出力機能で10kHz, 115mVppのsin波を出力し、これをch1に入力して上記コマンドでプロットされた波形は次の通り。配列の長さを100,000としたが、データ点数はそこまでないため途中で切れている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369152/182d1beb-bd34-b377-5f6e-1dd4114c1f02.png)

##関数の定義の確認方法
MATLABの"アプリ"タブをクリックし"Instrument Control"をクリックすると、"Test & Measurement Tool"が開く。前述のコマンドによりdeviceObjが生成されていると、"Instrument Object"⇒"Device Objects"⇒"VXIPnPInstrument-hmo"というのが生成される。これを選択すると関数やプロパティが選択でき、GUIで関数の実行やプロパティのSet/Getができる。また、実行した内容は"Session Log"のタブでコードと記載されるので、これを参考にコーディングできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369152/8e8ebeaf-1bc7-26bf-a85d-c33f7b861883.png)

VXIドライバーのHelpはVXIドライバーをインストールしたフォルダに"hmo_vxi.chm"と"hmo_attr.chm"が入っているので、これを参照する。ただし、このHelpはVXIドライバーのHelpであり、MATLABでVXIドライバーをラップした関数のHelpではないことに注意が必要。例えば、HelpにはdeviceObjを渡すように書いているが、MATLABのラッパーではdeviceObjの要素を適宜選択して渡すことになっている様子。

MATLABのVXIドライバーをラップした関数の説明は[こちらを参照](https://jp.mathworks.com/help/instrument/vxi-plug-and-play-driver.html?s_tid=CRUX_lftnav)。

以上、参考になれば幸いです。