Keysight N9020B10 Hz to 26.5 GHz · 160 MHz analysis bandwidthFirmware A.43.4990분

자주 쓰는 SA 동작을 어떤 SCPI 상태기계로 묶어야 할까?

N9020B를 LAN/HiSLIP·PyVISA로 제어할 때 mode, front-end, sweep, marker, trace, Channel Power, OBW와 ACP를 동기화된 transaction으로 설계한다.

write("INIT:IMM")가 성공했다는 사실은 새 trace가 준비됐다는 뜻이 아니다. Command는 acquisition을 시작했을 뿐이고, trigger·sweep·averaging·measurement calculation이 끝난 뒤에야 result를 가져올 수 있다. 안정적인 SA 프로그램은 명령 목록보다 상태와 증거의 순서가 먼저다.

1

직관 · 무엇이 보이나?

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의 결과다.

SA SCPI state console

설정, acquisition, marker, trace와 one-button measurement를 어떤 순서로 검증할까?

한 줄 SCPI subset에서 command/query, fresh acquisition, output/error queue와 자주 쓰는 측정 recipe를 연습합니다.

교육용 계산 모델 · 실제 장비 정확도나 compliance 판정을 대신하지 않습니다.

초기 영향 경로 · Source → DUT → Acquisition → DSP / Math → Display

  1. Source파형·전력·할당초기 상태에서 관찰하는 stage
  2. DUT전달·반사·비선형초기 상태에서 관찰하는 stage
  3. Acquisitionmixer·IF·ADC초기 상태에서 관찰하는 stage
  4. DSP / MathRBW·FFT·복소수초기 상태에서 관찰하는 stage
  5. Displaytrace·marker·grid초기 상태에서 관찰하는 stage

먼저 결과를 예측해보세요

Center frequency를 바꾼 직후 INIT 없이 TRAC1:DATA?를 읽으면?

Command 전후 analyzer state와 trace freshness를 함께 봅니다

설정이 바뀌면 이전 trace는 stale입니다. INIT:IMM 뒤에 marker/data를 읽습니다.

N9020B spectrum traceCenter 3.500 GHz, span 200 MHz의 deterministic educational trace입니다.-120-90-60-3003.4003.4503.5003.5503.600Frequency · GHzPower level · dBm
그래프 값을 표로 보기
현재 SCPI state
항목값해석
ModeSASA / one-button application
Center / span3.500 GHz / 200 MHzFrequency state
RBW / VBW100 / 300 kHzResolution / smoothing
Atten / preamp30 dB / OFFFront-end level plan
TraceSTALEData query validity
QueuesOUT 0 · ERR 0Independent FIFO

SCPI transcript와 queue

*OPC?는 operation 동기화이며 trace freshness나 error drain을 대신하지 않습니다.

MODE SAACQ IDLETRACE STALEOUT Q 0ERR Q 0

    지금 보이는 변화의 원인

    같은 계산 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 검증이 따로 필요하다.

    2

    실무 조작·해석 · 무엇을 바꿀까?

    자주 쓰는 동작을 재사용 가능한 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·selectINST:CAT?, INST:SEL SA, INST:SEL?실제 mode 이름
    Measurement selectCONF:SAN:NDEF, CONF:CHP, CONF:OBW, CONF:ACP, CONF?선택 후 measurement
    Stop / singleABOR, INIT:CONT OFF, INIT:IMM, *OPC?Pending, latency, completion
    FrequencyFREQ:CENT, FREQ:SPAN, FREQ:STAR, FREQ:STOPQuery-back Hz
    Front endPOW:ATT:AUTO, POW:ATT, POW:GAIN, reference levelAttenuation, preamp, range
    FilteringBAND:RES, BAND:VID, 각 :AUTOActual RBW/VBW
    Detector·traceDET:TRAC1, TRAC1:TYPE, TRAC? TRACE1Enum, points, units
    Trigger`TRIG:SAN:SOUR IMMVID
    MarkerCALC:MARK1:STAT, max search, CALC:MARK1:X?, CALC:MARK1:Y?Frequency·amplitude pair
    Error/statusSYST:ERR?, ADC over-range/status queryFull 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가 필요하다.

    3

    수식·규격 · 어떻게 검증할까?

    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를 독립적으로 감시한다.

    완료 전 자기 설명

    1. Mode, measurement, acquisition과 result가 각각 어떤 state를 소유하는가?
    2. INIT:IMM 뒤 바로 TRAC? TRACE1을 읽으면 stale data가 될 수 있는 이유는 무엇인가?
    3. *OPC?, query-back과 SYST:ERR?는 각각 무엇을 증명하고 무엇을 증명하지 못하는가?
    4. Swept trace와 Channel Power result를 같은 array로 취급하면 안 되는 이유는 무엇인가?
    5. 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

    근거와 더 읽을 자료

    1. 장비 문서X-Series Signal Analyzer Programmer's GuideKeysight Technologies
    2. 장비 문서X-Series Signal Analyzer Spectrum Analyzer Mode User's & Programmer's ReferenceKeysight Technologies
    3. 장비 문서Programming Instruments with Keysight IO LibrariesKeysight Technologies