CALC1:MEAS1:DATA:SDAT?가 숫자 배열을 돌려줬다고 해서 그 배열의 의미가 자동으로 증명되지는 않는다. 어떤 channel stimulus, 어떤 measurement definition, 어떤 correction state와 trigger 뒤에 읽었는지를 같이 고정해야 complex data가 재현 가능한 S-parameter가 된다.
직관 · 무엇이 보이나?
VNA 프로그램을 객체와 시간의 두 축으로 보자
객체 축: channel → measurement → trace → data
- Channel: frequency, power, IFBW, averaging와 trigger 같은 sweep state를 가진다.
- Measurement:
S11,S21처럼 receiver ratio를 정의한다. - Trace/window: measurement를 front-panel에 어떤 format·scale로 보일지 연결한다.
- Data: corrected/un-corrected complex pair 또는 formatted values를 host로 가져온다.
Display trace가 없어도 measurement data를 query할 수 있고, trace format을 Smith로 바꿔도 underlying corrected complex SDATA가 Smith 좌표로 바뀌어 저장되는 것은 아니다.
INIT를 보낸 뒤 바로 SDATA를 읽는 것과 *OPC? 뒤 읽는 것은 왜 다를까?
Channel·measurement·trigger·queue와 corrected complex data의 생명주기를 작은 SCPI state machine으로 확인합니다.
교육용 계산 모델 · 실제 장비 정확도나 compliance 판정을 대신하지 않습니다.
- Source파형·전력·할당초기 상태에서 관찰하는 stage
- DUT전달·반사·비선형
- Acquisitionmixer·IF·ADC초기 상태에서 관찰하는 stage
- DSP / MathRBW·FFT·복소수초기 상태에서 관찰하는 stage
- Displaytrace·marker·grid초기 상태에서 관찰하는 stage
먼저 결과를 예측해보세요
INIT1:IMM 다음 *OPC?의 역할은?
- ◆STIMSource sweep
- ◇SEPa / b waves
- ◆RXR1 · A · B
- ◆CALError terms
- ◆MATHComplex ratio
- ◆VIEWTrace · Smith
- Measurement
- S21
- Acquisition
- idle · stale
- Output / error queue
- 0 / 0
- Pending
- none
Command → trigger → completion → fresh data
MAN/EXT는 event 전 armed 상태입니다. Event 없는 *OPC?는 응답하지 않고, complete 전 SDATA/FDATA는 stale-data error로 차단됩니다.
empty+0, "No error"그래프 값을 표로 보기
| 항목 | 값 | 해석 |
|---|---|---|
| Source | -30.0 dBm · RF OFF | Power limit OFF |
| Acquisition | idle · stale | Trigger IMM · completed sweeps 0 |
| Queues | OQ 0 · EQ 0 | FIFO, *CLS clears status/error but does not create fresh data |
| Pending | none | INIT → event → *OPC? → data 순서를 닫아야 함 |
지금 보이는 변화의 원인
같은 계산 state- 변경
- 아직 command 없음
- 직접 효과
- State, output queue, error queue와 pending operation을 서로 독립적으로 갱신합니다.
- 화면 결과
- Acquisition idle · data stale · Pending 0
- 비용·한계
- 가상 console은 한 줄 한 message만 지원합니다. 실제 binary REAL,32 data는 byte order·point count와 definite block을 함께 검증합니다.
원인을 자기 말로 닫아보세요
바꾼 물리량 → 영향을 받은 stage → 화면에서 바뀐 부분 → 비용·한계 순서로 설명합니다.
먼저 예측을 맞게 고정하세요.
측정 주의 · 통신 단절 시 software OUTP OFF는 보장되지 않습니다. 실제 PA bench에는 external attenuation, interlock와 DUT-specific bias shutdown이 별도로 필요합니다.
시간 축: configure → trigger → complete → fetch
INIT1:IMM은 acquisition을 시작하거나 trigger를 기다리도록 arm하는 명령이다. Host write가 끝난 순간 receiver sweep까지 끝났다는 뜻이 아니다. TRIG:SOUR IMM이면 INIT가 즉시 trigger event가 되고, MAN이면 *TRG, EXT이면 실제 external edge가 있어야 sweep가 시작된다. 그 뒤 *OPC? 또는 장비가 문서화한 status/event synchronization으로 완료를 확인하고 data를 가져온다.
가상 console도 idle → armed → sweeping → complete를 분리한다. MAN/EXT가 armed인 동안 *OPC?는 완료 1을 위조하지 않고 would-time-out으로 남는다. Event와 completion 전 SDAT?/FDAT?는 −230 stale data로 거절한다. EXT는 console의 EXT edge simulation 버튼으로 한 번의 edge를 재현한다.
실무 조작·해석 · 무엇을 바꿀까?
PyVISA transaction을 안전한 source state와 동기화하자
VISA alias와 identity를 configuration으로 받는다
Keysight IO Libraries Suite/Connection Expert에서 장비를 발견하고 alias를 만든다. Production code는 IP를 source에 하드코딩하지 않고 E5080B_VISA_RESOURCE 또는 CLI argument로 승인된 alias/resource를 받는다.
import os
import pyvisa
resource = os.environ["E5080B_VISA_RESOURCE"]
rm = pyvisa.ResourceManager()
vna = rm.open_resource(resource)
vna.timeout = 20_000
vna.read_termination = "\n"
vna.write_termination = "\n"
try:
identity = vna.query("*IDN?").strip()
if "E5080B" not in identity:
raise RuntimeError(f"unexpected instrument: {identity}")
vna.write("OUTP OFF")
finally:
try:
vna.write("OUTP OFF")
finally:
vna.close()
rm.close()사이트와 함께 제공하는 E5080B PyVISA 실행 가이드의 예제는 dry-run이 기본이다. 실제 통신은 --execute, source enable은 추가 --rf-on consent가 필요하다. Physical RF ON은 DUT input limit, receiver working limit, 최대 DUT gain을 명시하고 signed path gain/loss·uncertainty·guard를 포함한 worst-case envelope와 full configuration query-back이 통과해야 한다. S12/S22처럼 port 2 source를 쓰는 physical acquisition은 세 번째 --reverse-drive consent가 없으면 driver와 CLI 양쪽에서 거절한다.
안전한 single-S21 acquisition
*IDN?
*OPT?
OUTP OFF
*CLS
SYST:POW1:LIM -20 DBM
SYST:POW1:LIM:STAT ON
SOUR1:POW1 -30 DBM
SENS1:FREQ:STAR 1 GHZ
SENS1:FREQ:STOP 6 GHZ
SENS1:SWE:POIN 201
SENS1:BWID 1 KHZ
CALC1:PAR:DEF:EXT 'RF_WIKI_S21','S21'
CALC1:PAR:SEL 'RF_WIKI_S21'
CALC1:PAR:MNUM?
TRIG:SOUR IMM
OUTP ON
INIT1:IMM
*OPC?
FORM:DATA ASC,0
FORM:DATA?
SENS1:CORR:STAT?
SENS1:CORR:CSET:ACT? NAME
CALC1:MEAS<mnum>:X:VAL?
CALC1:MEAS<mnum>:DATA:SDAT?
SYST:ERR?
OUTP OFF<mnum>은 RF_WIKI_S21을 선택한 뒤 CALC1:PAR:MNUM?으로 읽은 실제 번호로 치환한다. 저장된 상태가 우연히 MEAS1이라고 추측하지 않는다. 예제는 ASCII를 강제하고 FORM:DATA?를 확인하며, correction ON과 active CalSet name이 사용자가 지정한 --expected-calset과 일치할 때만 결과를 corrected SDATA로 표시한다. OUTP ON은 identity, *OPT?의 2K0, limit, DUT, receiver protection과 bias preflight가 통과한 별도 단계에만 둔다.
*OPC?와 timeout을 함께 설계한다
- Timeout은 longest valid sweep보다 길고 hang detection에는 충분히 짧게 정한다.
- Sweep time은 points, IFBW, averaging, calibration/fixture math와 trigger 조건에 따라 바뀐다.
- MAN/EXT에서 event가 오지 않으면
*OPC?가 기다리는 것이 정상이다. Timeout을 sweep 완료로 바꾸거나 이전 trace를 새 data로 반환하지 않는다. - 순서는
INIT → trigger event → *OPC?=1 → SDATA/FDATA다. 새 configuration 또는ABOR뒤에는 data를 stale로 되돌린다. *OPC?timeout 뒤 같은 sweep를 무조건 재시작하지 않는다. Instrument state와 pending operation을 먼저 진단한다.- Abort path에서는
ABOR,OUTP OFF, error/status capture 순서를 장비 문서와 station safety policy에 맞춘다. - Network loss에서는 software OFF가 보장되지 않으므로 hardware interlock가 필요하다.
SDATA 배열 검증
- 고유 measurement name을 정의·선택하고
MNUM?으로 data query 대상 번호를 확인한다. FORM:DATA?가 코드가 해석할 ASCII 또는 명시된 binary format과 같은지 확인한다.SENS1:CORR:STAT?와 active CalSet name을 확인한다. 하나라도 다르면 “corrected” label을 붙이지 않는다.X:VAL?의 frequency count가 requested points와 같은지 확인한다.- SDATA scalar count가
2 × points인지 확인한다. [Re0, Im0, Re1, Im1, ...]로 complex pair를 만든다.- NaN/Inf, truncated block와 unexpected endian을 거절한다.
- Measurement name/number, parameter, correction/CalSet state와 stimulus snapshot을 data artifact에 함께 저장한다.
- Marker 값과 first/middle/last point를 front panel에서 spot-check한다.
ASCII와 binary를 분리해 구현한다
- ASCII는 사람이 확인하기 쉽지만 느리고 문자열 parsing 오버헤드가 크다.
REAL,32는 빠르고 compact하지만 definite-length block header와 byte order를 정확히 처리해야 한다.FORM:BORD SWAP또는NORM의 의미를 host endian과 라이브러리 option에 맞춰 확인한다.- Binary query에서 text termination을 payload에 임의 적용하지 않는다.
- Block payload bytes와 declared length, 4-byte scalar count를 검증한다.
Error queue는 no-error까지 제한된 drain을 한다
def drain_errors(vna, maximum=32):
records = []
for _ in range(maximum):
response = vna.query("SYST:ERR?").strip()
records.append(response)
if response.startswith("+0,") or response.startswith("0,"):
nonzero = [record for record in records if not record.startswith(("+0,", "0,"))]
if nonzero:
raise RuntimeError(f"configuration failed: {nonzero}")
return records
raise RuntimeError("error queue did not reach no-error within bound")*CLS는 status를 정리하지만 원하는 channel/measurement/calibration을 구성하지 않는다. 기존 오류를 log하기 전에 무조건 *CLS로 지우면 원인 증거가 사라진다. Drain 끝에서 +0을 보았더라도 앞서 nonzero record가 있었다면 configure 실패로 RF ON을 차단한다.
수식·규격 · 어떻게 검증할까?
Complex pair, queue와 acquisition consistency를 수식으로 닫자
수식 열기SDATA complex packing
S[k] = data[2k] + j·data[2k+1], k=0…N−1Frequency array f[k]와 동일한 index로 묶는다. Point count가 다르면 잘라 맞추지 말고 transaction을 invalid로 처리한다.
수식 열기Magnitude와 phase 변환
Mag_dB=20log₁₀√(Re²+Im²), φ=atan2(Im,Re)Phase unwrap은 measurement 목적에 맞춰 별도 수행한다. SDATA를 dB로 변환한 뒤 complex information을 복구할 수는 없다.
RDATA, SDATA, FDATA 선택 원칙
- RDATA: receiver/raw correction 단계 분석이 필요할 때만 해당 command의 정확한 semantics를 문서에서 확인한다.
- SDATA: corrected complex S-parameter를 후처리·저장할 때 기본 선택이다.
- FDATA: front-panel display와 같은 formatted marker/trace 값을 재현할 때 사용한다.
Data access spelling과 반환 구조는 E5080B firmware A.20.25.03 online help를 source of truth로 둔다. PNA나 E5081A 예제의 명령을 이름이 비슷하다는 이유로 섞지 않는다.
한 transaction의 최소 log
timestamp · VISA resource alias · *IDN? · *OPT? · firmware · channel state · measurement definition · correction/CalSet ID · trigger source · *OPC? latency · data format/endian · point count · error queue · cleanup result
Cause/Effect를 자기 말로 닫기
“INIT1:IMM이 channel sweep를 시작했기 때문에 host write 성공만으로 SDATA를 읽지 않고 *OPC?로 완료를 동기화했다. 그 뒤 frequency N개와 SDATA 2N개를 확인해 complex pair로 묶었고, correction state·measurement ID·error queue와 함께 저장했다.”
완료 전 자기 설명
- Channel, measurement, display trace와 SDATA는 각각 무엇을 소유하는가?
*OPC?, output queue와 error queue가 서로 대신할 수 없는 이유는 무엇인가?- REAL,32 block을 complex S-parameter로 복원하기 전에 어떤 길이·endian 검증이 필요한가?
단원을 닫기 전에
같은 조건으로 설명하고 재현할 수 있나요?
완료 기준
- Channel, measurement, display trace와 data array가 같은 객체가 아님을 설명할 수 있다.
- INIT→*OPC?→SDATA/X-values→error drain의 동기화된 acquisition을 작성할 수 있다.
- ASCII와 REAL,32 binary data의 complex pair, byte order와 point count를 검증할 수 있다.
대표 bench
- Source
- Keysight E5080B-2K0 connected through a verified VISA alias, HiSLIP preferred for LAN example
- DUT
- 50 Ω through/passive DUT for software validation before active-device use
- Analyzer
- E5080B channel 1 complex measurement and local Python 3/PyVISA
근거와 더 읽을 자료
- 장비 문서E5080B Programming GuideKeysight Technologies
- 장비 문서Controlling the VNA Using Python and HiSLIPKeysight Technologies
- 장비 문서Understanding Command SynchronizationKeysight Technologies