# Otter I-V Expert 명령어 안내서

**대상**: 직접 프로그램을 작성하여 장비를 제어하려는 사용자
**앱**: v1.10.3 기준
**펌웨어**: v0.2.60 기준 (`*IDN?` 로 확인하실 수 있습니다)
**작성**: Semi Otter Edu Co., Ltd.

> **홈페이지 공개판입니다.** 공장 교정과 장비 신원을 바꾸는 명령, 진단 명령은
> 빠져 있습니다. 전체판은 장비와 함께 보내 드리며, 받지 못하셨으면
> sales@semiotteredu.com 으로 요청해 주십시오.

Otter I-V Expert 를 프로그램에서 제어하시는 방법은 두 가지입니다. 앱의 실행
파일을 명령창에서 부르시는 방법과, USB 가상 COM 포트로 텍스트 명령을 직접
주고받으시는 방법입니다. 앱에 이미 있는 아홉 가지 측정이라면 앞의 방법이 훨씬
짧으므로 **§1** 을 먼저 보아 주십시오. 뒤의 방법은 §2 부터 이어지며, 앱이 하는
모든 일이 이 명령들로 이루어지므로 여기 적힌 것만으로 앱과 동등한 제어가
가능합니다. Python, MATLAB, LabVIEW 등 시리얼 포트를 열 수 있는 환경이면
무엇이든 쓰실 수 있습니다.

> **AI 도구로 코드를 작성하실 때**: 이 문서 전체를 그대로 붙여 넣으시면 됩니다.
> 명령의 철자와 응답 형식이 정확해야 하므로, 요약본보다 원문을 주시는 편이
> 결과가 좋습니다. 다만 AI 가 만들어 낸 코드는 **§10 안전 수칙**에 비추어 한 번
> 확인해 주시기 바랍니다. 특히 컴플라이언스를 설정하지 않은 채 출력을 켜는
> 코드는 시료를 손상시킬 수 있습니다.

---

## 목차

1. [명령창(CLI)으로 실행하기](#1-명령창cli으로-실행하기)
2. [연결](#2-연결)
3. [명령 문법](#3-명령-문법)
4. [가장 짧은 예제](#4-가장-짧은-예제)
5. [소스 설정 — 전압과 컴플라이언스](#5-소스-설정--전압과-컴플라이언스)
6. [측정 설정 — 레인지와 NPLC](#6-측정-설정--레인지와-nplc)
7. [측정](#7-측정)
8. [상태 확인과 오류](#8-상태-확인과-오류)
9. [펄스 엔진](#9-펄스-엔진)
10. [안전 수칙](#10-안전-수칙)
11. [전체 명령 목록](#11-전체-명령-목록)

---

## 1. 명령창(CLI)으로 실행하기

v1.2.0 부터 Otter I-V Expert 의 실행 파일은 창을 열지 않고도 측정을 수행합니다.
앱의 탭에 있는 아홉 가지 측정은 아래 명령 한 줄로 끝나므로, 이 문서의 §3 이후에
나오는 SCPI 명령을 직접 조합하지 않으셔도 됩니다.

**자동화 코드를 작성하실 때에는 이쪽을 먼저 검토해 주십시오.** 컴플라이언스
설정, 레인지 선택, 측정 전 정착 대기, 끝난 뒤 출력 끄기까지 앱과 완전히 같은
코드가 처리하므로, 직접 구현하실 때 빠뜨리기 쉬운 부분이 남지 않습니다.

```
"C:\Program Files\OtterIVExpert\OtterIVExpert.exe" cli list
"C:\Program Files\OtterIVExpert\OtterIVExpert.exe" cli iv --v-start -1 --v-stop 1 --v-step 0.1 --csv out.csv
```

첫 인자로 `cli` 를 주시면 명령창 모드로 동작하고, 인자 없이 실행하시면 지금까지와
똑같이 창이 열립니다. 하나의 실행 파일이 두 가지로 동작하는 것입니다. 설치
위치는 설치하실 때 고르신 범위에 따라 달라지며, 이 컴퓨터 전체에 설치하셨다면
`C:\Program Files\OtterIVExpert\`, 현재 사용자에게만 설치하셨다면
`%LOCALAPPDATA%\Programs\OtterIVExpert\` 입니다.

### 실행할 수 있는 측정

| 하위 명령 | 앱의 탭 |
|---|---|
| `list` | 연결된 Otter 기기를 찾아 포트와 `*IDN?` 을 출력합니다 |
| `iv` | I-V Sweep |
| `it` | I-t (시간에 따른 전류) |
| `fet-output` | FET Output |
| `fet-transfer` | FET Transfer |
| `retention` | Mem Retention |
| `endurance` | Mem Endurance |
| `ltp` | Mem LTP/LTD |
| `sequence` | Pulse Sequence |
| `epsc` | Synaptic EPSC/PPF |

각 측정이 받는 고유한 인자는 `cli <측정> --help` 로 확인하실 수 있습니다.

### 모든 측정이 공통으로 받는 인자

| 인자 | 뜻 |
|---|---|
| `--port COM45` | 사용할 포트입니다. 생략하시면 자동으로 찾습니다 |
| `--params <파일.json>` | 설정을 파일에서 읽습니다. 개별 인자가 파일보다 우선합니다 |
| `--csv <경로>` | 측정점을 이 파일에 씁니다. 생략하시면 표준 출력으로 나옵니다 |
| `--json` | 결과 전체를 기계가 읽을 수 있는 한 덩어리로 표준 출력에 씁니다. `cli` 바로 뒤에 놓아 주십시오 |
| `--dry-run` | 포트를 열지 않고 설정만 검사하며, 인가될 전압을 보여 줍니다 |
| `--quiet` | 측정점마다 찍히는 줄을 생략합니다 |
| `--range <A>` | 전류 레인지를 고정합니다. **네 값만 쓰십시오** (아래 주의). `--range auto` 는 자동 레인지입니다 (`--params` 파일에서는 `"range": "auto"` 또는 `null`) |
| `--nplc <n>` | 적분 시간입니다 |

채널이 하나인 측정은 `--channel`, `--compliance`, `--neg-compliance` 를 함께
받습니다. FET 처럼 채널을 둘 쓰는 측정은 각각의 이름이 따로 있으므로 `--help`
를 확인해 주십시오.

컴플라이언스 인자에는 숫자 대신 `auto` 를 주실 수 있습니다(v1.9.2). 앱의 AUTO 와
같이 레인지를 따릅니다. AUTO·20 mA 레인지는 20 mA, 1 mA 레인지는 1.2 mA, 20 µA·1 µA
레인지는 50 µA 입니다. `--params` 파일에서는 `"compliance": "auto"` 로 적습니다.
I-t 와 멤리스터 측정의 게이트처럼 레인지를 고정하지 않는 채널은 20 mA 가 됩니다.
기본값은 지금처럼 숫자(1 mA)입니다.

`iv`, `fet-output`, `fet-transfer` 는 앱의 Smart NPLC 와 중앙값 필터에 해당하는
인자를 더 받습니다(v1.9.0). 뜻은 사용 설명서 §6 과 같습니다.

| 인자 | 뜻 |
|---|---|
| `--smart-nplc` | Smart NPLC 를 켭니다. 포인트마다 첫 판독으로 전류 구간을 정하고, 그 구간의 NPLC 만큼 NPLC 1 판독을 반복해 평균합니다. 켜면 `--nplc` 는 쓰이지 않습니다. 기본값은 꺼짐입니다 |
| `--smart-nplc-bands 10,5,2,1` | 구간별 NPLC 를 sub-nA(1 nA 미만), nA, µA, mA(1 mA 이상) 순서로 1 ~ 100 의 정수 네 개로 줍니다. 기본값은 `10,5,2,1` 이며 `--smart-nplc` 와 함께 주셔야 쓰입니다 |
| `--smart-nplc-on drain\|gate\|both` | FET 측정에서만 받습니다. Smart NPLC 를 적용할 채널이며 기본값은 `drain` 입니다. 적용하지 않는 채널은 NPLC 1 로 읽습니다 |
| `--median-rank <R>` | 포인트마다 2R+1 번 읽어 V 와 I 각각의 중앙값을 씁니다. 0 ~ 5 의 정수이고 0(기본값)은 꺼짐입니다. 점당 시간이 2R+1 배가 됩니다 |

`iv`, `it`, `fet-output`, `fet-transfer`, `epsc` 는 `--auto-discard <N>` 도 받습니다
(v1.10.3). 레인지가 AUTO 인 채널에서 출력을 켠 뒤 처음 N 번의 판독을 버리고 측정을
시작합니다. AUTO 는 출력을 켤 때마다 1 mA 레인지에서 시작해 작은 전류가 세 번 연속
읽힌 뒤에 낮은 레인지로 내려가므로, 처음 두 번의 판독에는 수 nA 의 오차가 실립니다.
0 ~ 20 의 정수이고 기본값은 5 입니다. 0 을 주면 고정 레인지처럼 1 번만 버립니다.
레인지를 고정한 채널은 이 값과 관계없이 1 번만 버립니다. 앱의 **설정 → AUTO 레인지
첫 판독 버리기** 와 같은 기능이며, 명령창은 앱의 설정을 읽지 않으므로 이 인자로
정합니다. `--params` 파일에서는 `"auto_discard_reads": 5` 로 적습니다.

지정하지 않으신 인자는 앱의 해당 탭이 쓰는 기본값으로 채워집니다. 따라서
`cli iv --csv out.csv` 만 주셔도 탭을 열고 Run 을 누르신 것과 같은 스윕이
실행됩니다.

> **주의 — `--range` 는 넣으신 값을 그대로 쓰지 않습니다.** 쓸 수 있는 값은
> `1E-2`, `1E-3`, `1E-5`, `1E-6` 네 가지입니다. 그 밖의 값을 넣으셔도 명령창은
> 막지 않고, 장비가 상용로그를 반올림하여 가장 가까운 자릿수로 조용히 바꿉니다.
> `--range 5E-4` 는 오류 없이 **1 mA 레인지로 측정됩니다.**
>
> **결과 파일 옆에 저장되는 `.md` 에는 요청하신 값이 그대로 적힙니다.** 장비에서
> 되읽지 않기 때문입니다. 그래서 파일에는 `5E-4` 가 남고 실제 측정은 1 mA
> 레인지에서 이루어진 상태가 되며, 나중에 이를 알아채기 어렵습니다. 자세한 내용과
> 거부되는 값은 §6 에 있습니다.

### 프로그램에서 부르실 때 알아 두실 것

- **종료 코드**는 측정이 끝났고 장비가 오류를 보고하지 않았을 때에만 `0` 이며,
  그 밖에는 `1` 입니다. 호출하시는 쪽에서 이 값으로 분기하시면 됩니다.
- **`--json` 을 주시면** 결과 객체는 표준 출력으로, 사람이 읽을 진행 상황은
  표준 오류로 나뉘어 나옵니다. 두 가지가 섞이지 않으므로 표준 출력을 그대로
  `json.loads` 에 넣으실 수 있습니다. 이 인자는 측정 이름보다 앞, 즉 `cli`
  바로 뒤에 놓아 주십시오.
- **기기가 하나만 연결되어 있으면** 자동으로 찾습니다. 둘 이상이면 `--port` 를
  요구하며 임의로 고르지 않습니다. 교정 지그도 같은 USB 제조사 번호를 쓰기
  때문에, 찾을 때에는 번호가 아니라 `*IDN?` 응답으로 판별합니다.
- **`--csv` 를 주시면** 같은 이름의 `.md` 파일이 나란히 저장됩니다. 설정값과
  기기 온도, 지령 전압의 도달 여부가 기록되므로 앱에서 저장하신 것과 같은
  수준으로 추적하실 수 있습니다.
- **CSV 에 `note` 열이 붙는 경우**가 있습니다(v1.9.0). 전류가 고정한 레인지를
  넘은 점이 하나라도 있으면 마지막에 `note` 열이 생기고, 그 점의 행에
  `over range` 라고 적힙니다. 그 행의 전류는 레인지 끝에서 잘린 값이며 실제
  전류는 그보다 큽니다(하한). 그런 점이 없으면 이 열은 생기지 않으므로, 열
  개수를 고정해 읽는 코드라면 열 이름으로 찾아 주십시오.
- **예열과 영점 조정은 직접 챙기셔야 합니다.** 명령창에서 실행하신다고 해서
  §10 안전 수칙이 달라지지는 않습니다.

`--json` 이 내놓는 객체의 주요 필드는 다음과 같습니다.

| 필드 | 내용 |
|---|---|
| `ok` | 측정이 끝났고 오류가 없으면 참입니다 |
| `aborted` | 중간에 중단되었으면 참입니다 |
| `idn`, `port` | 실제로 사용한 장비와 포트입니다 |
| `params` | 기본값까지 채워 넣은, 실제로 사용된 설정 전체입니다 |
| `n_points` | 측정점 개수입니다 |
| `errors` | 장비가 보고한 오류 목록입니다. 비어 있어야 정상입니다 |
| `points` | 측정점 배열입니다 |

측정점 하나는 `sweep`, `idx`, `t`, `v_set`, `v_mon`, `i` 가운데 그 측정에
해당하는 항목을 담습니다. `v_set` 은 지령 전압, `v_mon` 은 장비가 되읽은
감시 전압, `i` 는 전류(A)입니다.

```python
import json, subprocess

EXE = r"C:\Program Files\OtterIVExpert\OtterIVExpert.exe"

r = subprocess.run(
    [EXE, "cli", "--json", "iv",
     "--v-start", "-1", "--v-stop", "1", "--v-step", "0.1"],
    capture_output=True, text=True, encoding="utf-8")

if r.returncode != 0:
    raise SystemExit(r.stderr)

out = json.loads(r.stdout)
for pt in out["points"]:
    print(pt["v_set"], pt["i"])
```

### 이 문서의 나머지가 필요한 경우

아래의 세 가지에 해당하시면 §2 부터 이어서 읽어 주십시오.

1. 앱에 없는 측정을 하셔야 하는 경우입니다.
2. 다른 장비와 동작을 번갈아 가며 맞추셔야 하는 경우입니다.
3. 측정 도중의 값에 따라 다음 전압을 정하는 것처럼, 실시간으로 판단하셔야 하는
   경우입니다.

---

## 2. 연결

| 항목 | 값 |
|---|---|
| 전송 방식 | USB CDC (가상 COM 포트) |
| 보율(baud) | `4000000` 을 쓰시면 됩니다 |
| 데이터 비트 / 패리티 / 정지 비트 | 8 / none / 1 |
| 흐름 제어 | 없음 |
| 명령 끝 문자 (PC → 장비) | `\n`. `\r\n` 도 받습니다 |
| 응답 끝 문자 (장비 → PC) | `\n` |
| 권장 응답 대기 시간 | 10 초. `:CAL:*` 는 60 초 |

보율은 형식상 필요한 값일 뿐입니다. Teensy 의 네이티브 USB 는 실제 통신 속도를
보율로 정하지 않으므로 어떤 값을 넣으셔도 속도는 같습니다. 다만 앱과 동일하게
`4000000` 을 쓰시기를 권합니다.

### 포트 찾기

장비는 PJRC 의 USB 제조사 번호 **VID `0x16C0`** 으로 나타납니다. COM 번호는
케이블을 다시 꽂을 때마다 바뀔 수 있으므로 번호로 찾지 마시고 VID 로 찾으신 뒤,
`*IDN?` 응답으로 확인하시는 편이 안전합니다.

```python
import serial, serial.tools.list_ports

def find_otter():
    for p in serial.tools.list_ports.comports():
        if p.vid == 0x16C0:
            yield p.device
```

**중요합니다.** 같은 VID 를 쓰는 다른 SemiOtter 장비(교정 지그 등)가 함께 연결되어
있을 수 있습니다. 반드시 `*IDN?` 의 두 번째 필드가 `Otter-IV-Expert` 인지
확인하신 뒤에 명령을 보내십시오.

### 포트는 한 번에 하나만 열립니다

Otter I-V Expert 앱이 실행 중이면 포트를 점유하고 있어서 다른 프로그램이 열 수
없습니다. 직접 작성하신 프로그램을 쓰실 때에는 앱을 먼저 종료해 주십시오.

---

## 3. 명령 문법

한 줄에 명령 하나를 보내고, 질의(`?`)에는 한 줄의 응답이 돌아옵니다. 질의가
아닌 명령에는 **아무 응답도 오지 않습니다.**

```
:SOUR1:VOLT 1.5        ← 설정. 응답 없음
:SOUR1:VOLT?           ← 질의
+1.500000E+00          ← 응답
```

### 채널 지정

장비에는 독립된 채널이 두 개 있습니다. 명령의 첫 부분 뒤에 숫자를 붙여
지정합니다.

```
:SOUR1:VOLT 1.5        채널 1
:SOUR2:VOLT -2.0       채널 2
:READ1?                채널 1 에서 읽기
```

숫자를 생략하면 **채널 1** 로 간주합니다. 다만 두 채널을 함께 쓰시는 코드에서는
항상 명시하시는 편이 실수가 적습니다.

### 대소문자와 공백

명령 부분은 대소문자를 구분하지 않습니다(`:sour1:volt` 도 동작합니다). 인자는
원래 대소문자가 유지됩니다. 명령과 인자 사이는 공백 하나로 구분합니다.

### 숫자 표기

응답의 숫자는 항상 부호와 지수가 붙은 형태입니다.

```
+1.500000E+00      전압 (V)
-2.345678E-06      전류 (A)
```

보내실 때에는 `1.5`, `1.5E0`, `+1.5` 모두 받습니다.

### 값이 없을 때: 9.91E+37

측정값 대신 **`+9.910000E+37`** 이 돌아오면 그것은 숫자가 아니라 "값이 없음"을
뜻하는 표식입니다. 대개 출력이 꺼져 있거나 안전 장치가 출력을 내렸을 때
나타납니다.

### 범위를 넘었을 때 (v0.2.53)

전류가 지정한 레인지를 넘어도 출력은 켜진 채로 있고, `:READ?` 는 평소처럼 숫자를
돌려줍니다. 다만 그 전류 값은 **레인지의 끝에서 잘린 값**이므로 실제 전류는 그보다
큽니다(하한). 함께 돌아온 전압은 실제 값입니다. 범위를 넘었는지는 바로 다음에
`:STAT:COND?` 를 보내 확인하십시오. 채널 1 은 비트 6(64), 채널 2 는 비트 7(128)
입니다. 레인지를 올리거나 AUTO 로 바꾸시면 됩니다.

```python
def is_overrange(sess, ch):
    return int(sess.query(":STAT:COND?")) & (1 << (5 + ch)) != 0
```

---

## 4. 가장 짧은 예제

저항 하나를 재는 전체 흐름입니다. 이 순서가 이후 모든 예제의 뼈대입니다.

```python
import serial, time

s = serial.Serial('COM45', 4000000, timeout=10)
time.sleep(0.5)                      # 포트가 자리를 잡을 때까지
s.reset_input_buffer()

def cmd(text):
    s.write((text + '\n').encode())
    s.flush()

def ask(text):
    cmd(text)
    return s.readline().decode().strip()

print(ask('*IDN?'))
# SemiOtter,Otter-IV-Expert,R01-26-101,v0.2.60,FieldZero=None

cmd(':SOUR1:CURR 1E-3')              # ① 컴플라이언스 먼저: 최대 1 mA
cmd(':SENS1:CURR:RANG:AUTO ON')      # ② 전류 레인지 자동
cmd(':SENS1:CURR:NPLC 1')            # ③ 적분 시간 1 NPLC
cmd(':SOUR1:VOLT 0')                 # ④ 0 V 에서 시작
cmd(':OUTP1 ON')                     # ⑤ 출력 켜기

for mv in range(0, 1001, 100):       # 0 V → 1 V
    cmd(f':SOUR1:VOLT {mv/1000:.3f}')
    time.sleep(0.05)                 # 정착 시간
    v, i = [float(x) for x in ask(':READ1?').split(',')]
    print(f'{v:+.4f} V  {i:+.4E} A')

cmd(':OUTP1 OFF')                    # ⑥ 반드시 끄고 마칩니다
s.close()
```

순서가 중요합니다. **레인지와 NPLC 는 출력이 켜져 있으면 바꿀 수 없습니다**(오류
E303). 출력을 켜기 전에 설정을 마치십시오.

---

## 5. 소스 설정 — 전압과 컴플라이언스

### 전압

| 명령 | 설명 |
|---|---|
| `:SOUR<N>:VOLT <volts>` | 출력 전압을 설정합니다. 범위 **±80 V** |
| `:SOUR<N>:VOLT?` | 현재 설정값을 돌려줍니다 |

설정한 값은 즉시 DAC 에 기록되지만, 실제로 시료에 걸리는 것은 출력이 켜져
있을 때뿐입니다. 범위를 넘으면 오류 E201 이 쌓이고 값은 바뀌지 않습니다.

### 컴플라이언스 (전류 제한)

시료를 지키는 가장 중요한 설정입니다. **출력을 켜기 전에 반드시
설정하십시오.**

| 명령 | 설명 |
|---|---|
| `:SOUR<N>:CURR <amps>` | 양·음 양쪽을 같은 크기로 제한합니다 |
| `:SOUR<N>:CURR:NEG <amps>` | 음의 방향만 따로 (크기로 적습니다) |
| `:SOUR<N>:CURR?` / `:SOUR<N>:CURR:NEG?` | 현재 설정값 |

최대 설정값은 **20 mA** 입니다(v0.2.53 부터). v0.2.54 부터는 20 mA 보다 큰 값을
보내시면 20 mA 로 낮춰 적용하고, 오류 큐에 E202 `<값> clamped to 2.000E-02 A` 를
남깁니다. v0.2.53 은 그런 값을 E202 로 거부하고 직전 설정을 그대로 둡니다. 인자는
항상 0 이상의 크기로 적으시고, 음수를 넣으면 오류 E202 가 납니다.

`:SOUR<N>:CURR` 를 다시 보내면 양쪽이 다시 대칭이 됩니다. 즉 비대칭 설정은 항상
`:SOUR<N>:CURR` 를 먼저 보내고 `:SOUR<N>:CURR:NEG` 를 나중에 보내야 유지됩니다.

```
:SOUR1:CURR 1E-3          양쪽 모두 ±1 mA
:SOUR1:CURR:NEG 1E-4      양 +1 mA, 음 -100 µA
```

#### 컴플라이언스 방식: HW 와 SOFT (v0.2.47)

| 명령 | 설명 |
|---|---|
| `:SOUR<N>:CURR:MODE HW\|SOFT` | 컴플라이언스에 걸렸을 때 장비가 취하는 방식. 기본값 `SOFT` (v0.2.47) |
| `:SOUR<N>:CURR:MODE?` | 현재 방식 |
| `:SOUR<N>:VOLT:CEIL?` | SOFT 가 명령 전압 대신 걸어 둔 전압. 없으면 `NONE` |

`HW` 는 이전 버전과 같은 동작으로, 하드웨어 전류 제한 회로가 혼자 전류를 붙잡습니다. 하드웨어 클램프 자체를 보려는 경우에만 고르십시오.
이 회로는 양의 방향에서 전류를 붙잡는 동안 출력이 수백 kHz 로 흔들리는 성질이
있어(1 kΩ 부하 5 mA 에서 약 2 V 폭), 그 상태로 오래 두면 증폭기에 부담이 됩니다.
`SOFT` 로 두면 하드웨어 회로와 같은 원리의 루프가 소프트웨어에 하나 더 동작합니다.
측정 중 전류 제한이 걸린 것을 알아차린 시점(약 40 ms 안)에 전류의 부호와 반대
방향으로 인가 전압을 노드 전압의 2 % 안쪽까지 옮겨 흔들림을 멈추고, 그 자리를
경계로 삼습니다. 인가 전압은 항상 명령 전압과 경계 중 안전한 쪽이므로, 태양전지처럼
스스로 전류를 내는 시료를 스윕하다 제한에 걸려도 명령이 경계를 지나면 그대로
인가됩니다. 전류가 제한값의 85 % 아래로 내려가면 명령 전압 쪽으로 절반씩
되돌아갑니다. 전류 제한 자체는 그대로
하드웨어가 지키므로 시료가 더 큰 전류를 받는 일은 없습니다. 컴플라이언스에 걸린 점의
읽기값은 제한값의 약 90~98 % 가 됩니다(노드 전압 0.5 V 이상에서 98 %, 0.1 V 근처에서 90 %). 이 설정은
전원을 껐다 켜면 `SOFT` 로 돌아갑니다.

### 출력

| 명령 | 설명 |
|---|---|
| `:OUTP<N> ON` / `OFF` | 출력 릴레이와 증폭단을 켜고 끕니다 |
| `:OUTP<N>?` | `1` 또는 `0` |
| `:OUTP:SMOD GND\|OPEN` | 출력이 꺼져 있는 동안 시료 쪽 단자를 어떻게 둘지 정합니다. 기본값 `OPEN` (v0.2.48) |
| `:OUTP:SMOD?` | `GND` 또는 `OPEN` |

`1` 대신 `ON`, `0` 대신 `OFF` 를 써도 됩니다.

#### 출력이 꺼져 있을 때: GND 와 OPEN (v0.2.48)

- **`OPEN`** (기본값): 출력을 끄면 출력 릴레이가 열리고 시료 쪽 단자가 떠
  있습니다. v0.2.47 까지의 동작과 같습니다.
- **`GND`**: 출력을 끄면 0 V 로 내려 100 ms 동안 방전한 뒤, 릴레이를 닫은 채
  0 V 를 유지합니다. 이때 전류 제한은 100 µA 입니다. 장비를 켤 때도 자가
  진단이 끝나면 곧바로 이 상태가 됩니다. 프로브가 떠 있지 않으므로 전하가
  쌓이지 않습니다. 이 상태에서는 출력 릴레이 LED 가 켜져 있습니다.

`OPEN` 에서도 릴레이가 열리는 순간에는 단자가 거의 0 V 까지 방전됩니다. 그러나
떠 있는 단자는 케이블과 지그 절연체의 유전 흡수 때문에 몇 초 안에 직전 전압의
수 % 까지 다시 올라옵니다(40 V 를 낸 뒤 10 초에 +1.5 V). `GND` 에서는 0 V 에
머뭅니다.

**다른 장비와 함께 쓰실 때는 `OPEN` 으로 두십시오.** `GND` 인 Otter 는 꺼져
있어도 그 단자에 걸린 전류를 최대 100 µA 까지 받아들이므로, 다른 SMU 의 측정값이
틀어집니다.

설정은 장비 전체에 하나이며(채널 번호를 붙여도 무시합니다) 장비 안에 저장되어
전원을 꺼도 남습니다. 보내는 즉시 꺼져 있는 채널에 적용되고, 켜져 있는 채널은
다음에 끌 때 적용됩니다. `*RST` 로는 바뀌지 않습니다. 고장으로 출력이 꺼질 때
(402, 403)는 어느 쪽이든 릴레이가 열리고, 다음에 `:OUTP OFF` 나 `:OUTP ON` 을
보내실 때까지 열려 있습니다.

### 다른 장비가 전압을 걸 때: 측정 전용 모드

| 명령 | 설명 |
|---|---|
| `:SYST<N>:MEAS:ONLY <ON\|OFF>` | 측정 전용 모드로 들어가고 나옵니다 |
| `:SYST<N>:MEAS:ONLY?` | `1` 또는 `0` |

**다른 장비가 시료를 구동하고 이 장비는 전류만 재야 하는 경우에 쓰십시오.**
이 모드에 들어가면 장비는 출력을 0 V 로 내린 채 증폭단과 릴레이를 살려 두므로,
외부에서 흘러 들어온 전류가 측정 경로에 그대로 도달합니다.

**컴플라이언스는 이 모드에 있는 동안 최댓값으로 올라갑니다.** 외부 전원이
보내는 전류를 이 장비가 제한해 버리면 두 장비가 서로 겨루게 되기 때문입니다.
설정해 두셨던 값은 저장되었다가 모드를 빠져나올 때 돌아오며, 모드 안에서
`:SOUR<N>:CURR?` 로 질의하시면 올라간 값이 아니라 저장된 값이 보입니다.

**출력이 켜져 있으면 이 명령을 거부하고 E303 을 남깁니다.** `:OUTP<N> OFF` 를
먼저 보내 주십시오. `:OUTP<N> ON` 을 보내시면 측정 전용 모드는 자동으로
해제됩니다.

---

## 6. 측정 설정 — 레인지와 NPLC

이 절의 설정은 모두 **출력이 꺼져 있을 때만** 바꿀 수 있습니다. 켜진 상태에서
시도하면 오류 E303 이 쌓이고 값은 바뀌지 않습니다. 측정 중에 레인지가 바뀌면
그 지점의 데이터를 신뢰할 수 없기 때문입니다.

### 전류 레인지

| 명령 | 설명 |
|---|---|
| `:SENS<N>:CURR:RANG:AUTO ON` / `OFF` | 자동 레인지 |
| `:SENS<N>:CURR:RANG <amps>` | 레인지 고정 |
| `:SENS<N>:CURR:RANG?` | `AUTO` 또는 고정된 값 |

고정할 수 있는 값은 네 가지입니다.

| 인자 | 레인지 |
|---|---|
| `1E-2` | 20 mA |
| `1E-3` | 1 mA |
| `1E-5` | 20 µA |
| `1E-6` | 1 µA |

앱은 v1.9.2 부터 레인지를 읽을 수 있는 상한으로 부릅니다. `1E-2` 와 `1E-5` 는 앱
v1.9.1 까지 10 mA·10 µA 라고 부르던 바로 그 레인지입니다.

> **주의 — 인자는 정확한 값이 아니라 자릿수로 해석됩니다.** 장비는 넣으신 값의
> 상용로그를 반올림하여 위 네 자리 중 하나를 고릅니다. 따라서 목록에 없는 값을
> 넣으셔도 **오류가 나지 않고 가장 가까운 자릿수로 조용히 바뀝니다.**
>
> PROTO-01 에서 실제로 측정한 결과입니다.
>
> | 보낸 값 | 결과 |
> |---|---|
> | `5E-4` (500 µA) | 오류 없이 **1 mA** 로 설정됨 |
> | `2E-3` (2 mA) | 오류 없이 **1 mA** 로 설정됨 |
> | `3E-6` (3 µA) | 오류 없이 **1 µA** 로 설정됨 |
> | `1E-4` (100 µA) | E204. 이 자릿수는 하드웨어에 없습니다 |
> | `1E-1`, `1E-8` | E204 |
>
> 500 µA 를 요청하셨는데 1 mA 레인지에서 측정되는 상황은 데이터를 보고 알아채기
> 어렵습니다. **반드시 위 표의 네 값만 그대로 쓰시고**, 확실히 하시려면 설정 후
> `:SENS<N>:CURR:RANG?` 로 되읽어 확인하십시오. 거부된 경우에는 직전 레인지가
> 그대로 유지되므로, 되읽기는 두 경우를 모두 잡아 줍니다.

자동 레인지는 필요에 따라 증폭 단수를 스스로 바꿉니다. 넓은 범위를 훑는 측정에는
자동이 편하고, 미세 전류를 일정한 조건에서 반복 측정하실 때에는 고정이 낫습니다.

### 적분 시간 (NPLC)

| 명령 | 설명 |
|---|---|
| `:SENS<N>:CURR:NPLC <n>` | 한 점을 재는 데 쓰는 전원 주기 수 |
| `:SENS<N>:CURR:NPLC?` | 현재 값 |

범위는 **0.01 ~ 100**, 기본값은 **1** 입니다. NPLC 1 은 전원 한 주기이므로
60 Hz 환경에서 약 16.7 ms 입니다. 값을 키우면 잡음이 줄고 느려집니다. 대략적인
소요 시간은 다음과 같습니다.

| NPLC | 한 점당 대략 |
|---|---|
| 0.1 | 약 29 ms |
| 1 | 약 103 ms |
| 10 | 약 1 초 |

전원 주파수가 맞아야 잡음 제거가 제대로 됩니다. `:SYST:LFR?` 로 확인하시고,
다르면 `:SYST:LFR 60` 처럼 맞춰 주십시오(50 또는 60 만 받습니다. 이 역시 출력이
꺼져 있어야 합니다).

### ADC 오프셋 재측정 (오토제로)

| 명령 | 설명 |
|---|---|
| `:SYST:AZER:STAT ON` / `OFF` | 판독마다 ADC 오프셋을 다시 재어 뺍니다 (장비 기본 ON) |
| `:SYST:AZER:NPLC <n>` 또는 `AUTO` | 오프셋 재측정에 쓸 적분 시간 |

켜면 판독마다 장비가 측정 입력을 잠시 기준 접지로 바꿔 ADC 오프셋을 재고, 공장
교정 때 잰 값에서 달라진 만큼을 뺍니다. **영점을 다시 잡는 것이 아닙니다.**
영점을 다시 잡는 명령은 `:CAL<N>:REZERO` 입니다. 영점이 없으면(`FieldZero=None`) 아무것도
빼지 않습니다. 앱에서는 **포인트마다 오프셋 재측정**(Offset check every point)이라는
이름이며, 앱의 기본값은 꺼짐입니다. 개편된 하드웨어에서는 이 보정이 잡을 흐름이
거의 없고, 켜면 판독마다 약 20 ms 가 더 걸리기 때문입니다.

---

## 7. 측정

| 명령 | 응답 | 설명 |
|---|---|---|
| `:READ<N>?` | `<V>,<I>` | 전압과 전류를 한 번에. **가장 많이 쓰시게 됩니다** |
| `:MEAS<N>:CURR?` | `<I>` | 전류만 |
| `:MEAS<N>:VOLT?` | `<V>` | 전압만 |
| `:MEAS<N>:VSEN? [시작,하한,상한]` | `<V>,<I>,<R>,<횟수>,<ms>,<상태>` | 전류가 0 A 인 전압 (v0.2.50, 아래 참조) |

```
:READ1?
+1.000123E+00,+2.345678E-06
```

돌아오는 전압은 설정값이 아니라 **실제로 출력에서 측정한 값** 입니다. 시료의
저항이 낮아 컴플라이언스에 걸리면 설정값보다 낮게 나오며, 이 차이로 컴플라이언스
도달 여부를 판단하실 수 있습니다.

`:READ?` 와 `:MEAS:CURR?` 는 출력이 꺼져 있으면 값이 없다는 표식(`9.91E+37`)을
돌려주고 오류 E301 을 쌓습니다. `:MEAS:VOLT?` 만은 출력 상태와 무관하게
동작합니다.

### 전류를 흘리지 않고 전압만 재기 — `:MEAS<N>:VSEN?` (v0.2.50)

인버터의 출력처럼 출력 저항이 큰 노드는 전압계가 전류를 조금만 끌어가도 값이
달라집니다. 이 명령은 채널이 스스로 출력 전압을 옮겨 가며 **전류가 0 A 가 되는
전압**을 찾고, 그 전압을 돌려줍니다. 전류가 흐르지 않으므로 노드의 출력 저항에서
전압이 떨어지지 않고, 돌려받는 값이 곧 노드의 개방 전압입니다.

```
:SOUR2:CURR 1E-5
:SENS2:CURR:RANG 1E-5
:OUTP2 ON
:MEAS2:VSEN? 5,0,5
+2.496562E+00,-1.200000E-09,+1.005000E+05,4,67,OK
```

- 인수는 시작 전압, 하한, 상한입니다. 채널은 하한과 상한 밖으로 나가지 않으므로,
  인버터라면 전원 범위(GND, VDD)를 주십시오. 생략하면 지금 설정 전압에서 ±80 V
  범위로 찾습니다.
- 찾는 동안 흐를 수 있는 전류는 그 채널의 컴플라이언스가 막습니다. 10 µA 와
  20 µA 레인지(`1E-5`) 고정이 검증된 조합입니다. 레인지는 고정해 주십시오.
- 응답은 전압, 남은 전류, 노드의 출력 저항(추정), 반복 횟수, 걸린 시간(ms), 상태
  입니다. 상태가 `OPEN` 이면 아무것도 연결되지 않은 것이고(수백 MΩ 이상),
  `NONULL` 이면 범위 안에 0 A 인 전압이 없는 것입니다. 이 둘이면 전압은
  `9.91E+37` 입니다.
- 출력 저항이 1 Ω 미만인 전원(전원 공급기, 배터리)부터 10 MΩ 노드까지 잴 수
  있습니다.
- 한 번에 NPLC 1 에서 약 0.06–0.3 초 걸립니다. 끝나면 출력은 찾은 전압에 머물러
  있으므로, 다음 측정을 그 값에서 시작하면 더 빨리 끝납니다.
- 측정 중에 E701(전력이 들어옴) 이 쌓이는 것은 정상입니다. 노드가 채널을 구동하는
  상황이기 때문입니다.

### 측정 전 정착 시간: 장비는 1 ms 만 기다립니다

v0.2.52 부터 장비는 출력 전압이 바뀌거나 릴레이가 움직인 뒤 다음 측정을
시작하기 전에 1 ms 를 기다립니다. 장비 안쪽 전류 증폭기가 안정되는 데 필요한
시간이며, 이 대기가 없으면 빠른 스윕에서 앞 점의 전류가 다음 점에 섞입니다.
같은 전압을 다시 보내는 경우처럼 실제로 바뀐 것이 없으면 기다리지 않습니다.

| 명령 | 설명 |
|---|---|
| `:SYST:SETT <초>` | 대기 시간. 0 ~ 0.1, 기본 0.001. `*RST` 로 기본값으로 돌아갑니다 |
| `:SYST:SETT?` | 설정된 대기 시간 |

이 1 ms 는 장비 자신의 안정 시간일 뿐, 시료가 안정되는 시간은 아닙니다. 용량성이
크거나 이완이 느린 소자라면 전압을 바꾼 뒤 프로그램에서 더 기다리십시오.
일반적인 시료에서는 수 ms 에서 수십 ms 면 충분합니다. 앱은 이 값을 사용자가
지정하도록 두고, 지정한 값을 저장 파일에 함께 적습니다. v0.2.51 이하 장비에서는
앱이 같은 1 ms 를 대신 기다립니다.

---

## 8. 상태 확인과 오류

### 신원과 상태

| 명령 | 응답 예 | 설명 |
|---|---|---|
| `*IDN?` | `SemiOtter,Otter-IV-Expert,R01-26-101,v0.2.60,FieldZero=None` | 제조사, 모델, 일련번호, 펌웨어, 현장 영점 상태 |
| `:SYST:VERS?` | `1.0` | SCPI 버전 |
| `:SYST:TEMP?` | `+43.25` | MCU 다이 온도 (°C) |
| `:SYST:LFR?` | `60` | 전원 주파수 설정 |
| `:CAL:STAT?` | `DONE,170727014` 또는 `NEVER` | 오프셋 영점 상태 |
| `:SYST:CAL:DATE?` | `2026-08-30` 또는 `NEVER` | 공장 교정 날짜 |
| `:SYST:TIME?` | `2026-10-18T22:14:05` 또는 `UNSET` | 호스트에게서 받은 현재 시각(v0.2.60) |

`*IDN?` 의 다섯 번째 필드 `FieldZero=` 는 **현장 영점** 상태입니다(v0.2.59 까지는
`CAL=`). `FieldZero=None` 은 전원을 켠 뒤 아직 영점을 잡지 않았다는 뜻으로, 이
상태에서도 측정은 되지만 미세 전류에 일정한 치우침이 남습니다. 영점을 잡으면 그
시각이 들어갑니다(`FieldZero=2026-10-18T22:14:05`). 장비에는 시계가 없으므로 이
시각은 호스트가 `:SYST:TIME 2026-10-18T22:10:00` 처럼 알려 준 시각을 기준으로
셉니다(앱과 명령창은 연결할 때 보냅니다). 알려 준 적이 없으면 `FieldZero=Done`
입니다. 이 영점은 RAM 에만 있어 전원을 껐다 켜면 사라지며, 공장 교정 계수와
일련번호는 EEPROM 에 있어 그대로 유지됩니다.

`:SYST:TEMP?` 는 MCU 자체 온도라 절대값은 실온과 다릅니다. 쓸모 있는 것은
**변화** 입니다. MCU 부하는 일정하므로 이 값이 움직이면 주변 환경이 움직인
것입니다.

### 컴플라이언스 상태 (v0.2.47)

| 명령 | 응답 | 설명 |
|---|---|---|
| `:STAT:COMP<N>?` | `0` / `1` / `2` | 마지막 측정(또는 유휴 감시)에서 본 상태. `1` 하드웨어 전류 제한이 걸림, `2` SOFT 가 전압을 낮추어 잡고 있음 |
| `:STAT:COMP<N>:LAT?` | ms 또는 `-1` | 마지막 측정 안에서 전류 제한을 처음 본 시점 |
| `:STAT:COND?` | 비트 합 | 비트 0/1 채널 1/2 전류 제한, 비트 2/3 외부에서 전류가 밀려 들어옴, 비트 4/5 증폭기 플래그, 비트 6/7 마지막 측정이 레인지 초과 (v0.2.53) |

출력이 켜져 있는 채널은 명령이 없어도 약 0.1 s 마다 장비가 스스로 살펴보므로,
다른 장비의 스윕 동안 전압원으로 세워 둔 채널도 이 값이 살아 있습니다.

### 오류 큐

오류는 그 자리에서 응답으로 오지 않고 장비 안에 쌓입니다. 설정 명령을 보낸 뒤
조용하다고 해서 성공한 것이 아니므로, 중요한 설정 뒤에는 확인하시기 바랍니다.

| 명령 | 설명 |
|---|---|
| `:SYST:ERR?` | 가장 오래된 오류를 하나 꺼냅니다 |
| `*CLS` | 오류 큐를 비웁니다 |

응답은 언제나 `E` 와 세 자리 숫자로 시작합니다. 오류가 없으면 `E000,No error`
이고, 있으면 코드와 설명이, 덧붙일 내용이 있으면 콜론 뒤에 상세가 붙습니다.

```
E000,No error
E301,Output is OFF: :READ
E505,Pulse watchdog triggered: serial disconnected: outputs taken down (OPA left on)
```

```python
def drain_errors(ask):
    out = []
    while True:
        e = ask(':SYST:ERR?')
        if e.startswith('E000'):
            return out
        out.append(e)
```

### 오류 코드

| 코드 | 뜻 | 흔한 원인 |
|---|---|---|
| 101 | 알 수 없는 명령 | 철자 오류 |
| 102 | 문법 오류 | 인자 형식이 맞지 않음 |
| 103 | 잘못된 채널 | 1 또는 2 만 가능 |
| 104 | 인자 누락 | 값을 적지 않음 |
| 105 | 질의 불가 | `?` 를 붙일 수 없는 명령 |
| 201 | 전압 범위 초과 | ±80 V 를 넘김 |
| 202 | 전류 범위 초과 | 컴플라이언스 최대 20 mA. v0.2.54 부터는 20 mA 로 낮춰 적용하고 알리며, v0.2.53 은 거부합니다 (v0.2.52 이하는 약 25 mA) |
| 203 | NPLC 범위 초과 | 0.01 ~ 100 |
| 204 | 레인지 값 오류 | 표에 없는 값 |
| **301** | **출력이 꺼져 있음** | 켜기 전에 읽으려 함 |
| 302 | 교정 필요 | |
| **303** | **출력이 켜져 있어 잠김** | 레인지·NPLC·LFR 을 켠 채로 바꾸려 함 |
| 304 | 펄스 엔진 동작 중 | v0.2.56 부터는 나오지 않습니다(펄스 엔진 제거) |
| 401 | DAC 통신 실패 | 하드웨어 이상 |
| **402** | **ADC 포화로 자동 차단** | 아래 설명 참조 |
| **403** | **증폭기가 출력을 스스로 차단(과열 또는 고장): 릴레이가 열림** | 증폭기의 열 차단(150 °C)은 상황과 관계없이 여기로 옵니다. 증폭기는 켜진 채로 남고, 2 s 뒤에도 플래그가 남으면 그때 증폭기를 끕니다 |
| **702** | **증폭기 과열** | 릴레이가 열린 뒤 2 s 안에 플래그가 내려갔으면 열 차단이 풀린 것입니다. 출력은 꺼진 채로 있으며, 과열 원인을 확인한 뒤 `:OUTP ON` 으로 다시 켭니다 (v0.2.47) |
| 505 | USB 연결이 끊겨 출력을 끔 | 호스트가 포트를 닫거나 케이블이 빠지면 두 채널의 출력을 끄고 남깁니다. 다음 연결 때 보입니다 |
| 701 | 정보: 이 채널로 전력이 흘러 들어옴 | 다른 장비(또는 반대 채널, 또는 태양전지처럼 스스로 기전력이 있는 시료)가 이 노드에 전압을 걸고 있음. 아무것도 멈추지 않으며 출력 세션당 한 번만 기록됩니다 (v0.2.47) |

### 자동 차단 (402 / 403)

다음 두 경우에 장비는 **스스로 출력을 끕니다.** 이때부터 `:READ?` 는 `9.91E+37` 을
돌려줍니다.

- **402:** 1 µA 나 20 µA 레인지에서 고감도 전류 증폭기가 포화되었고, 컴플라이언스가
  100 µA 보다 크게 설정된 경우입니다(v0.2.57 이상). 이 레인지에서 컴플라이언스는 약
  125 µA 까지만 지켜지고, 130 µA 부터는 전류가 제한되지 않습니다(측정: 10 kΩ 에 20 V,
  150 µA 제한에서 1.9 mA 가 흐름). 컴플라이언스가 100 µA 이하이면 포화되어도 출력을
  유지하고, 다른 레인지 초과처럼 `:STAT:COND?` 로 알립니다. v0.2.54 부터는 측정 명령을
  보내지 않는 동안에도 장비가 0.1 초마다 확인하므로, 약 0.5 초 안에 꺼집니다.
  앱(v1.9.2 이상)과 `cli` 는 이 두 레인지를 고정하면 컴플라이언스를 100 µA 로 낮춰
  보내므로 이 경우가 생기지 않습니다. 명령을 직접 보내실 때에는 `1E-6`·`1E-5`
  레인지에서 컴플라이언스를 100 µA 이하로 두십시오. v0.2.56 이하는 컴플라이언스와
  관계없이 전류가 약 20 µA 를 넘으면 출력을 껐습니다.
- **403:** 출력 증폭기가 고장을 알린 경우입니다.

이것을 통신 오류로 오해하지 마십시오. 값이 없다는 표식을 받으면 측정을 멈추고
`:SYST:ERR?` 를 확인한 뒤 사용자에게 알리는 것이 옳은 처리입니다. 402 라면 더 큰
레인지나 AUTO 를 쓰시거나 컴플라이언스를 낮추십시오.

### 장비가 정말 정상인지 확인하기

| 명령 | 설명 |
|---|---|
| `:SYST:DAC:STAT?` | DAC 설정이 실제로 반영되었는지 |
| `:SYST:OPA<N>:STAT?` | 증폭기 폴트 여부 (`1` 이면 폴트) |
| `:SYST:OPA<N>:ENAB?` | 증폭기가 켜져 있는지 |

```
:SYST:DAC:STAT?
OK,1,SELFTEST=+4.966/+4.941,03=0A04/0A04,...
```

맨 앞이 `OK` 여야 합니다. `FAIL` 이면 DAC 이 설정을 받아들이지 않은 상태이며,
이때 장비는 **다른 모든 질의에는 정상으로 답하면서 전압만 내보내지 못합니다.**
프로그램을 시작할 때 한 번 확인해 두시면 원인을 찾느라 시간을 잃지 않습니다.

---

## 9. 펄스 엔진

펌웨어 v0.2.55 까지는 짧은 펄스를 정해진 간격으로 연속 인가하고 그 사이를
측정하는 시퀀서(`:PULS:*`, `:TRAC:*`)가 들어 있었습니다. 하드웨어 검증을 마치지
못했고 앱도 쓰지 않았으므로, **v0.2.56 에서 제거했습니다.** 이제 이 명령들은
다른 알 수 없는 명령과 마찬가지로 E101 을 남깁니다.

펄스가 필요한 측정에는 앱의 LTP/LTD, 내구성, 펄스 시퀀스, EPSC / PPF 탭을
쓰십시오. 이 탭들은 PC 가 시각을 재어 펄스를 만들고, 실제로 인가된 펄스 폭과
간격을 결과 파일에 함께 기록합니다.

---

## 10. 안전 수칙

직접 프로그램을 작성하실 때 지켜 주셔야 할 것들입니다. 앱은 이 일들을 대신 해
주지만, 직접 만드신 프로그램에서는 직접 하셔야 합니다.

**컴플라이언스를 먼저 설정하십시오.** `:OUTP ON` 을 보내기 전에
`:SOUR<N>:CURR` 를 설정하십시오. 이 순서가 뒤바뀌면 시료에 제한 없는 전류가
흐를 수 있습니다.

**출력을 반드시 끄고 마치십시오.** 프로그램이 예외로 중단되어도 출력이 꺼지도록
작성하십시오. 포트를 닫는 것만으로는 출력이 꺼지지 않습니다.

```python
try:
    cmd(':OUTP1 ON')
    ...
finally:
    cmd(':OUTP1 OFF')
    s.close()
```

**±80 V 를 다루는 장비입니다.** 출력이 켜진 동안에는 단자와 시료에 손대지
마십시오.

**값이 없다는 표식을 무시하지 마십시오.** `9.91E+37` 은 안전 장치가 이미
작동했다는 신호인 경우가 많습니다. 그대로 저장하면 나중에 데이터로 오인됩니다.

**측정 전에 예열하십시오.** 전원을 켠 직후에는 미세 전류에 치우침이 남아
있습니다. 정밀한 측정을 하실 때에는 30 분 정도 켜 두신 뒤 앱에서 Zero 를 한 번
실행하시고, 그 다음에 직접 작성하신 프로그램으로 넘어가시는 방법이 편합니다.
영점은 전원을 껐다 켜면 사라집니다.

---

## 11. 전체 명령 목록

`<N>` 은 채널 번호(1 또는 2)이며 생략하면 1 입니다.

이 절은 자주 쓰이는 명령을 추린 것입니다. 홈페이지 공개판의 명령어 목록에도
같은 범위의 명령이 실려 있습니다.

### 신원 · 시스템

| 명령 | 질의 | 설명 |
|---|---|---|
| `*IDN?` | ○ | 제조사, 모델, 일련번호, 펌웨어, 영점 상태 |
| `*RST` | | 기본값으로 되돌립니다 (출력 OFF, 컴플라이언스 1 mA, NPLC 1) |
| `*CLS` | | 오류 큐를 비웁니다 |
| `*OPC?` | ○ | 기다리지 않고 곧바로 `1` 을 돌려줍니다. **동기화에 쓸 수 없습니다** |
| `:SYST:ERR?` | ○ | 오류를 하나 꺼냅니다 |
| `:SYST:VERS?` | ○ | SCPI 버전 |
| `:SYST:TEMP?` | ○ | MCU 온도 (°C) |
| `:SYST:LFR <50\|60>` | ○ | 전원 주파수. 출력이 꺼져 있어야 합니다 |
| `:SYST:TIME <YYYY-MM-DDTHH:MM:SS>` | ○ | PC 시각을 알려 줍니다. 현장 영점의 시각 표시에 쓰입니다(v0.2.60) |
| `:SYST:VERB <ON\|OFF>` | ○ | 자세한 출력 모드 |
| `:SYST:SAMP:CYCL?` | ○ | 표본 주기 정보 |

### 소스

| 명령 | 질의 | 설명 |
|---|---|---|
| `:SOUR<N>:VOLT <V>` | ○ | 출력 전압. ±80 V |
| `:SOUR<N>:CURR <A>` | ○ | 대칭 컴플라이언스. 최대 20 mA |
| `:SOUR<N>:CURR:NEG <A>` | ○ | 음의 방향 컴플라이언스 |
| `:SOUR<N>:FUNC VOLT` | ○ | 전압원 고정 (다른 값은 받지 않습니다) |
| `:OUTP<N> <ON\|OFF>` | ○ | 출력 |
| `:OUTP:SMOD <GND\|OPEN>` | ○ | 꺼져 있는 출력의 상태. 장비 전체, 저장됨 (§5) |
| `:SYST<N>:MEAS:ONLY <ON\|OFF>` | ○ | 측정 전용 모드 (§5) |

### 측정 설정

| 명령 | 질의 | 설명 |
|---|---|---|
| `:SENS<N>:CURR:RANG <A>` | ○ | 레인지 고정. 출력 OFF 필요 |
| `:SENS<N>:CURR:RANG:AUTO <ON\|OFF>` | ○ | 자동 레인지. 출력 OFF 필요 |
| `:SENS<N>:CURR:NPLC <n>` | ○ | 적분 시간 0.01~100. 출력 OFF 필요 |
| `:SYST:AZER:STAT <ON\|OFF>` | ○ | 판독마다 ADC 오프셋 재측정 (영점과 다름) |
| `:SYST:AZER:NPLC <n\|AUTO>` | ○ | 오프셋 재측정 적분 시간 |
| `:SYST:SETT <s>` | ○ | 출력이 바뀐 뒤 측정 전 대기 시간 (기본 0.001 s, v0.2.52) |

### 측정

| 명령 | 질의 | 설명 |
|---|---|---|
| `:READ<N>?` | ○ | `<V>,<I>` |
| `:MEAS<N>:CURR?` | ○ | 전류 |
| `:MEAS<N>:VOLT?` | ○ | 전압. 출력 상태와 무관 |
| `:MEAS<N>:VSEN? [시작,하한,상한]` | ○ | 전류가 0 A 인 전압 (§7) |

### 상태 진단

| 명령 | 질의 | 설명 |
|---|---|---|
| `:SYST:DAC:STAT?` | ○ | DAC 설정 반영 여부 |
| `:SYST:OPA<N>:STAT?` | ○ | 증폭기 폴트 (`1` 이면 폴트) |
| `:SYST:OPA<N>:ENAB?` | ○ | 증폭기 켜짐 여부 |
| `:CAL:STAT?` | ○ | 영점 상태 |
| `:CAL<N>:DRIFT?` | ○ | 영점 이후의 흐름 |
| `:SYST:CAL:DATE?` | ○ | 공장 교정 날짜 |
| `:SYST:TIME?` | ○ | 호스트가 알려 준 현재 시각 |

### 펄스 엔진

`:PULS:*` 와 `:TRAC:*` 는 v0.2.56 에서 제거했습니다. §9 를 보아 주십시오.

### 영점

| 명령 | 질의 | 설명 |
|---|---|---|
| `:CAL<N>:REZERO` | | 영점을 다시 잡습니다. RAM 만 바뀌므로 안전합니다 |

---

## 문의

측정 결과가 이상하시면 다음 세 가지를 함께 보내 주시면 원인을 훨씬 빨리 찾을 수
있습니다.

- `*IDN?` 응답 전문
- `:SYST:DAC:STAT?` 응답 전문
- `:SYST:ERR?` 를 `E000,No error` 가 나올 때까지 반복해서 얻은 목록

support@semiotteredu.com
