write("INIT")가 성공했다는 사실은 power reading이 준비됐다는 뜻이 아니다. Trigger source가 BUS라면 sensor는 event를 기다리고 있고, FETC?는 trigger를 만들지 않는다. 안정적인 자동화는 configure, arm, event, acquisition complete와 fetch를 서로 다른 state로 기록한다.
직관 · 무엇이 보이나?
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를 혼동한다.
Configure, arm, trigger, fetch와 error drain을 서로 다른 상태로 읽고 있는가?
Aperture·averaging·trigger state와 output/error queue를 하나의 결정론적 U2061XA session으로 연결합니다.
교육용 계산 모델 · 실제 장비 정확도나 compliance 판정을 대신하지 않습니다.
- Source파형·전력·할당초기 상태에서 관찰하는 stage
- DUT전달·반사·비선형초기 상태에서 관찰하는 stage
- Acquisitionmixer·IF·ADC초기 상태에서 관찰하는 stage
- DSP / MathRBW·FFT·복소수초기 상태에서 관찰하는 stage
- Displaytrace·marker·grid초기 상태에서 관찰하는 stage
먼저 결과를 예측해보세요
TRIG:SOUR BUS 뒤 INIT만 보내고 *TRG 없이 FETC?를 호출하면?
Trigger event 뒤 delay와 aperture가 측정 구간을 자릅니다
AVER mode · 약 1,000 readings/s · trigger guarantee -40 dBm
- Detector
- AVER
- Trigger
- IMM
- Acquisition
- IDLE
- Last result
- NONE
그래프 값을 표로 보기
| 항목 | 값 | 해석 |
|---|---|---|
| Detector mode | AVER | AVER는 aperture, NORM은 peak trace/VBW |
| Frequency | 3.500 GHz | Correction frequency |
| Aperture | 1,000 µs | Average integration interval |
| Reading rate | 1,000 /s | 1/aperture, 최대 50,000/s |
| Trigger source | IMM | Idle or complete |
| Trigger level | -20.0 dBm | Command 범위와 guaranteed -40 dBm를 구분 |
| Queues | OUT 0 · ERR 0 | 각각 독립된 FIFO |
한 줄 SCPI와 queue 변화를 같은 transcript에서 확인합니다
WRITE만으로 query를 보내면 response가 output queue에 남습니다.
지금 보이는 변화의 원인
같은 계산 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 | 의미 | 주의 |
|---|---|---|
IMM | INIT 직후 바로 측정 | Free-run·단일 확인에 단순 |
INT | RF envelope level을 sensor가 검출 | Trigger level·hysteresis·VBW 조건 필요 |
EXT | SMB TTL input event | Cable delay·level·impedance 기록 |
BUS | *TRG 또는 bus event | READ?와 함께 쓰면 deadlock 가능 |
HOLD | Trigger를 정지 | 명시적 TRIG:IMM 외에는 진행하지 않음 |
실무 조작·해석 · 무엇을 바꿀까?
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 aperture50 µ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을 시작하지 않는다.
수식·규격 · 어떻게 검증할까?
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_apertureNegative 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
write반환 — host가 byte를 전달함- Query-back — 장비 state를 읽음
*OPC? → 1— 앞선 overlapped operation 완료SYST:ERR? → +0— 해당 시점 error queue가 비어 있음READ?또는INIT→event→FETC?— acquisition 결과- Known source와 다른 instrument의 cross-check — physical validity
완료 전 자기 설명
INIT뒤FETC?와READ?가 다른 이유는 무엇인가?TRIG:LEV -45DBM이 받아들여져도 Normal mode trigger를 보장하지 않는 이유는 무엇인가?- Output queue와 error queue를 어떤 순서로 읽어야 response를 잃지 않는가?
- 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
근거와 더 읽을 자료
- 장비 문서Keysight 2050/60 X-Series Programming GuideKeysight Technologies
- 장비 문서Keysight 2050/60 X-Series User's GuideKeysight Technologies
- 장비 문서Programming Instruments with Keysight IO LibrariesKeysight Technologies