Keysight U2061XA10 MHz to 6 GHz · −70 to +26 dBm averageFirmware A.03.1675분

INIT, trigger, FETCh와 READ는 왜 같은 측정 명령이 아닐까?

U2061XA를 USB VISA와 PyVISA로 제어할 때 detector, aperture, averaging, trigger state, output/error queue와 acquisition lifecycle을 분리한다.

write("INIT")가 성공했다는 사실은 power reading이 준비됐다는 뜻이 아니다. Trigger source가 BUS라면 sensor는 event를 기다리고 있고, FETC?는 trigger를 만들지 않는다. 안정적인 자동화는 configure, arm, event, acquisition complete와 fetch를 서로 다른 state로 기록한다.

1

직관 · 무엇이 보이나?

SCPI 측정을 하나의 query가 아니라 acquisition state machine으로 보자

네 가지 명령은 서로 다른 일을 한다

  • MEAS? — abort + configure + read를 한 번에 수행한다. 간단하지만 설정을 preset해 fine control이 적다.
  • READ? — 현재 configuration으로 abort + initiate + 결과 반환을 수행한다. 새 acquisition이다.
  • INIT — Sensor를 wait-for-trigger state로 둔다. 결과를 output queue로 보내지 않는다.
  • FETC? — 이미 완료되어 memory에 있는 결과를 output queue로 가져온다. 새 acquisition을 시작하지 않는다.

INIT:CONT OFF는 반복 acquisition policy를 끄는 설정이지 armed=OFF를 뜻하지 않는다. 그 뒤 INIT를 보내면 continuous state는 OFF인 채 one-shot acquisition만 armed가 된다. 두 state를 하나의 boolean으로 저장하면 query-back과 실제 pending event를 혼동한다.

SCPI trigger state console

Configure, arm, trigger, fetch와 error drain을 서로 다른 상태로 읽고 있는가?

Aperture·averaging·trigger state와 output/error queue를 하나의 결정론적 U2061XA session으로 연결합니다.

교육용 계산 모델 · 실제 장비 정확도나 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

먼저 결과를 예측해보세요

TRIG:SOUR BUS 뒤 INIT만 보내고 *TRG 없이 FETC?를 호출하면?

Trigger event 뒤 delay와 aperture가 측정 구간을 자릅니다

AVER mode · 약 1,000 readings/s · trigger guarantee -40 dBm

Trigger, delay와 aperture timelineIMM trigger에서 0.0 microsecond 뒤 1,000 microsecond aperture로 평균합니다.IMM triggerdelay 0.0 µsaperture 1,000 µsAcquisition time · trigger reference
Detector
AVER
Trigger
IMM
Acquisition
IDLE
Last result
NONE
그래프 값을 표로 보기
SCPI trigger 핵심 상태
항목값해석
Detector modeAVERAVER는 aperture, NORM은 peak trace/VBW
Frequency3.500 GHzCorrection frequency
Aperture1,000 µsAverage integration interval
Reading rate1,000 /s1/aperture, 최대 50,000/s
Trigger sourceIMMIdle or complete
Trigger level-20.0 dBmCommand 범위와 guaranteed -40 dBm를 구분
QueuesOUT 0 · ERR 0각각 독립된 FIFO

한 줄 SCPI와 queue 변화를 같은 transcript에서 확인합니다

WRITE만으로 query를 보내면 response가 output queue에 남습니다.

OUTPUT Q 0ERROR Q 0ARMED NO

    지금 보이는 변화의 원인

    같은 계산 state
    변경
    IMM trigger · aperture 1,000 µs · average 16
    직접 효과
    INIT가 wait-for-trigger state를 만들고 event 뒤 aperture가 평균 구간을 정합니다.
    화면 결과
    출력 queue 0, error queue 0, acquisition은 IDLE입니다.
    비용·한계
    Web console은 transport timeout, USB disconnect와 실제 RF envelope를 재현하지 않습니다. Query마다 response를 읽고 error queue를 별도 drain해야 합니다.

    원인을 자기 말로 닫아보세요

    바꾼 물리량 → 영향을 받은 stage → 화면에서 바뀐 부분 → 비용·한계 순서로 설명합니다.

    먼저 예측을 맞게 고정하세요.

    측정 주의 · Error queue는 최대 30 record이므로 31회 안에 +0 종결을 확인하고, query response를 읽기 전에 다음 command를 보내지 마세요.

    Trigger source는 acquisition의 출발 조건이다

    Source의미주의
    IMMINIT 직후 바로 측정Free-run·단일 확인에 단순
    INTRF envelope level을 sensor가 검출Trigger level·hysteresis·VBW 조건 필요
    EXTSMB TTL input eventCable delay·level·impedance 기록
    BUS*TRG 또는 bus eventREAD?와 함께 쓰면 deadlock 가능
    HOLDTrigger를 정지명시적 TRIG:IMM 외에는 진행하지 않음
    2

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

    USB alias에서 configure→arm→fetch→drain 순서를 재현하자

    Session open 직후

    Connection Expert에서 serial number가 확인된 장비에 U2061XA 같은 VISA alias를 만든다. Production 코드에서 list_resources()[0]을 자동 선택하지 않는다.

    import pyvisa
    
    rm = pyvisa.ResourceManager()
    sensor = rm.open_resource("U2061XA")
    sensor.timeout = 10_000
    sensor.read_termination = "\n"
    sensor.write_termination = "\n"
    
    identity = sensor.query("*IDN?").strip()
    if "U2061XA" not in identity:
        raise RuntimeError(f"Expected U2061XA, received {identity!r}")

    Average measurement sequence

    SYST:ERR?
    *CLS
    SENS:DET:FUNC AVER
    SENS:FREQ 3.5GHZ
    SENS:SWE:APER 1MS
    SENS:AVER:COUN:AUTO ON
    CAL:ZERO:TYPE INT
    CAL:ALL?
    SENS:FREQ?
    SENS:SWE:APER?
    TRIG:SOUR IMM
    INIT:CONT OFF
    READ?
    SYST:ERR?

    CAL:ALL? response는 0=pass, 1=fail이다. Error queue의 +0,"No error"와 의미가 다르다.

    External 또는 BUS trigger sequence

    ABOR
    TRIG:SOUR EXT
    TRIG:SLOP POS
    TRIG:DEL 0
    TRIG:HOLD 100US
    INIT:CONT OFF
    INIT
    # external event 발생
    FETC?
    SYST:ERR?

    BUS trigger를 사용하면 INIT 뒤 *TRG, 그 다음 FETC? 순서다. *TRG는 arm 명령이 아니며 armed BUS acquisition에만 event가 된다. HOLD를 의도적으로 썼다면 armed 상태에서 TRIG:IMM로 한 번 release할 수 있지만, 자동 one-shot workflow는 우발적인 무한 대기를 피하려고 HOLD를 거절한다. Programming guide는 BUS/HOLD trigger와 READ? 조합에서 trigger deadlock을 경고한다.

    Aperture와 averaging query-back

    • Average aperture: carrier ≥300 MHz에서 20 µs~200 ms, 100 ns resolution
    • Carrier <300 MHz에서 minimum aperture 50 µs
    • Average count: 1~1024
    • Average count를 직접 쓰면 auto averaging이 꺼진다.
    • Count를 늘리면 noise는 줄지만 measurement time이 늘어난다.
    • Normal mode에서는 SENS:SWE:APER가 아니라 gate/trace와 VBW를 사용한다.

    Bounded error drain

    import re
    
    def drain_errors(sensor) -> list[str]:
        errors: list[str] = []
        for _ in range(31):
            response = sensor.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:
                return errors
            errors.append(response)
        raise RuntimeError("Error queue did not terminate with +0 within 31 queries")

    *CLS 전에 기존 오류를 log하고, configure·calibration·acquisition 뒤마다 drain한다. *CLS로 원인을 먼저 지우지 않는다.

    실제 실행 package는 U2061XA PyVISA 가이드의 dry-run sequence를 먼저 사용한다. --execute 없이는 USB session을 열지 않고, --sg-rf-off-confirmed 없이는 실제 acquisition을 시작하지 않는다.

    3

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

    Aperture, trigger timing과 queue ordering을 검증하자

    수식 열기Aperture와 최대 reading rate
    Rmax ≈ min(50,000, 1/Tap)

    20 µs aperture는 50,000 readings/s, 1 ms aperture는 약 1,000 readings/s에 해당한다. Transport와 설정에 따른 실제 throughput은 별도다.

    수식 열기Trigger 기준 측정 구간
    t_gate,start = t_trigger + t_delay;   t_gate,stop = t_gate,start + T_aperture

    Negative delay는 pre-trigger memory 범위와 mode limit 안에서만 가능하다. Average mode trigger delay 범위는 −1.6 ms~+1 s다.

    주요 trigger 수치

    • Trigger delay: Normal ±1 s, Average −1.6 ms~+1 s
    • Trigger holdoff: 1 µs~400 ms
    • External trigger high >2.4 V, low <0.7 V
    • External trigger maximum input: 5 V EMF 조건
    • Minimum external pulse: Average 150 ns, Normal 50 ns
    • Trigger level resolution 0.1 dB, hysteresis range 0~3 dB

    SCPI evidence ladder

    1. write 반환 — host가 byte를 전달함
    2. Query-back — 장비 state를 읽음
    3. *OPC? → 1 — 앞선 overlapped operation 완료
    4. SYST:ERR? → +0 — 해당 시점 error queue가 비어 있음
    5. READ? 또는 INIT→event→FETC? — acquisition 결과
    6. Known source와 다른 instrument의 cross-check — physical validity

    완료 전 자기 설명

    1. INIT 뒤 FETC?와 READ?가 다른 이유는 무엇인가?
    2. TRIG:LEV -45DBM이 받아들여져도 Normal mode trigger를 보장하지 않는 이유는 무엇인가?
    3. Output queue와 error queue를 어떤 순서로 읽어야 response를 잃지 않는가?
    4. Actual USB test를 dry-run과 별도의 permission으로 분리해야 하는 이유는 무엇인가?

    단원을 닫기 전에

    같은 조건으로 설명하고 재현할 수 있나요?

    완료 기준

    • MEAS?, READ?, INIT+FETCh?가 configuration과 acquisition을 어떻게 다르게 다루는지 설명할 수 있다.
    • Aperture, averaging, trigger level·delay·holdoff를 query-back하고 output/error queue를 독립적으로 drain할 수 있다.
    • USB VISA alias, model check, bounded error drain과 dry-run을 포함한 PyVISA sequence를 설계할 수 있다.

    대표 bench

    Source
    Trigger output을 제공하는 Keysight N5182B, 실제 실행 전 RF OFF 확인
    DUT
    50 Ω through 또는 보호된 low-power PA path
    Analyzer
    Keysight U2061XA USB-TMC session, Connection Expert alias PWR_U2061XA

    근거와 더 읽을 자료

    1. 장비 문서Keysight 2050/60 X-Series Programming GuideKeysight Technologies
    2. 장비 문서Keysight 2050/60 X-Series User's GuideKeysight Technologies
    3. 장비 문서Programming Instruments with Keysight IO LibrariesKeysight Technologies