Learning Objectives
- 看懂 SCPI 的指令階層、長短寫法、選用節點與數字字尾
- 分辨設定指令、查詢指令與 IEEE 488.2 共同指令(*IDN?、*RST 等)
- 寫出正確的參數:數字、MIN/MAX、ON/OFF、字元資料
- 知道儀器怎麼回報錯誤:錯誤佇列、SYST:ERR? 與常見錯誤代碼
儀器的共同語言
前幾課的程式送給儀器的是 MEAS:VOLT:DC?、OUTP ON 這種文字。這些指令遵循 SCPI(Standard Commands for Programmable Instruments,常念成 skippy)。
SCPI 在 1990 年發表,建立在 IEEE 488.2 之上:IEEE 488.2 規定了訊息的基本格式與一組共同指令(*IDN?、*RST 等),
SCPI 再規定各種量測功能的指令怎麼命名、怎麼分層。目前的 SCPI 文件(1999 年版)由 IVI Foundation 提供。
SCPI 的目標是:同一種功能,不同廠牌、不同型號的指令盡量長得一樣。量直流電壓,大多數電錶都接受 MEAS:VOLT:DC?。
雖然實際上每個廠牌仍有自己的擴充與差異,但規則相同,看懂一台的手冊,就比較容易讀懂另一台。
本課的指令表是模擬儀器(Uedu Sim)的寫法;真實儀器以該儀器的程式設計手冊為準。
指令階層、長短寫法、選用節點
SCPI 指令像檔案路徑一樣分層,用冒號 : 分隔,每一層叫一個節點。手冊上常這樣寫:
[SOURce:]VOLTage[:LEVel][:IMMediate][:AMPLitude] <數值>
MEASure:VOLTage[:DC]?
- 長短寫法:每個節點的大寫字母是短寫法,整個字是長寫法。
VOLTage可以寫VOLT或VOLTAGE,只能是這兩種,VOLTA、VOLTS都不行。 - 大小寫不分:大寫只是用來標示短寫法,送出時
volt、Volt、VOLT都一樣。 - 選用節點:方括號
[ ]裡的節點可以省略。所以VOLT 5、SOUR:VOLT 5、SOURce:VOLTage:LEVel:IMMediate:AMPLitude 5是同一個指令。 - 數字字尾:有多個通道的節點可以帶編號,例如示波器的
:CHANnel2:SCALe 0.5(CHAN2)。不寫編號就是 1。 - 查詢:結尾加
?是查詢,儀器會回答,例如VOLT?回答目前的電壓設定。只有查詢會產生回應。 - 共同指令:星號開頭,來自 IEEE 488.2,每台儀器都有:
*IDN?(你是誰)、*RST(重設)、*CLS(清除狀態)、*OPC?(做完了嗎)。
程式裡建議用短寫法(打字少)或長寫法(容易讀),同一個專案統一一種就好。
逐步看:五種寫法,同一個指令
對電源供應器送出五種寫法的電壓設定,每次用 VOLT? 查回來。看電源供應器面板的設定值,以及最後錯誤佇列是不是空的。
參數、分號與回應
指令頭和參數之間用空白分開,多個參數用逗號分開:APPL 5,0.02。常見的參數種類:
| 種類 | 例子 | 說明 |
|---|---|---|
| 數字 | VOLT 4.5、FREQ 1E3 |
可以用科學記號;有些儀器也接受單位字尾,以手冊為準 |
| MIN/MAX/DEF | VOLT MAX |
這個設定的最小值、最大值、預設值 |
| 布林 | OUTP ON、OUTP 1 |
ON/OFF 或 1/0;查詢時通常回答 1 或 0 |
| 字元資料 | FUNC SQU |
從一組關鍵字裡選一個,也有長短寫法 |
| 字串 | FUNC "VOLT" |
用引號包起來的文字 |
分號 ; 可以把多個指令放在同一行:VOLT 4.5;:CURR 0.015。這裡有個規則要注意:分號之後的指令,若開頭沒有冒號,
真實儀器會把它接在上一個指令的路徑下(目前路徑規則),例如 MEAS:VOLT?;CURR? 的第二個指令會被解讀成 MEAS:CURR?。
開頭加冒號則從根節點重新開始。不想記這個規則,就在分號後面一律加冒號。
本課程的模擬儀器也照這個規則解讀,可以在下面的指令解析器輸入 MEAS:VOLT?;CURR? 看看。
一行裡有多個查詢時,回答也用分號串在一起,例如 OUTP?;:OUTP:MODE? 得到 1;CC。
逐步看:MAX、布林與分號
看通訊紀錄裡的指令與回答:一行送兩個設定、一次查兩個值。電源供應器面板會顯示設定值的變化。
儀器怎麼告訴你「錯了」
送出錯誤的指令時,儀器不會回一段錯誤訊息,程式也不會當掉;它把錯誤放進自己的錯誤佇列(先進先出),等你用 SYST:ERR? 一筆一筆讀出來。
每一筆是「代碼,"說明"」,讀到 0,"No error" 表示佇列空了。代碼依範圍分類:
| 範圍 | 類別 | 例子 |
|---|---|---|
| -100~-199 | 指令錯誤:語法不對 | -113 Undefined header(不認得的指令)、-104 Data type error(參數型別錯) |
| -200~-299 | 執行錯誤:語法對,但做不到 | -222 Data out of range(超出範圍)、-224 Illegal parameter value(不允許的值) |
| -300~-399 | 儀器本身的錯誤 | 硬體或韌體的問題 |
| -400~-499 | 查詢錯誤 | -410 Query INTERRUPTED(上一個查詢的回答還沒讀走,又送新指令) |
另外,*STB? 回答狀態位元組:其中一個位元表示「錯誤佇列裡有東西」,程式可以先看它再決定要不要讀錯誤。
逐步看:四個錯誤指令與錯誤佇列
送出四個錯誤的指令:通訊紀錄裡只有「→」,沒有任何「←」回應。最後用迴圈把錯誤佇列讀完。
小測驗:語法規則
手冊寫 MEASure:CURRent[:DC]?。下面哪一個寫法合法?
送出 VOLT 5;CURR 0.1 和 VOLT 5;:CURR 0.1,在真實儀器上有差別嗎?
下面哪一個指令會讓儀器產生回應、需要程式讀走?
小測驗:錯誤與回應
程式送出 VOLT 40(上限 30 V),接著 SYST:ERR? 會得到什麼?
下面的程式把儀器回答的字串拆開,會印出什麼?
reply = "1;CC\n"
state, mode = reply.strip().split(";")
print(state == "1", mode)
錯誤佇列裡有三筆錯誤,程式送一次 *CLS 再送 SYST:ERR?,會得到什麼?
重點整理
- SCPI 建立在 IEEE 488.2 之上:共同指令(
*IDN?、*RST、*CLS、*OPC?)+分層的量測指令。 - 節點用
:分層;短寫法=大寫的部分,只接受短寫法或長寫法;大小寫不分;[ ]是選用節點;CHAN2是數字字尾。 - 結尾
?是查詢,只有查詢會回應。參數:數字、MIN/MAX/DEF、ON/OFF、字元資料、字串。 ;串接多個指令,分號後面加:從根開始最保險;多個查詢的回答也用;串起來。- 錯誤進錯誤佇列,用
SYST:ERR?讀到0,"No error"為止:-100 指令錯誤、-200 執行錯誤、-300 儀器錯誤、-400 查詢錯誤。
下一課介紹 VISA 與 PyVISA:資源字串、ResourceManager、write/read/query 與逾時,把序列埠那些位元組與終止字元的細節交給 VISA 處理。