write("INIT:IMM")가 성공했다는 사실은 새 trace가 준비됐다는 뜻이 아니다. Command는 acquisition을 시작했을 뿐이고, trigger·sweep·averaging·measurement calculation이 끝난 뒤에야 result를 가져올 수 있다. 안정적인 SA 프로그램은 명령 목록보다 상태와 증거의 순서가 먼저다.
직관 · 무엇이 보이나?
SCPI를 mode tree와 acquisition timeline으로 나눠 보자
객체 축: instrument → mode → measurement → trace/result
- Instrument session — VISA transport, timeout, identity와 option을 소유한다.
- Mode —
SA, IQ Analyzer처럼 유효한 SCPI tree를 선택한다. - Measurement — Swept SA, Channel Power, OBW, ACP처럼 계산 목적과 state를 선택한다.
- Acquisition — continuous/single, trigger, pending/complete를 소유한다.
- Trace/result — display point array 또는 scalar/vector measurement result다.
Mode가 SA여도 measurement가 SAN인지 CHP인지에 따라 같은 FETCh?의 의미와 valid command가 달라진다. TRAC? TRACE1과 FETC:CHP?는 둘 다 숫자를 반환하지만 전자는 display trace, 후자는 measurement algorithm의 결과다.
설정, acquisition, marker, trace와 one-button measurement를 어떤 순서로 검증할까?
한 줄 SCPI subset에서 command/query, fresh acquisition, output/error queue와 자주 쓰는 측정 recipe를 연습합니다.
교육용 계산 모델 · 실제 장비 정확도나 compliance 판정을 대신하지 않습니다.
- Source파형·전력·할당초기 상태에서 관찰하는 stage
- DUT전달·반사·비선형초기 상태에서 관찰하는 stage
- Acquisitionmixer·IF·ADC초기 상태에서 관찰하는 stage
- DSP / MathRBW·FFT·복소수초기 상태에서 관찰하는 stage
- Displaytrace·marker·grid초기 상태에서 관찰하는 stage
먼저 결과를 예측해보세요
Center frequency를 바꾼 직후 INIT 없이 TRAC1:DATA?를 읽으면?
Command 전후 analyzer state와 trace freshness를 함께 봅니다
설정이 바뀌면 이전 trace는 stale입니다. INIT:IMM 뒤에 marker/data를 읽습니다.
그래프 값을 표로 보기
| 항목 | 값 | 해석 |
|---|---|---|
| Mode | SA | SA / one-button application |
| Center / span | 3.500 GHz / 200 MHz | Frequency state |
| RBW / VBW | 100 / 300 kHz | Resolution / smoothing |
| Atten / preamp | 30 dB / OFF | Front-end level plan |
| Trace | STALE | Data query validity |
| Queues | OUT 0 · ERR 0 | Independent FIFO |
SCPI transcript와 queue
*OPC?는 operation 동기화이며 trace freshness나 error drain을 대신하지 않습니다.
지금 보이는 변화의 원인
같은 계산 state- 변경
- SA · center 3.500 GHz · RBW 100 kHz
- 직접 효과
- Trace state STALE, marker OFF입니다.
- 화면 결과
- Output queue 0, error queue 0, transcript 0 entries입니다.
- 비용·한계
- 이 parser는 한 줄 subset만 지원합니다. Full IEEE 488.2 message chaining, binary block transport와 vendor application 전체를 구현하지 않습니다.
원인을 자기 말로 닫아보세요
바꾼 물리량 → 영향을 받은 stage → 화면에서 바뀐 부분 → 비용·한계 순서로 설명합니다.
먼저 예측을 맞게 고정하세요.
측정 주의 · 실장비에서는 *IDN?/*OPT? 확인, high attenuation·preamp OFF, continuous OFF/ABOR, configure/query-back, INIT:IMM;*OPC?, data, bounded error drain 순서를 사용하세요.
시간 축: connect → configure → acquire → fetch → close
open VISA alias
→ *IDN? / *OPT? / firmware check
→ ABOR / single / safe front-end
→ mode + measurement + settings
→ query-back + error drain
→ INIT:IMM
→ *OPC? = 1
→ marker / trace / scalar fetch
→ metadata + errors 저장
→ ABOR / safe front-end / close*OPC?는 결과의 물리적 타당성을 증명하지 않는다. 앞선 overlapped operation이 완료됐음을 알려줄 뿐이다. Overload status, point count, units, reference plane과 independent known signal 검증이 따로 필요하다.
실무 조작·해석 · 무엇을 바꿀까?
자주 쓰는 동작을 재사용 가능한 transaction으로 만든다
Session 시작과 안전한 기본 상태
Connection Expert에서 N9020B serial number를 확인하고 MXA_N9020B 같은 alias를 만든다. Production code는 list_resources()[0] 또는 고정 IP를 사용하지 않는다.
import os
import pyvisa
resource = os.environ["N9020B_VISA_RESOURCE"]
rm = pyvisa.ResourceManager()
sa = rm.open_resource(resource)
sa.timeout = 30_000
sa.read_termination = "\n"
sa.write_termination = "\n"
try:
identity = sa.query("*IDN?").strip()
options = sa.query("*OPT?").strip()
if "N9020B" not in identity:
raise RuntimeError(f"unexpected analyzer: {identity}")
for required in ("526", "B1X", "MPB", "P26"):
if required not in options:
raise RuntimeError(f"missing required option {required}: {options}")
sa.write("ABOR")
sa.write("*CLS")
sa.write("INST:SEL SA")
sa.write("CONF:SAN:NDEF")
sa.write("INIT:CONT OFF")
sa.write("POW:GAIN OFF")
sa.write("POW:ATT:AUTO OFF")
sa.write("POW:ATT 40 DB")
finally:
try:
sa.write("ABOR")
sa.write("INIT:CONT OFF")
sa.write("POW:GAIN OFF")
sa.write("POW:ATT 40 DB")
finally:
sa.close()
rm.close()N9020B는 source가 아니므로 RF OFF command가 없다. Cleanup의 목적은 이미 들어오는 external RF를 끄는 것이 아니라 pending acquisition을 abort하고, preamp OFF·높은 attenuation의 보수적 front-end state로 복귀하는 것이다. 실제 RF는 SG RF OFF, PA bias sequence와 hardware switch가 담당한다.
자주 쓰는 command map
| 의도 | 대표 command/query | 저장할 증거 |
|---|---|---|
| Identity·option | *IDN?, *OPT? | Model, serial, firmware, option string |
| Mode catalog·select | INST:CAT?, INST:SEL SA, INST:SEL? | 실제 mode 이름 |
| Measurement select | CONF:SAN:NDEF, CONF:CHP, CONF:OBW, CONF:ACP, CONF? | 선택 후 measurement |
| Stop / single | ABOR, INIT:CONT OFF, INIT:IMM, *OPC? | Pending, latency, completion |
| Frequency | FREQ:CENT, FREQ:SPAN, FREQ:STAR, FREQ:STOP | Query-back Hz |
| Front end | POW:ATT:AUTO, POW:ATT, POW:GAIN, reference level | Attenuation, preamp, range |
| Filtering | BAND:RES, BAND:VID, 각 :AUTO | Actual RBW/VBW |
| Detector·trace | DET:TRAC1, TRAC1:TYPE, TRAC? TRACE1 | Enum, points, units |
| Trigger | `TRIG:SAN:SOUR IMM | VID |
| Marker | CALC:MARK1:STAT, max search, CALC:MARK1:X?, CALC:MARK1:Y? | Frequency·amplitude pair |
| Error/status | SYST:ERR?, ADC over-range/status query | Full FIFO와 overload flags |
Command의 long/short form은 대문자로 표시된 keyword 경계만 줄인다. FREQuency는 FREQ 또는 FREQUENCY이고 FRE처럼 임의로 자르지 않는다.
Recipe 1 — Single swept spectrum + peak marker + trace
ABOR
INST:SEL SA
CONF:SAN:NDEF
INIT:CONT OFF
CHP:FREQ:CENT 3.5 GHZ
FREQ:SPAN 200 MHZ
POW:GAIN OFF
POW:ATT:AUTO OFF
POW:ATT 30 DB
BAND:RES:AUTO OFF
BAND:RES 100 KHZ
BAND:VID:AUTO ON
DET:TRAC1 NORM
TRAC1:TYPE WRIT
SWE:POIN 1001
TRIG:SAN:SOUR IMM
FREQ:CENT?
FREQ:SPAN?
POW:ATT?
BAND:RES?
TRIG:SAN:SOUR?
SYST:ERR?
INIT:IMM
*OPC?
CALC:MARK1:STAT ON
CALC:MARK1:MAX
CALC:MARK1:X?
CALC:MARK1:Y?
TRAC? TRACE1
SYST:ERR?Firmware의 exact marker-max form은 A.43.49 command tree에서 확인해 catalog에 고정한다. Long-form synonym을 임의로 조립하지 않는다. Trace는 SWE:POIN?과 같은 길이인지 확인하고 start/stop frequency와 함께 저장한다.
Recipe 2 — Channel Power
ABOR
INST:SEL SA
CONF:CHP
OBW:FREQ:CENT 3.5 GHZ
CHP:BAND:INT 100 MHZ
CHP:BAND:INT?
INIT:CONT OFF
INIT:IMM
*OPC?
FETC:CHP?
SYST:ERR?FETC:CHP?는 현재 Channel Power acquisition 결과를 가져오며 새 acquisition을 암묵적으로 시작시키지 않는다. Scalar 한 개만 필요하면 현재 reference가 제공하는 result-specific query를 사용하고, 반환 field 순서를 metadata로 고정한다.
Recipe 3 — 99% Occupied Bandwidth
ABOR
CONF:OBW
ACP:FREQ:CENT 3.5 GHZ
OBW:PPOW 99
OBW:PPOW?
INIT:CONT OFF
INIT:IMM
*OPC?
FETC:OBW?
SYST:ERR?OBW는 “신호가 존재하는 모든 주파수”가 아니라 configured span 안 total integrated power의 지정 percent를 포함하는 폭이다. Span이 signal skirt를 자르거나 noise를 과도하게 포함하면 결과가 달라진다.
Recipe 4 — Adjacent Channel Power
ABOR
CONF:ACP
FREQ:CENT 3.5 GHZ
# carrier integration BW, offset frequency, offset BW, offset state를 명시
ACP:OFFS1:LIST 120MHZ,240MHZ,360MHZ,480MHZ,600MHZ,720MHZ
ACP:OFFS1:LIST:BAND 100MHZ,100MHZ,100MHZ,100MHZ,100MHZ,100MHZ
ACP:OFFS1:LIST:STAT ON,OFF,OFF,OFF,OFF,OFF
ACP:OFFS1:LIST?
ACP:OFFS1:LIST:BAND?
ACP:OFFS1:LIST:STAT?
INIT:CONT OFF
INIT:IMM
*OPC?
FETC:ACP?
SYST:ERR?Carrier integration bandwidth는 waveform standard에 맞게 별도 설정한다. Offset center와 offset integration bandwidth를 혼동하지 않는다. FETC:ACP?의 vector field 수와 order는 measurement type·offset count에 따라 달라질 수 있으므로 index를 하드코딩하기 전에 현재 manual의 result table과 길이를 검증한다.
Output queue와 error queue
Query를 보낸 뒤 response를 읽지 않고 다음 program message를 보내면 output queue가 끊길 수 있다. query()로 write+read를 묶고, binary block query는 text query와 다른 reader를 사용한다. SYST:ERR?는 별도 FIFO이며 no-error가 나올 때까지 bounded drain한다.
import re
def drain_errors(sa, maximum=32):
errors = []
for _ in range(maximum):
response = sa.query("SYST:ERR?").strip()
match = re.match(r"^\s*([+-]?\d+)", response)
if not match:
raise RuntimeError(f"malformed error response: {response!r}")
if int(match.group(1)) == 0:
if errors:
raise RuntimeError(f"analyzer errors: {errors}")
return
errors.append(response)
raise RuntimeError("error queue did not terminate within bound")기존 오류를 log하기 전에 *CLS로 지우지 않는다. Configure 뒤 nonzero error가 하나라도 있었다면 마지막에 no-error가 나와도 그 transaction은 실패다.
사이트의 N9020B PyVISA 실행 가이드는 dry-run이 기본이다. --execute가 있어야 VISA session을 열고, 실제 acquisition은 connector power·external path·SG RF state를 확인하는 별도 consent가 필요하다.
수식·규격 · 어떻게 검증할까?
Trace와 scalar result의 consistency를 검증하자
수식 열기Linear trace X-axis reconstruction
f[k]=f_start+k·(f_stop−f_start)/(N−1)Swept SA의 linear grid에만 사용하는 fallback이다. Instrument가 X-values를 제공하면 그것을 우선하고, N, start/stop, detector, RBW와 units를 trace artifact에 저장한다.
수식 열기Channel power의 linear integration
P_ch(W)=ΣₖPₖ(W)·wₖ; P_ch(dBm)=10log₁₀(P_ch/1 mW)wk는 bin/RBW filter와 window normalization을 반영한다. dBm을 직접 더하지 않는다. Built-in Channel Power와 host integration이 다르면 detector, ENBW, span edge와 correction을 먼저 비교한다.
한 result record의 최소 metadata
timestamp · VISA alias · *IDN? · *OPT? · firmware · mode · measurement · center/span · attenuation/preamp/reference level · RBW/VBW/detector · trigger · point count · *OPC? latency · overload status · result schema · error queue · cleanup result
Timeout을 결과값으로 바꾸지 않는다
*OPC?timeout은 measurement fail 또는 missing trigger일 수 있다. 이전 trace를 새 result로 반환하지 않는다.- Timeout 후 먼저
ABOR, status·error capture와 safe front-end cleanup을 수행한다. - 자동 retry는 동일 조건에서 무한 반복하지 않고 횟수를 제한한다.
- Mode load·narrow RBW·large averaging의 valid latency를 baseline으로 측정해 timeout을 설정한다.
- LAN 단절 때 software cleanup이 실행됐다고 가정하지 않는다. SG RF와 PA bias의 physical safe state를 독립적으로 감시한다.
완료 전 자기 설명
- Mode, measurement, acquisition과 result가 각각 어떤 state를 소유하는가?
INIT:IMM뒤 바로TRAC? TRACE1을 읽으면 stale data가 될 수 있는 이유는 무엇인가?*OPC?, query-back과SYST:ERR?는 각각 무엇을 증명하고 무엇을 증명하지 못하는가?- Swept trace와 Channel Power result를 같은 array로 취급하면 안 되는 이유는 무엇인가?
READ?와FETCh?를 production transaction에서 구분해야 하는 이유는 무엇인가?
단원을 닫기 전에
같은 조건으로 설명하고 재현할 수 있나요?
완료 기준
- Mode·measurement·front-end·acquisition·result를 분리한 N9020B SCPI state machine을 설명할 수 있다.
- Single sweep, peak marker, trace fetch, Channel Power, OBW와 ACP의 자주 쓰는 sequence를 작성할 수 있다.
- *OPC?, query-back, output queue, error queue, stale data와 timeout을 구분해 PyVISA transaction을 검증할 수 있다.
대표 bench
- Source
- Keysight N5182B known CW·two-tone·OFDM-like signal, low-power validation state
- DUT
- 50 Ω through를 먼저 검증하고 이후 protected connectorized PA path
- Analyzer
- Keysight N9020B-526/B1X/MPB/P26 firmware A.43.49, Connection Expert VISA alias MXA_N9020B
근거와 더 읽을 자료
- 장비 문서X-Series Signal Analyzer Programmer's GuideKeysight Technologies
- 장비 문서X-Series Signal Analyzer Spectrum Analyzer Mode User's & Programmer's ReferenceKeysight Technologies
- 장비 문서Programming Instruments with Keysight IO LibrariesKeysight Technologies