📺 影片版(約 7 分鐘):想先看實際操作的話可以直接看這支影片,完整步驟、設定與程式碼在下方文字版。
最近把閒置的儀器, 全部拿出來檢查是否還可用並寫GUI來控制充分利用一下!YouTube:https://youtu.be/mpRLVVXrFiQ(winson-DIY 頻道)
34401A 萬用電表
設計概念:
1. 連接的GPIB介面輸入
2. 電表功能選擇
3. Chart圖形顯示語文字顯示
4. 輸出log顯示與儲存
補充一、34401A 規格重點
34401A 是 HP(後來的 Agilent、現在的 Keysight)出的 6½ 位數桌上型萬用電表,雖然是老機種,到現在還是很多實驗室的標準配備:
| 項目 | 規格 |
|---|---|
| 解析度 | 6½ 位數(可切 4½ / 5½ / 6½) |
| DC 電壓 | 100 mV ~ 1000 V,5 個檔位;10 V 檔 1 年準確度 0.0035% 讀值 + 0.0005% 檔位 |
| AC 電壓 | 100 mV ~ 750 V(True RMS) |
| DC / AC 電流 | DC 10 mA ~ 3 A;AC 1 A、3 A |
| 電阻 | 100 Ω ~ 100 MΩ,支援 2 線 / 4 線 |
| 其他 | 頻率、週期、導通、二極體 |
| 介面 | GPIB(IEEE-488)、RS-232 |
| 讀值速度 | 最快約 1000 筆/秒(4½ 位、NPLC 0.02) |
小提醒:除了 1000 V 檔,各檔位都有 20% 超量程,所以 12 V 左右的訊號在自動檔位下仍會落在 10 V 檔,可以解析到 1 µV。
補充二、連線架構與 GPIB 位址
PC(C# WinForms) │ VISA(Keysight IO Libraries 或 NI-VISA) ▼ GPIB 介面卡 / USB-GPIB 轉接器(板號 GPIB0、GPIB1…) │ GPIB 線 ▼ 34401A(GPIB 位址,出廠預設 22,這台設成 24)VISA 資源字串格式是
GPIB板號::位址::INSTR,這次實際用的是 GPIB1::24::INSTR。從驗證截圖下方的 log 可以看到,前 4 次都是 Open Instrument Fail!!,把 GPIB 下拉選單從 0 改成 1 之後才連上,儀器回傳的
*IDN? 是:HEWLETT-PACKARD,34401A,0,11-5-2重點:電腦上如果裝過不只一張 GPIB 卡或轉接器,板號不一定是 0。開不起來時先用 Keysight Connection Expert 或 NI MAX 掃一次,確認板號和位址,比在程式裡亂試快很多。儀器的位址可以在前面板 Shift → Menu 的 I/O 選單裡查。
補充三、常用 SCPI 指令
GUI 上的「量測功能選擇」,背後就是對應到不同的 SCPI 指令:
| 功能 | 一次量測(MEASure) | 先設定(CONFigure) |
|---|---|---|
| DC 電壓 | MEAS:VOLT:DC? | CONF:VOLT:DC |
| AC 電壓 | MEAS:VOLT:AC? | CONF:VOLT:AC |
| DC 電流 | MEAS:CURR:DC? | CONF:CURR:DC |
| AC 電流 | MEAS:CURR:AC? | CONF:CURR:AC |
| 2 線電阻 | MEAS:RES? | CONF:RES |
| 4 線電阻 | MEAS:FRES? | CONF:FRES |
| 頻率 / 週期 | MEAS:FREQ? / MEAS:PER? | CONF:FREQ / CONF:PER |
| 導通 / 二極體 | MEAS:CONT? / MEAS:DIOD? | CONF:CONT / CONF:DIOD |
其他常用的:
*IDN?:讀儀器型號,拿來確認連線*RST;*CLS:重置並清除錯誤狀態READ?:依目前設定觸發一次並讀回VOLT:DC:NPLC 10:積分時間(0.02 / 0.2 / 1 / 10 / 100),越大越準越慢SYST:ERR?:讀錯誤佇列,指令沒反應時先查這個
MEAS:...? 每次都會重新設定儀器,連續量測會比較慢。比較好的做法是開始時 CONF 一次,之後在迴圈裡只送 READ?。補充四、C# 程式骨架(VISA.NET)
以下是「連線 → 設定 → 連續讀值」的最小範例,用的是 Keysight IO Libraries 和 NI-VISA 都有提供的 VISA.NET(
Ivi.Visa):using System.Globalization;
using Ivi.Visa;
// 連線
var dmm = (IMessageBasedSession)GlobalResourceManager.Open("GPIB1::24::INSTR");
dmm.TimeoutMilliseconds = 5000;
dmm.Clear();
var io = dmm.FormattedIO;
io.WriteLine("*RST;*CLS");
io.WriteLine("*IDN?");
string idn = io.ReadLine(); // HEWLETT-PACKARD,34401A,0,11-5-2
// 設定一次:DC 電壓、自動檔位
io.WriteLine("CONF:VOLT:DC DEF,DEF");
io.WriteLine("VOLT:DC:NPLC 10");
// 連續讀值(放在背景 Task,按 Stop 時取消)
var sw = System.Diagnostics.Stopwatch.StartNew();
while (!token.IsCancellationRequested)
{
io.WriteLine("READ?");
double v = double.Parse(io.ReadLine(), CultureInfo.InvariantCulture); // "+1.19872270E+01"
double t = sw.Elapsed.TotalSeconds;
// UI 執行緒更新:Chart 加點 (t, v)、Logs 加一行
// $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] | {v:F6} -- V"
}
// 結束
dmm.Dispose();
幾個實作重點:- 量測迴圈不要放在 UI 執行緒:用 Task + CancellationToken,Stop 按鈕只負責取消,畫面才不會卡住
- 解析讀值要用 InvariantCulture:儀器回的是科學記號字串,系統地區設定不同時可能解析錯誤
- Chart 用時間當 X 軸:驗證截圖的 X 軸是「時間(秒)」,只保留最近一段(例如 200 點)視窗才不會越畫越慢
- Timeout 一定要設:儀器關機或線鬆了,ReadLine 才不會一直卡住
- 斷線後回本地操作:程式結束後前面板若顯示 Rmt 鎖住,按 Shift(Local)就能回到手動操作
補充五、實測結果解讀
驗證時由 power supply 輸出 DC 12 V,log 裡連續 9 筆讀值:
- 讀值介於 11.987227 ~ 11.987254 V,跳動只有約 27 µV(約 2 ppm),讀值相當穩定
- 跟 12 V 設定值差約 13 mV(−0.1%),這是 power supply 本身的輸出誤差,不是電表的問題,剛好可以拿 34401A 來校正電源的實際輸出
- 相鄰兩筆的時間差約 0.43 秒,也就是大約每秒 2.3 筆,以 NPLC 10 的設定來說是合理的;需要更快可以把 NPLC 調小,但雜訊會變大
補充六、延伸應用
- Logs 存成 CSV(時間, 讀值, 單位),之後可以用 Excel 或 Python 做長時間的穩定度分析
- 搭配 power supply 一起程式控制,就能做自動化的電壓掃描或負載測試
- 如果要一次量很多點,可以搭配 34970A 切換開關,做法可以參考之前的文章:PCBA電壓檢測項目-Aglient 34970A
延伸閱讀
- Tektronix MSO64B C# GUI Application(2024/09)
- Arduino Mega2560 產品 Burn-In 燒機設計(2026/02)
- C# 實作ESP32-CAM的網路監視系統(2026/01)
- KIKUSUI 的Crank test system(2024/06)
- 坦聯 旋轉轉台控制小工具(2025/02)




