# SCPI instruments

> マルチメーター、電源、電子負荷、データ収集装置など、SCPI を話すベンチ測定器を、TCP、シリアル回線、または VISA 経由の USB と GPIB で扱います。それぞれのつなぎ方、「測定器」のカード、クエリと書き込みコマンド、機器検出、そして 2 つの完全な例です。

**SCPI instruments** ドライバーは、SCPI を話すベンチ測定器を読み書きします。SCPI は IEEE 488.2 の試験装置のコマンド言語で、マルチメーター、電源、電子負荷、Fluke 1586A Super-DAQ のようなデータ収集装置、校正器などが話し、Keysight、Rigol、Tektronix、Siglent、GW Instek、B&K Precision、Fluke などのメーカーが作っています。各タグは測定器に `MEAS:VOLT:DC?` や `READ?` のようなクエリを送ってその応答を読み、書き込むタグは `VOLT 5` のように値を入れたコマンドを送ります。LabVIEW のプログラムが VISA を通して行うやり取りを、ブロックダイアグラムで配線する代わりにパネルで設定するもので、値はほかのどのタグの値とも同じところに届きます。Logic、ダッシュボード、そして [Process](process) の試験台の実行です。

測定器は、その機器を作るときに選ぶ 3 つの方法のどれかでつなぎます。

| 通信方式 | 測定器へのつなぎ方 | 向いているもの |
| --- | --- | --- |
| **TCP（LXI ソケット）** | 測定器のホストとポートにある SCPI ソケットで、ほとんどの LXI 測定器では 5025 です。このコンピューターには何もインストールしません。 | LAN ポートのある測定器。 |
| **VISA（USB、GPIB、ネットワーク）** | このコンピューターにインストールされた VISA を通して、測定器の VISA リソース名でつなぎます。製品は VISA をインストールしません。NI-VISA か Keysight IO Libraries Suite のどちらかがインストールされていれば、それを使います。 | USB や GPIB インターフェースにつながる測定器、または VISA が自分の名前で届くネットワークの測定器。 |
| シリアル回線上 | このドライバーのシリアル回線で、回線上のほかの測定器と共有し、要求は 1 つずつです。 | RS-232 か RS-485 のポートを持つ測定器。 |

シリアル回線上の測定器は回線の下に入るので、ツリーのその部分は [Generic serial and TCP](driver-generic-serial-tcp) と同じく **ドライバー → 回線 → 機器 → タグ** と読めます。TCP や VISA でつなぐ測定器はドライバーの下に置かれ、ほかのどのドライバーの機器とも同じようにフォルダーに整理でき、**ドライバー → フォルダー → 機器 → タグ** となります。機器は作られた側にとどまります。TCP と VISA は切り替えられますが、回線とネットワークのあいだを移ることはありません。

## ドライバーのページ {#the-drivers-page}

見出しの下の行は「シリアル回線には 1 本のバスを共有する測定器が並び、TCP や VISA でつなぐ測定器はドライバーの直下に置きます。回線か機器を追加してから開き、クエリを設定してください。」と述べ、ページには上から順に次のものがあります。

| 部分 | 中身 |
| --- | --- |
| **シリアル回線** | ドライバーの回線で、タイトルの右にある**回線を追加**で増やします。**回線**、**物理的な組**（ポート · ボーレート · 形式。このドライバーの回線にはタイムアウトがないので含みません）、**機器**、**状態**、そして操作の開く、有効化、無効化、削除。空のときは「シリアル回線はまだありません。」と表示します。 |
| **スキャンの範囲** | VISA が一覧する測定器のほかに機器検出が問い合わせるアドレスです。[機器検出](#discovery)を参照してください。Connector の構成の権限があるときだけ描かれます。 |
| **機器** | 回線上のものも含めたドライバーのすべての機器で、列はどのドライバーの[機器の表](connector-drivers#the-device-table)とも同じです。タイトルの右にある**機器を追加**で増やし、これは TCP の機器を作ります。空のときは「機器はまだありません。」と表示します。 |

見出しはかっこの中に機器の数を示し、ツリーのドライバーの行は回線が 1 本でもあれば両方の段を数えます（「回線 1 本 · 機器 2 台」）。ドライバーのバーには**機器検出**があります。ドライバーの行を右クリックすると**機器を追加**、**回線を追加**、**新しいフォルダー**、**再読み込み**、**機器検出**が出て、区切り線のあとに**ドライバーを削除**が出ます。欄の新規…メニューでは、このドライバーの項目に**新しい機器**、**新しいシリアル回線**、**新しいフォルダー**があり、そのあとに回線、フォルダー、機器が並びます。追加したドライバーは、回線や機器があってもなくても、ツリーのドライバーのフォルダーの下に並びます。

## シリアル回線 {#serial-line}

このドライバーの回線は、[シリアル回線](connector-lines)で説明している回線で、項目は [Generic serial and TCP](driver-generic-serial-tcp#serial-line) ドライバーの回線と同じです。そのページは「1 つの物理的なシリアルバスです。つながる計器が共有するポートの設定で、要求は 1 つずつ送ります。」と述べ、「物理的な回線」のカードには**名前**、**シリアルポート**（**再読み込み**付き）、**ボーレート**、**シリアルの形式**があり、形式は 8 ビットの 6 個と 7 ビットの 4 個を合わせた 10 個すべてを選べます。伝送モード、応答のタイムアウト、トランザクションの最小間隔、ユニットを検出するカードはありません。各測定器が自分の「測定器」のカードで、メッセージの終わりと応答を待つ時間を決めるからです。また測定器はアドレスではなく問い合わせる内容で区別するので、回線の「機器」の表にはユニット ID の列がありません。

ここで作った回線は無効の状態で生まれるので、ポートが開く前にポートの設定を入力できます。ポート、ボーレート、形式は回線が無効のあいだだけ変えられます。回線の上、またはその右クリックのメニューで**機器を追加**すると、その回線にこのドライバーの機器を作ります。回線は、作られたときのドライバーにずっと属します。ほかのドライバーの機器はその回線に入らず、1 つのポートは、回線がどのドライバーのものであっても 1 本の回線にだけ属します。

ドライバーは回線上のすべての測定器のためにポートを一度だけ開き、要求を 1 つずつ送って、次を送る前にその応答を待ちます。ポートが開いているあいだは DTR をオンにしておきます。Keysight 34401A や E36xx の電源のように DTR と DSR で出力のペースを決める測定器は、DTR がオフだと何も送らないからです。故障したポートは、故障が続くあいだ 1 秒から 1 分まで倍々に延びる待ち時間の後で開き直し、そのポートの測定器はすべて、最初に接続したときと同じように初期設定コマンドを送り直して準備し直します。

## 機器 {#device}

### 接続 {#connection}

| 項目 | 意味 | 既定値 |
| --- | --- | --- |
| **通信方式** | ドライバーの下に作った機器：**TCP（LXI ソケット）**、「ステーションが測定器の SCPI ソケットに、そのホストとポートで接続します。ほとんどの LXI 測定器では 5025 です。」、または **VISA（USB、GPIB、ネットワーク）**、「ステーションが、このコンピューターにインストールされた VISA を通して、VISA のリソース名で測定器を開きます。」2 つは切り替えられます。回線上の機器は代わりに自分の回線を示します。 | **TCP（LXI ソケット）** |
| **ホスト** | TCP：測定器のホスト名か IP アドレス。 | 空 |
| **ポート** | TCP：測定器が SCPI に応答するポートで、1 から 65535。欄が空のときは 5025 が灰色で表示され、測定器はそのポートで呼び出されます。 | 5025 |
| **VISA リソース** | VISA のとき、ホストとポートの代わりに：「VISA が一覧する測定器の名前です。例：USB0::0x0957::0x1A07::MY12345678::INSTR、GPIB0::22::INSTR。機器検出で入力されます。」NI MAX と Keysight Connection Expert がその測定器に表示する名前です。 | 空 |
| **シリアル回線 · 固定** | 回線上の機器：回線の名前と、その下にポート、ボーレート、形式。読み取り専用です。 | 追加したときの回線 |

新しい機器は TCP の機器です。「ホストがまだ入力されていません」と表示し、ホストが入るまで接続しません。VISA の機器はどのホストも呼び出さず、ホストを待つこともありません。VISA に切り替えても、TCP に戻すときのためにホストとポートは残り、TCP に切り替えてもリソースは残ります。ドライバーが扱えない機器は保存されず、操作ログ帯が理由を伝えます。

| 入力したもの | 操作ログ帯の表示 |
| --- | --- |
| 1 から 65535 の外のポート | 「1 から 65535 のポートを入力するか、5025 にするなら欄を空にしてください。」 |
| リソースのない VISA | 「測定器の VISA リソースを入力するか（例：USB0::0x0957::0x1A07::MY12345678::INSTR）、機器検出を実行してください。」 |
| 空白か通常の ASCII 以外の文字を含むリソース | 「VISA リソースに空白か、通常の ASCII 以外の文字が含まれています。VISA が一覧するとおりに入力してください。」 |

見出しに出る Base URI は実行時のアドレスです。`scpi://tcp/<host>:<port>`、`scpi://visa/<resource>`、`scpi://serial/<line id>/<port>/<baud>/<format>` のどれかの後に、終端文字（`term`）、応答のタイムアウト（`timeout`）、書き込みの確認（`check`）、初期設定コマンド（`setup`。1 つずつ順に並び、`%0A` で区切られます）が続きます。回線上の機器の複製はその回線にとどまり、TCP や VISA の機器の複製はドライバー自身の階層に置かれます。

### 「測定器」のカード {#the-instrument-card}

「接続」のカードの下にある**測定器**のカードは、測定器が何であり、ステーションがどう話しかけるかを示します。

| 項目 | 意味 | 既定値 |
| --- | --- | --- |
| **識別情報（\*IDN?）** | 読み取り専用：「ステーションが接続したときに測定器が \*IDN? に答えた内容です。メーカー、型式、シリアル番号、ファームウェアが並びます。」測定器が答えるまでは「まだ応答がありません」と表示し、機器が接続されなくなると再びそう表示します。`*IDN?` に答えない測定器も、識別情報なしでそのまま読み取ります。 | |
| **終端文字** | **LF（改行）**、**CR LF（復帰、改行）**、**CR（復帰）**：「送るコマンドと読む応答のそれぞれの終わりを示します。ほとんどの測定器は LF で、一部のシリアル機器は CR LF か CR を使います。」 | **LF（改行）** |
| **応答のタイムアウト（ms）** | 100 から 60000：「クエリが応答を、書き込みが測定器のエラーキューを待つ時間です。測定に時間がかかるときは長くします。」 | 2000 |
| **書き込みの確認** | 「SCPI はコマンドに応答を返さないため、書き込みはその後で測定器に問い合わせて確認します。」それぞれの選択肢が送るものは[書き込み](#writing)にあります。**エラーキュー（SYST:ERR?）**、**なし：送信した時点で確定**、またはコマンドが終わってからエラーキューを見る **完了確認の後にエラーキュー（\*OPC?、SYST:ERR?）** です。 | **エラーキュー（SYST:ERR?）** |
| **初期設定コマンド** | 1 行に 1 コマンドで、最大 32 個、1 つ最大 512 文字：「ステーションが接続するたびに、1 行に 1 つずつ順に送ります。例：\*RST、CONF:VOLT:DC 10。それによるエラーは診断ログに残ります。」 | 空 |

ステーションが測定器に接続するたび、またシリアル回線がポートを開き直すたびに、ステーションは次の順に送ります。書き込みの確認がエラーキューを読むときは `*CLS`、次に初期設定コマンド、それからエラーキューを診断ログに読み込み（初期設定コマンドが起こしたエラーはそこに残り、機器を止めません）、最後に `*IDN?` を問い合わせ、その応答を「識別情報」の欄が表示します。カードが受け付けない値は保存されず、操作ログ帯が理由を伝えます：「応答のタイムアウトは 100 から 60000 ms の間にしてください。」、「初期設定コマンドに、活字体の引用符など、通常の ASCII 以外の文字が含まれています。そうした文字はどの測定器も読めません。」、「初期設定コマンドは 32 個まで、1 つ 512 文字までにしてください。」SCPI は通常の ASCII なので、マニュアルから活字体の引用符やノーブレークスペースごとコピーしたコマンドは、読めない測定器に送られる代わりに、入力したところで拒否されます。

### このコンピューターの VISA {#visa-on-this-computer}

製品は VISA を同梱せず、インストールもしません。VISA の機器は、このコンピューターにすでにある 64 ビットの VISA ライブラリ（`visa64.dll`）を通して測定器を開きます。NI-VISA（LabVIEW がインストールします）と Keysight IO Libraries Suite のどちらもここに置くライブラリです。必要なのは VISA の機器だけで、TCP やシリアル回線の測定器は VISA なしで接続します。ステーションは機器を待たずに、ライブラリを読み込めるかを自分で確かめます。ドライバーのページ、VISA の機器のページ、またはエージェントが最初に尋ねたときと、ないあいだは 30 秒ごとです。Connector が起動するまでは VISA があるかどうかわからないので、何も表示しません。ないあいだは次のとおりです。

| どこで | 何を伝えるか |
| --- | --- |
| VISA の機器のページ | 注意のお知らせ「このコンピューターには VISA がインストールされていません」と、下の手順です。2 つのリンクは NI と Keysight のページをコンピューターのブラウザーで開きます。 |
| ドライバーのページ | ドライバーに VISA の機器が 1 台以上あるあいだ、同じお知らせを表示し、「インストールするまで、このドライバーの VISA の機器はオフラインのままで、設定はそのまま保たれます。TCP やシリアル回線の機器には影響しません。」と添えます。TCP とシリアルの機器だけのドライバーには表示しません。 |
| VISA の機器の最後のエラー | 同じ手順を、ドライバー自身の原因と同じく英語で示します。機器はオフラインのままで、設定は保たれます。 |
| 「通信方式」のリスト | VISA を引き続き選べるので、VISA をインストールする前に機器を準備しておけます。 |
| 機器検出 | 「スキャンの範囲」のカードに入力したホストだけに問い合わせ、2 つのページとともにそのことを伝えます：「このコンピューターには VISA がインストールされていないため、スキャンは VISA を通した USB、GPIB、ネットワークの測定器を一覧にできず、入力したホストだけに問い合わせます。一覧にするには、64 ビット版の VISA を管理者としてインストールしてください」に続けて、NI-VISA と Keysight IO Libraries Suite のアドレスを示します。この文はスキャンを締めくくる行に残ります。 |
| エージェント | `driver_capabilities` は Scpi ドライバーの `prerequisite` の下で手順を示し、`installed` は false、`neededBy` は VISA の機器を挙げます。`device_discover` は `cut` で同じことを伝えます。 |

インストールの手順：

1. NI のページ [NI-VISA Download](https://www.ni.com/en/support/downloads/drivers/download.ni-visa.html) から NI-VISA を、または Keysight のページ [IO Libraries Suite Downloads](https://www.keysight.com/us/en/lib/software-detail/computer-software/io-libraries-suite-downloads-2175637.html) から Keysight IO Libraries Suite をダウンロードします。
2. どちらでも使えます。LabVIEW のあるコンピューターには NI-VISA がすでに入っています。NI のページはダウンロードの前に NI アカウントでのサインインを求めます。Keysight のページはインストーラーに直接リンクしています。最新の Windows 用インストーラーを選んでください。64 ビット版 Windows では、どちらも Ganter Lab が認識する唯一の VISA である 64 ビット版をインストールします。
3. インストーラーは C: ドライブのフォルダーから管理者として実行し（Keysight のものはほかのドライブからはインストールできません）、再起動を求められたらコンピューターを再起動します。

32 ビットのライブラリ（`visa32.dll`）だけをインストールした VISA（32 ビット版 Windows 用のものなど）は認識されません。Ganter Lab が読むのは 64 ビットの `visa64.dll` だけです。

インストール後 30 秒以内にお知らせは消え、Ganter Lab を再起動しなくても、VISA の機器は今の設定のまま接続します。ネットワークポートのある測定器なら、VISA なしで TCP でもつなげます。

## タグのアドレス {#tag-addressing}

このドライバーのタグは、測定器にクエリを送ります。その**信号源**のカードには次の項目があります。

| 項目 | 意味 | 既定値 |
| --- | --- | --- |
| **クエリ** | タグが問い合わせる内容で、測定器のプログラミングマニュアルの書き方のままです：`MEAS:VOLT:DC?`、`READ?`、`SOUR:VOLT?`、`OUTP?`。通常の ASCII で、最大 512 文字。書き込みのみのタグは何も問い合わせないので、クエリは不要です。 | 必須 |
| **応答内の値** | 読み取るタグ。「空なら応答全体を読みます。数字を入れると、カンマ区切りの応答のその値を 1 から数えて読みます。例：READ? の 3 番目のチャンネルなら 3。」欄が空のあいだは「応答全体」と表示します。1 から 1000。 | 空 |
| **書き込みコマンド** | 書き込むタグ：「書き込みで送るものです。値を入れる位置に {value} を置きます。例：VOLT {value}、CURR {value:0.000}。Boolean は 1 か 0 で送ります。Boolean のタグでは、\*TRG のような {value} のないコマンドを、true を書き込んだときに送ります。」 | 必須 |

タグのアクセスが使わない項目は描かれず、また使うときのために値を残します。データ型は Boolean、Int32、Int64、Float、Double、String で、既定は Float です。項目が成り立たないタグは保存されず、タグのページが足りないものを伝えます。

| 入力したもの | タグのページの表示 |
| --- | --- |
| 読み取るタグにクエリがない | 「測定器に送るクエリ（例：MEAS:VOLT:DC?）を入力するか、タグを書き込みのみにしてください。」 |
| 活字体の引用符など通常の ASCII 以外の文字を含むクエリ | 「クエリに活字体の引用符など通常の ASCII 以外の文字が含まれているか、512 文字を超えています。」 |
| 1000 を超える応答内の値 | 「応答内の値は 1 から 1000 で数えます。応答全体を読むときは空にしてください。」 |
| 書き込むタグに書き込みコマンドがない | 「書き込みで送るコマンド（例：VOLT {value}）を入力するか、タグを読み取りのみにしてください。」 |
| `{value}` でも `{value:FORMAT}` でもない波かっこ、または 2 回目の値 | 「書き込みコマンドに、通常の ASCII 以外の文字、{value} でも {value:FORMAT} でもない波かっこ、または 2 回目の値が含まれています。」 |
| Boolean でないタグで `{value}` のないコマンド | 「書き込みコマンドの値を入れる位置に {value} を置いてください。{value} なしでコマンドを送れるのは Boolean のタグだけです。」 |
| 数値を整えない書式、または Boolean や String のタグに付けた書式 | 「value: の後の書式は、0.000 や F2 のように数値を整えるものにしてください。書式を付けられるのは数値のタグだけです。」 |

読み取り専用の**取得元のアドレス（バス上）**の行は、ドライバーが受け取るものを示します。応答全体を読むタグなら `ask=READ?`、その 3 番目の値なら `ask=READ?&field=3`、読み書きするタグなら `ask=VOLT?&write=VOLT {value}`、書き込みのみのタグなら `write=*TRG` です。

## 読み取り {#reading}

タグの読み出し周期ごとに、ステーションはクエリを送り、応答のタイムアウトのうちに終端文字までの応答を 1 つ読みます。取り出したテキスト、つまり応答全体かタグが指す値は、どのドライバーでも同じく、タグ自身の段階が変換する前にタグの型として読まれます（[値の変換経路](connector-value-pipeline)を参照）。

| 応答の中身 | 読み方 |
| --- | --- |
| `+1.23456789E+00`、`-0.5`、`12` | Float か Double：その数。ステーションの言語にかかわらず、小数点はピリオドです。 |
| `9.91E37` | SCPI の非数で、測定器に読み値がないときの応答です。Float か Double のタグでは NaN になり、そのタグの[無効な読み値](connector-value-pipeline#the-device-answered-without-a-number)の段階が扱います。Int32 か Int64 のタグでは拒否されます。オーバーロードを表す `9.9E37` は、その数のままです。 |
| `+1.20000000E+01` | Int32 か Int64：12。小数は拒否されます。 |
| `1`、`ON`、`0`、`OFF` | Boolean：1 と ON が真、0 と OFF が偽。true、false、yes、no も読みます。 |
| `"Ready, armed"` | String：引用符を外した文字で、2 つ続いた引用符は 1 つになります。引用符の中のカンマは値を区切りません。 |

| 状況 | 読み取りがすること |
| --- | --- |
| 1 つの機器で同じクエリを送るタグ | その中で最も短い読み出し周期の半分のあいだ、1 つの応答を共有します。多チャンネルの `READ?` の各チャンネルを読むタグは、測定 1 回分で済みます。書き込みが 1 つでもあると、保持していた応答はすべて捨てます。 |
| 応答のタイムアウトのうちに応答がない | 読み取りの失敗です。機器がエラーキューを読むときは、ステーションが続けて `SYST:ERR?` を問い合わせるので、書き間違えたクエリは `-113,"Undefined header"` のような測定器自身の項目を理由に含めて失敗します。何を表示するかは、[応答しなかった機器](connector-value-pipeline#the-device-did-not-answer)についてのタグの方針が決めます。 |
| タグの番号より値の少ない応答 | 読み取りの失敗で、応答に値がいくつあるかを伝えます。 |
| タグの型に収まらないテキスト | 読み取りの失敗で、そのテキストを示します。 |

## 書き込み {#writing}

書き込みは、ほかのどのドライバーとも同じ経路を通ります。書き込み欄は工業値を受け取り、生の値を送る前に変換の段階を逆にたどります（[Connector](connector) を参照）。送るコマンドは、書き込みコマンドの `{value}` の位置に値を入れたものです。数値はインバリアントカルチャで、同じ数に読み戻せる最短のテキストにするか、`{value:FORMAT}` で .NET の数値書式に従って整えます（`CURR {value:0.000}` は 1.5 を `CURR 1.500` として送ります）。Boolean は、どの SCPI の Boolean 引数も受け付ける `1` か `0` で送り、テキストはそのまま送ります。必要な引用符はコマンドの側が持ちます（`DISP:TEXT "{value}"`）。非数と無限大は、何かを送る前に拒否されます。Boolean のタグでは、`*TRG` のような `{value}` のないコマンドを true を書き込んだときに送り、false の書き込みは拒否されます。

| 書き込みの確認 | 送るもの | 書き込みが伝えること |
| --- | --- | --- |
| **エラーキュー（SYST:ERR?）** | `*CLS`、コマンド、`SYST:ERR?` | キューがエラーなし（`0` か `+0,"No error"`）と答えたら完了です。それ以外の項目は、`-222,"Data out of range"` のような測定器自身の言葉で書き込みを拒否します。応答がなければ無応答で、測定器が値を受け取ったかどうかはわかりません。 |
| **完了確認の後にエラーキュー（\*OPC?、SYST:ERR?）** | `*CLS`、コマンド、`*OPC?`、`SYST:ERR?` | 同じですが、測定器がコマンドを終えてからです。出力が落ち着くまでや、リレーが切り替わるまでを待つときに使います。 |
| **なし：送信した時点で確定** | コマンドだけ | 送った時点で完了です。エラーキューのない測定器向けです。このとき、応答のないクエリは測定器のエラーなしで報告されます。 |

書き込みは読み取りと一緒に機器のキューで順番を待ちます。回線上では回線の 1 つずつの要求を共有し、TCP と VISA では機器自身の接続を使います。

## 機器検出 {#discovery}

ドライバーのページには、省略できる欄が 1 つある**スキャンの範囲**のカードがあります。「TCP で問い合わせる測定器のアドレス、例：192.168.0.20 または 192.168.0.20:5025（空欄なら VISA が一覧する測定器を探します）」。機器検出は、次の 2 つの問い合わせを順に行います。

| 問い合わせ | いつ | 提示するもの |
| --- | --- | --- |
| VISA が一覧する測定器のリソースすべて（USB、GPIB、ネットワーク）を順に開き、`*IDN?` で問い合わせます。進行の行はそれぞれを示します：「USB0::0x0957::0x1A07::MY12345678::INSTR に識別情報を問い合わせています…」。 | このコンピューターに VISA がインストールされているとき。ないときは、スキャンがそのことを VISA の入手先とともに伝え、その文はスキャンを締めくくる行に残ります（[このコンピューターの VISA](#visa-on-this-computer)）。 | 答えた測定器それぞれを、リソースを入れた VISA の機器として。 |
| 欄のホストに TCP で `*IDN?` を、そのポートか 5025 で送ります：「192.168.0.20:5025 に識別情報を問い合わせています…」。 | 欄にアドレスがあるときだけ。 | その測定器を、そのホストとポートの TCP の機器として。 |

各測定器が答える時間は 1.5 秒で、答えない測定器は提示されません。候補の名前は、答えたメーカーと型式からつけ（`Keysight Technologies 34461A`）、「測定器」のカードの既定値をすべて持ち、タグは持ちません。測定器は自分のクエリの一覧を公開しないからです：「タグの報告はありませんでした。機器を追加してから、その編集画面でタグを設定してください。」このドライバーの機器がすでに使っているリソースの VISA の候補は、構成済みとして示され、追加の代わりに開くを出します。TCP で見つけた測定器は照合されません。ホストは測定器にたどり着く場所にすぎないからです。VISA はコンピューターのすべてのシリアルポートを、何かつながっていてもいなくてもリソースとして一覧し（`ASRL3::INSTR`）、問い合わせればそこにあるものに書き込んでしまいます。スキャンはそれらを外し、シリアルの測定器はこのドライバーのシリアル回線に置きます。VISA の機器に手で入力したシリアルのリソースは、そのまま開きます。欄の中身がホストでないときは欄の下で拒否され、機器検出は灰色になります：「SCPI のスキャンは、ここに書いた測定器に TCP で識別情報を問い合わせます。IP アドレスか名前を、必要ならポートを付けて書きます（例：192.168.0.20 や 192.168.0.20:5025）。VISA が一覧する測定器だけに問い合わせるには空欄のままにします。」スキャンのそのほかの動きは[機器検出](connector-discovery)にあります。

## 例：TCP のマルチメーター {#example-a-multimeter-over-tcp}

ネットワーク上の Keysight 34461A は、LXI ソケットのポート 5025 で SCPI に答えます。その直流電圧を読みます。

1. ドライバーのページで**機器を追加**し、名前を `DMM` にして、**TCP（LXI ソケット）**のまま、**ホスト**に 192.168.0.20 を入力し、**ポート**は 5025 のままにします。
2. **測定器**のカードで **LF（改行）**、**応答のタイムアウト（ms）** 2000、**エラーキュー（SYST:ERR?）** のままにして、**初期設定コマンド**を 2 つ、`*RST` と `CONF:VOLT:DC 10` を順に入力します。ステーションが接続するたびに、マルチメーターはリセットされ、10 V レンジの直流電圧に設定されます。
3. 接続すると、「識別情報」の欄にマルチメーターの応答が表示されます。例えば `Keysight Technologies,34461A,MY53212345,A.02.14-02.40-02.14-00.49-02-01` です。
4. **タグを追加**し、名前を `Voltage`、Double、読み取り専用にして、**クエリ**を `READ?`、**応答内の値**を空、**単位**を V にします。`READ?` は設定した機能で 1 回測定し、その結果を答えます。

Base URI は `scpi://tcp/192.168.0.20:5025?term=lf&timeout=2000&check=errorqueue&setup=*RST%0ACONF:VOLT:DC 10` になります。エージェントは 2 回のツール呼び出しで同じことをします。

```
device_upsert driver=Scpi name=DMM transport=Tcp host=192.168.0.20 port=5025 setupCommands='*RST\nCONF:VOLT:DC 10'
tag_upsert device=DMM name=Voltage opcUaType=Double address='READ?' unit=V
```

## 例：RS-232 の電源 {#example-a-power-supply-on-rs-232}

Keysight E3631A は RS-232 のポートで、9600 ボー、データ 8 ビット、パリティなし、ストップ 2 ビットで SCPI に答え、RS-232 ではリモートモードにしてからでないとコマンドを受け付けません。電圧を設定し、出力を切り替え、電流を読みます。

1. ドライバーのページで**回線を追加**し、名前を `PSU line` にして `COM4` を選び、**ボーレート**を 9600、**シリアルの形式**を `8N2` にしてから、回線を**有効化**します。
2. 回線で**機器を追加**し、名前を `PSU` にします。**測定器**のカードで**応答のタイムアウト（ms）**を 3000 にし、**初期設定コマンド**には `SYST:REM` の 1 行だけを入力して、**書き込みの確認**を**完了確認の後にエラーキュー（\*OPC?、SYST:ERR?）**にします。こうすると、書き込みは出力が追いついてから完了します。
3. **タグを追加**で `Setpoint`、Double、読み書き、**クエリ** `VOLT?`、**書き込みコマンド** `VOLT {value}` を作ります。
4. **タグを追加**で `Output`、Boolean、読み書き、**クエリ** `OUTP?`、**書き込みコマンド** `OUTP {value}` を作ります。true を書き込むと `OUTP 1`、false なら `OUTP 0` を送り、電源は `OUTP?` に 1 か 0 で答えます。
5. **タグを追加**で `MeasuredCurrent`、Double、読み取り専用、**クエリ** `MEAS:CURR?`、**単位** A を作ります。

`Setpoint` のタグのバス上のアドレスは `ask=VOLT?&write=VOLT {value}` です。この電源のように出力が複数ある電源は、選択中の出力に対して動きます。`INST:SEL P6V` のような 2 つ目の初期設定コマンドで、その出力を選べます。エージェントのツールでも同じことができます。

```
serial_line_upsert driver=Scpi name='PSU line' serialPort=COM4 baudRate=9600 serialFormat=8N2
device_upsert driver=Scpi name=PSU transport=SerialLine serialLineId=<id> responseTimeoutMs=3000 setupCommands='SYST:REM' writeCheck=CompletionAndErrorQueue
tag_upsert device=PSU name=Setpoint opcUaType=Double accessType=ReadAndWrite address='VOLT?' writeTemplate='VOLT {value}'
tag_upsert device=PSU name=Output opcUaType=Boolean accessType=ReadAndWrite address='OUTP?' writeTemplate='OUTP {value}'
tag_upsert device=PSU name=MeasuredCurrent opcUaType=Double address='MEAS:CURR?' unit=A
```

## エージェントのツール {#agent-tools}

`driver_capabilities` は、このドライバーを `scpi` の下で説明します。3 つの通信方式、このコンピューターに VISA があるか（`prerequisite` の下に、インストールの手順すべてとともに）、終端文字、応答のタイムアウト、書き込みの確認、初期設定コマンド、クエリと書き込みコマンドの書き方、応答の読み方、機器検出、そして上の 2 つの例です。`device_upsert driver=Scpi` は、`transport`（既定の `Tcp`、`Visa`、または `serialLineId` があれば決まる `SerialLine`）、TCP では `host` と `port`、VISA では `visaResource`、このドライバーの回線には `serialLineId`、`terminator`（`Lf`、`CrLf`、`Cr`。`\n`、`\r\n`、`\r` も読みます）、`responseTimeoutMs`（100 から 60000）、`writeCheck`（`ErrorQueue`、`CompletionAndErrorQueue`、`None`）、`setupCommands`（1 行に 1 つ、または `\n` 区切り。`''` で消去）を受け取ります。`tag_upsert` は、クエリを `address` として、`valueField`（1 から 1000。0 か省略で応答全体）、`writeTemplate`（`''` で消去）を受け取ります。`serial_line_upsert driver=Scpi` は、`serialPort`、`baudRate`、`serialFormat` だけを持つこのドライバーの回線を作ります。`device_discover driver=Scpi` はスキャンを実行し、`target` で TCP の問い合わせ先を指定します。ツールが返す機器は `scpi` を持ち、測定器が答えた後はその識別情報が入ります。タグも `scpi` を持ちます。ほかのツールは[エージェントのツール](agent-tools)にあります。

## 知っておきたい制限 {#limits-worth-knowing}

- Fluke NetDAQ 2640A、2645A、2680A、2686A は Fluke 独自のプロトコルを話し、それは SCPI ではないので、このドライバーでは読めません。Fluke 1586A Super-DAQ と 2638A Hydra Series III は SCPI を話すので読めます。
- IEEE 488.2 のバイナリブロック（`#`、長さ、生のバイト）で送られる応答、例えば波形や画面のイメージは読みません。タグが読むのはテキストで書かれた応答です。
- 製品は VISA をインストールしません。このコンピューターに NI-VISA も Keysight IO Libraries Suite もなければ、USB と GPIB の測定器にはつながりません。TCP とシリアルの測定器にはつながります。
- スキャンは VISA のシリアルのリソース（`ASRL…::INSTR`）を一覧しません。シリアルの測定器は、このドライバーのシリアル回線に置きます。
- 値はすべて読み出しで取得します。ドライバーはサービス要求（SRQ）もステータスバイトも待ちません。
- 機器は、シリアル回線とネットワークのあいだでも、別の回線へも移せません。あるべき場所に作り、古いものを削除してください。
