Standard Commands for Programmable Instruments（SCPI,「スキッピー」と発音される） は、半導体試験装置や電気計器など、プログラマブルな試験機・測定機の制御に用いる文法の標準を定めたものである。

 概要 
SCPIは、IEEE 488.2-1987 規格 "Standard Codes, Formats, Protocols, and Common Commands（標準コード、フォーマット、プロトコル、共通コマンド）" の上部に置かれる追加レイヤとして定められた。この規格は、様々な機器で用いられる共通文法、コマンド構造、データ型、を規定する。例えば CONFigure や MEASure など、どの測定器でも使用される汎用のコマンドが含まれる。これらのコマンドはサブシステムにグループ化されている。SCPI は、計測器クラスの定義も行っている。例えばプログラマブル電源であれば、DCPSUPPLY 基本機能クラスを実装することになるだろう。計測器クラスは、どのサブシステムを実装しているかを定め、また計測器に固有の機能を指定する。

物理的なハードウェア通信リンク (物理層）は SCPI では定義されない。SCPI はもともと IEEE-488.1 (GPIB) バス向けに開発されたが、RS-232, RS-422, RS-485, USB, Ethernet, VXIbus, HiSLIP, などでも利用できる。

SCPI コマンドは ASCII テキストの文字列で、物理層を介して測定器に送信される。コマンドは、ひとつ以上のキーワードと、それらがとるパラメータからなる。仕様では、キーワードは CONFigure: のように表記される。キーワード全体を使用することも、省略して大文字部分だけにすることもできる。問い合わせるコマンドに対する応答は、通常 ASCII 文字列である。ただしデータが大きい場合は、バイナリ形式を用いることもできる。

SCPI 規格は、Volume 1: "Syntax and Style（文法とスタイル）", Volume 2: "Command Reference（コマンドリファレンス）", Volume 3: "Data Interchange Format（データ交換フォーマット）", Volume 4: "Instrument Classes（計測器クラス）" の４部からなる。この規格は当初は有料の印刷物としてリリースされたが、のちにすべての部分を含む無料の PDF ファイルとして公開され、2025 年 1 月現在でも利用できる。

 SCPI の歴史 
最初にリリースされた 1990 年の時点 では、SCPI は IEEE-488 の追加レイヤであった。IEEE-488.1 はバスの物理・電気特性を規定し、IEEE-488.2 はプロトコルとデータ型を規定した。しかしいずれも計測器コマンドは規定していなかった。同じような計測器でも、製造メーカーが異なれば、あるいはモデルが異なれば、違うコマンドセットが用いられることがあった。SCPI は、製造メーカーやモデルが異なっても共通となる標準を作ったのである。SCPI は IEEE-488.2 のデータ型を用いることを要求するが、IEEE-488.1 バスには依存していない。

2002-2003 年の投票の結果、SCPI コンソーシアム (SCPI Consortium) は IVI Foundation (Interchangeable Virtual Instruments) に属することになった。

 IEEE 488.2 の歴史 
1987年に IEEE は IEEE 488.2-1987 規格 "Standard Codes, Formats, Protocols, and Common Commands" を公開し、これは後に 1992 年に改訂されて IEEE 488.2-1992 となった。

IEEE 488.2 はデバイスに依存しない文法を定めているが、機器ごとに固有のコマンドについての標準は存在しなかった。同じクラスの機器（例えばマルチメータ）を制御するためのコマンドは、製造メーカーやモデルによって異なっていた。1985 年にアメリカ空軍が、のちにヒューレット・パッカード (HP) が、この問題に気付いた。1989年に HP は TML 言語を開発し 、これが SCPI の前身となった。

IEC も独自の標準を IEEE とは別に開発し、IEC 60625-2-1993 (IEC 625) となった。2004 年に IEEE と IEC はそれぞれの標準を合流させて「ふたつの顔」を持つ IEEE/IEC 標準 IEC 60488-2-2004, Part 2: Codes, Formats, Protocols and Common Commands とし、これをもって IEEE 488.2-1992 および IEC 60625-2-1993 を置き換えることとした。

 コマンド文法 
機器に対する SCPI コマンドは、「設定 (set)」操作（例えば電源をオンにするなど）と「問い合わせ (query)」操作（例えば電圧を読むなど）のふたつに分類される。機器への問い合わせは、コマンドの末尾に疑問符 (?) を付加することによって発行される。いくつかのコマンドは、設定にも問い合わせにも用いられる。例えば、機器をデータ取得モードに設定するには ACQuire:MODe コマンドを用い、現在のモードを問い合わせるには ACQuire:MODe? コマンドを用いる。設定と問い合わせを同時に行うコマンドもある。例えば *CAL? コマンドは、機器によっては自己校正を行ったのちに校正の結果を返す。

似通ったコマンドは、「木」構造のヒエラルキーにグループ化される。例えば、機器から測定結果を読み込む命令は "MEASure" から始まることが多い。ヒエラルキー下部の特定のサブコマンドは、コロン文字 (:) によってネストされる。例えば「DC 電圧を測定する」コマンドは MEASure:VOLTage:DC? という形式になり、「AC 電流を測定する」コマンドは MEASure:CURRent:AC? という形式になる。
 :MEASure
 :VOLTage
 :DC?
 :AC?
 :CURRent
 :DC?
 :AC?
 ...

 大文字小文字 
ここまでに示してきたコマンドでは大文字小文字が混ざっていたが、SCPI はケース・センシティブではない。

 例えば VOLTage に対しては、VOLTAGE, voltage, Voltage, VoLtAgE のいずれも有効である。

 コマンドの短縮 
コマンドの説明において、大文字と小文字の混ざった表示がされることがある。このとき、コマンドを短縮して大文字部分だけを送信することと、大文字・小文字の全体を送信することとは同じ意味を持つ。

 例えば “SYSTem:COMMunicate:SERial:BAUD 2400” は RS-232 シリアル通信インターフェースを 2400 bits/s に設定するが、これは短縮して “SYST:COMM:SER:BAUD 2400” とできる。問い合わせコマンド “SYSTem:COMMunicate:SERial:BAUD?” または “SYST:COMM:SER:BAUD?” は、機器に現在のボーレートを報告する命令である。

有効なのは大文字部分のみ、ないし全体のいずれかに限られ、それ以外の部分文字列は不正となる。

 例えば COMM（大文字部分のみ）と COMMUNICATE（全体）は有効だが、 COM, COMMUN, COMMUNIC subsets などは不正なコマンドである。文字が追加された COMMUNICATED のような文字列もコマンドとして不正である。

 コマンドの結合 
機器に対して、1 行で複数の命令を発行することもできる。これには各々のコマンドをセミコロン文字 (;) で区切ればよい。

 例えば、「DC 電圧を測定してから AC 電流を測定する」には、以下のコマンドを発行すればよい。 MEASure:VOLTage:DC?;:MEASure:CURRent:AC?

コロン (:) で始まる単体のコマンドは、コマンドツリーの根に対するものと解釈される。そうでない単体コマンドは、直前のコマンドの最終ノードに対するものと解釈される（ただしアスタリスク (*) で始まるものは除く）。例えば、
 :SOURce:FREQuency:STARt 100;STOP 200
は以下のメッセージの短縮版である。
 :SOURce:FREQuency:STARt 100;:SOURce:FREQuency:STOP 200

 引数 
コマンドによっては、ひとつ以上の引数 (argument) を受け付ける、ないし要求することがある。引数を指定する場合はコマンドの後ろにスペースを置き、その後ろに引数を書く。例えば、機器のトリガモードを "normal" に設定するには、"TRIGger:MODe NORMal" のようなコマンドを送る。ここで "NORMal" はコマンド "TRIGger:MODe" の引数である。複数の引数を与える場合は、引数をコンマ (,) 区切り文字列リストで与える。例えば、デジタルマルチメータに AC 電圧を測定させる問い合わせコマンドで、機器の 10 VRMS 測定レンジを用い、測定値を 4-1/2 桁で返すよう指示する場合には、 "MEASure:VOLTage:AC? 10,4" のようなコマンドを送る。

 整数の引数 
整数を指定するコマンドでは、整数の表現として、10進、16進、8進、2進、を利用できる。10進以外の3つはIEEE 488.2 で定義されており、SCPI もこれに準拠している。10進数は前置文字を指定しない。16進数は #H または #h を前置する。8進数は #Q または #q を前置する。2進数は #B または #b を前置する。16進数の桁には、大文字 (ABCDEF) 小文字 (abcdef) のいずれも用いてよく、混在 (aBcDeF) させても構わない。8 進数に対して "O" ではなく "Q" が得らばれたのは、0 (zero) との見掛け上の混乱を避けるためである。

以下に例を示す引数は、いずれも同じ数値を表している：

 10進: 26
 16進: #H1A または #h1a
 8進: #Q32 または #q32
 2進: #B11010 または #b11010

 488.2 コマンド 
SCPI は IEEE 488.2 規格の追加レイヤとして定められたため、SCPI に準拠する機器は 488.2 のコマンド群も認識しなければならない。これらのコマンドはアスタリスク文字 (*) で始まるため、（非公式に）アスタリスクコマンドとかスターコマンドなどと呼ばれる。

SCPI Volume 1 の 4.1.1 節によれば、すべての SCPI コマンドは以下に示す 488.2 コマンドを実装していなければならない。実際には、ローエンドの機器などでは、488.2 コマンドの一部のみをサポートしている、あるいはコマンドを受け付けるがなにもしない、場合がある。これらの 488.2 コマンドを利用できるかどうかは、各々の機器に付属の公式プログラミングマニュアルを参照して確認するとよい。
 
 *CLS
 *ESE
 *ESE?
 *ESR?
 *IDN?
 *OPC
 *OPC?
 *RST
 *SRE
 *SRE?
 *STB?
 *TST?
 *WAI

SCPI Volume 1 の 4.1.2 節によれば、上にリストしたもの以外の 488.2 コマンド（下記）は必須ではなく、SCPI はこれらを要求しない。
 
 *AAD
 *CAL?
 *DDT
 *DDT?
 *DLF
 *DMC
 *EMC
 *EMC?
 *GMC?
 *IST?
 *LMC?
 *LRN?
 *OPT?
 *PCB
 *PMC
 *PRE
 *PRE?
 *PSC
 *PSC?
 *PUD
 *PUD?
 *RCL
 *RDT
 *RDT?
 *SAV
 *TRG
 *RMC
 *SDS