# 측류 추출식 C-6111 — 통합 유량 설정 공식

## 1. 기본 물질수지

```
F = D + P + B + V_loss
```

| 기호 | 의미 | 단위 |
|:----:|:----:|:----:|
| **F** | 원료투입량 (Feed) | kg/hr |
| **P** | 제품 추출량 (Product, side-draw) | kg/hr |
| **D** | 경비물 제거량 (Overhead Distillate) | kg/hr |
| **B** | 하부/중비물 제거량 (Bottom) | kg/hr |
| **V_loss** | **기상 손실 (Vent / Vacuum pump → Scrubber)** | kg/hr |

> 일반 증류탑은 `F = D + B`이나, 측류 추출식(side-draw column)은 **제품(P)** 이 중간에서 추출되므로 4항 물질수지가 성립한다.
>
> 진공 증류 컬럼에서는 **vacuum pump / ejector**가 비응축성 가스(non-condensable)와 함께 **PGMEA 기상 일부를 Scrubber(SC-6128)로 강제 배출**한다. 이 손실분을 무시하면 P 수율이 실제보다 과장된다.

---

## 2. 분할 비율 (설계 기준)

| 항목 | 계수 | 비율 | 근거 |
|:----:|:----:|:----:|:------|
| P | k_P | **0.94** | 주 제품 fraction (PGMEA 99%+ 순도) |
| D | k_D | **0.02** | 경비물 (light ends) |
| B | k_B | **0.03** | 중비물 (heavy ends) |
| V_loss | k_V | **~0.01** | Vent/Scrubber 기상 손실 (추정) |

k_D + k_P + k_B + k_V = **1.00** (총합)

> **k_V = ~0.01 (1%)** 은 진공 증류 컬럼의 일반적인 vent loss 추정치다.
> PI-6111 = **~48.5 torr** 진공압에서 PGMEA의 부분압에 따라 실제 손실률은 0.5~2% 범위에서 달라질 수 있다.
> Vent loss flow meter는 별도로 존재하지 않으므로, **정확한 k_V는 scrubber 배출가스 분석 or 물질수지 역산**으로 결정해야 한다.

---

## 3. P(제품 추출량) 기준 전 항목 환산식

측류 추출식에서는 **제품 추출량(P)** 이 가장 직접적인 조작 변수이므로 P를 기준으로 모든 설정값을 산출한다.

### 3.1 원료투입량 (F)

```
F = P ÷ k_P
```

| P (제품 추출량) | F (원료투입량) |
|:---------------:|:--------------:|
| 777.2 | 777.2 ÷ 0.94 = **826.8** |

### 3.2 경비물 제거량 (D)

```
D = (k_D / k_P) × P
```

| P | D |
|:-:|:-:|
| 777.2 | (0.02 / 0.94) × 777.2 = **16.54** |

### 3.3 하부 제거량 (B)

```
B = (k_B / k_P) × P
```

| P | B |
|:-:|:-:|
| 777.2 | (0.03 / 0.94) × 777.2 = **24.81** |

### 3.4 Vent 손실 (V_loss)

```
V_loss = (k_V / k_P) × P
```

| P | V_loss |
|:-:|:------:|
| 777.2 | (0.01 / 0.94) × 777.2 = **8.27** |

> V_loss는 액체 상태로 계측되지 않으므로 **직접 계측 불가**. 위 값은 k_V=1%를 가정한 추정치다.
> Scrubber(SC-6128) LI-6128 level이 0으로 계측되고 있어 scrubber 운전 상태 확인이 필요하다.

### 3.5 검산

```
F = D + P + B + V_loss = 16.54 + 777.2 + 24.81 + 8.27 = 826.8 ✓
k_D + k_P + k_B + k_V = 0.02 + 0.94 + 0.03 + 0.01 = 1.00 ✓
```

> V_loss를 포함하면 동일 P 대비 **필요 F가 818.1 → 826.8로 증가** (실제 수율은 94%, 계측기준 95%).

---

## 4. 환류량 (온도보정 포함)

### 4.1 일반 증류탑과의 차이

| 컬럼 타입 | 일반 증류탑 | 측류 추출식 (C-6111) |
|:---------:|:----------:|:-------------------:|
| 주 제품 | D (정상품) | **P (측류)** |
| 환류 기준 | D | **P** |
| 환류 공식 | R = r × D | **R = R_f × P** |
| D의 성격 | 주 제품 (100%) | 소량 경비물 (2%) |

> D가 2%에 불과하므로 `R = r × D`를 적용하면 r = 350/16.36 = **21.4**라는 비현실적 환류비가 나온다. 측류 추출식은 **반드시 P 기준**으로 계산해야 한다.

### 4.2 외부 환류 (FICQ 계측값)

```
R_ext = R_f × P
```

| 변수 | 의미 | 일반 범위 |
|:----:|:----:|:---------:|
| R_ext | 외부 환류량 (질량유량계, FICQ-6113) | kg/hr |
| R_f | 제품기준 환류비 (Reflux-to-Product ratio) | **0.5 ~ 1.2** |
| P | 제품 추출량 | kg/hr |

**R_f 기준값:**

| R_f | 의미 | 적용 |
|:---:|:----|:----:|
| < 0.5 | 저환류 — 에너지 절감 우선 | 순도 타협 가능할 때 |
| **0.5 ~ 1.2** | **설계 권장 범위** | **정상 운전** |
| > 1.2 | 고환류 — 순도 극대화 | 에너지 비용 증가 감수 |

### 4.3 온도보정 (과냉각 Subcooling)

응축기에서 액화된 환류액은 보통 포화온도 이하로 과냉각되어 컬럼으로 돌아온다. 이 과냉각된 액체는 컬럼 내부에서 일부 증기를 응축시키므로 **내부 환류량이 외부 계측치보다 증가**한다.

```
R_int = R_ext × (1 + c_p × ΔT / λ)
```

| 변수 | 의미 | 단위 |
|:----:|:----|:----:|
| R_int | 내부 환류량 (실제 트레이 단 L/V에 기여) | kg/hr |
| R_ext | 외부 환류량 (FICQ 계측값) | kg/hr |
| c_p | PGMEA 비열 (액체) | kJ/kg·K |
| λ | PGMEA 증발잠열 | kJ/kg |
| ΔT | T_top − T_reflux_drum (과냉각도) | °C |

**온도보정계수 (TCF):**

```
TCF = 1 + c_p × ΔT / λ
```

**PGMEA 물성치 (일반값, 실제 조성/압력에 따라 조정 필요):**

| 물성 | 기호 | 일반값 | 단위 |
|:----:|:----:|:-----:|:----:|
| 비열 (액체) | c_p | **2.0** | kJ/kg·K |
| 증발잠열 | λ | **330** | kJ/kg |
| c_p / λ | | **0.00606** | K⁻¹ |

**ΔT별 TCF:**

| ΔT (°C) | TCF | 설명 |
|:-------:|:---:|:------|
| 0 | 1.000 | 포화액 환류 (과냉각 없음) |
| 5 | 1.030 | 일반 수냉 응축기 |
| 10 | 1.061 | 과냉각 충분한 경우 |
| 15 | 1.091 | 냉동 응축기 수준 |
| 20 | 1.121 | 과냉각 큰 경우 |

### 4.4 컬럼 내부 실제 L/V 비

컬럼 내부의 실제 기액비는 분리 효율의 핵심 지표다.

```
L/V = R_int / (R_int + P)
```

| R_f | R_int (ΔT=5°C) | L/V |
|:---:|:--------------:|:---:|
| 0.45 (현재) | 350 × 1.030 = **361** | 361/(361+777.2) = **0.317** |
| 0.8 | 622 × 1.030 = **641** | 641/(641+777.2) = **0.452** |
| 1.0 | 777 × 1.030 = **800** | 800/(800+777.2) = **0.507** |
| 1.2 | 933 × 1.030 = **961** | 961/(961+777.2) = **0.553** |

---

## 5. 진공 Vent 손실 (V_loss) 상세

### 5.1 손실 발생 경로

```
컬럼 상부 증기 (~78°C, ~48.5 torr)
  │
  ├─→ 응축기 → Reflux Drum → R (액체 환류)
  │                        → D (액체 경비물)
  │
  └─→ Vacuum Pump / Ejector → 비응축 가스 + PGMEA vapor
                              → SC-6128 Scrubber (수세)
                              → V_loss (scrubber 배출 or 회수)
```

### 5.2 현재 계측 현황

| 태그 | PV | 상태 |
|:----:|:---:|:----:|
| PI-6111 | **48.5 torr** | 컬럼 진공압 (정상 계측) |
| LI-6128 | **0** | Scrubber SC-6128 level (계측 불가 또는 미사용) |
| (vent flow) | **없음** | 별도 유량계 없음 |

> **직접 계측이 불가능하므로 V_loss는 추정에 의존해야 한다.**

### 5.3 V_loss 추정 방법

**방법 A — 물질수지 역산 (권장):**
```
V_loss = F - (D + P + B)
```
F, D, P, B가 모두 신뢰할 수 있는 유량계일 때 계산 가능. 현재 검산 결과 F=820, D+P+B=817.44 → V_loss ≈ **2.6 kg/hr (0.32%)**. 단, 이 차이는 계측 오차 범위 내이므로 신뢰도가 낮다.

**방법 B — 설계/경험치 적용:**
진공 증류 컬럼(48.5 torr, PGMEA)의 일반적인 vent 손실률:

| 응축기 효율 | 예상 k_V | 비고 |
|:----------:|:--------:|:------|
| 우수 (과냉각 10°C+, 충분한 면적) | ~0.005 (0.5%) | 고효율 응축기 |
| **보통** (일반 수냉) | **~0.01 (1%)** | **C-6111 기본 가정** |
| 저효율 (냉각수 온도 높음) | ~0.02 (2%) | 여름철 냉각탑 부하 증가 시 |

**방법 C — vent gas 분석:**
scrubber 전단에 sampling port가 있다면 GC 분석 or 휴대용 VOC meter로 PGMEA 농도 측정 → 유량 추정.

### 5.4 V_loss가 물질수지에 미치는 영향

| 항목 | V_loss 미포함 (k_P=0.95) | V_loss 포함 (k_P=0.94, k_V=0.01) |
|:----:|:-----------------------:|:--------------------------------:|
| 필요 F (P=777.2 기준) | 818.1 | **826.8** (+1.1%) |
| D | 16.36 | 16.54 |
| B | 24.54 | 24.81 |
| V_loss | — | **8.27** |
| 실제 P 수율 | 95.0% (과대) | **94.0%** (현실) |
| L/V 계산 영향 | 무시 가능 (액상만 영향) | **무시 가능** (액상 유량에 V_loss 비중↓) |

> V_loss는 주로 **F/D/B 보정**에 영향을 주고, **환류량(R) 계산에는 직접 영향이 없다** (V_loss는 액상 환류 loop 밖에서 일어나는 손실이므로).

### 5.5 일반적인 증류 플랜트 설계 Loss 기준

#### Loss 항목별 설계값

| Loss 항목 | 일반 설계값 | C-6111 적용 가능성 |
|:----------|:----------:|:------------------:|
| **Vent loss** (진공펌프 → scrubber) | **0.5 ~ 2%** | 응축기 효율, 진공도에 따라 |
| - 응축기 효율 좋음 (과냉각 10°C+) | 0.3~0.5% | 가능 |
| - **보통** (일반 수냉, 40°C CW) | **0.5~1.0%** | **C-6111 현재 가정 (k_V=1%)** |
| - 응축기 효율 낮음 (CW 온도 ↑) | 1.0~2.0% | 하절기 |
| **Mechanical loss** (pump seal, flange, valve) | 0.1~0.3% | 무시 가능 |
| **Drain/Flushing loss** (라인 드레인, 샘플링) | 0.1~0.2% | 무시 가능 |
| **Storage/Transfer loss** (탱크 breathing, 증발) | 0.1~0.5% | 탱크존 별도 |
| **Batch transition loss** (grade change) | 0.5~2.0% | C-6111 연속식 → 해당 없음 |
| **분석/품질 margin** | 0.3~0.5% | off-spec 재처리 고려 |

#### 플랜트 유형별 총 설계 loss

| 플랜트 유형 | 총 설계 loss | k_V (vent only) |
|:-----------|:----------:|:--------------:|
| 대기압 증류 (단순) | 0.5~1% | 0% (vent minimal) |
| **진공 증류 (고순도, PGMEA급)** | **1~3%** | **0.5~1.5%** |
| 고진공 증류 (<10 torr, 열민감) | 2~5% | 1~3% |
| 회분식 증류 (batch) | 3~8% | 포함 |

#### 설계 예시 (PGMEA 진공 증류 기준)

```
Feed            100.0  (100%)  ← 설계 기준 (FICQ-6101)
  ├─ Product     94.0  (94.0%) ← 제품 수율 (k_P)
  ├─ Distillate   2.0  (2.0%)  ← 경비물 (k_D)
  ├─ Bottom       3.0  (3.0%)  ← 중비물 (k_B)
  └─ Vent loss    1.0  (1.0%)  ← 설계 loss (k_V)
Total out:      100.0  (100%)
```

> C-6111에 k_V=1.0%는 **일반적인 진공 증류 설계 범위 내**에 있다. 장기 물질수지 추세로 보정하면 0.5~0.8%로 더 낮출 여지도 있다.

### 6.1 현재 컬럼 온도 Profile

| 태그 | 위치 | PV (°C) | SP (°C) | OP (%) |
|:----:|:----:|:-------:|:-------:|:------:|
| TICA-6111A | 최하부 (Reboiler) | 79.6 | 81.5 | 25.1 |
| TI-6111B | 원료투입구 위 중부 | 79.1 | — | — |
| TI-6111C | 제품추출 노즐 근처 중상부 | 78.8 | — | — |
| TI-6111D | 상부 제품추출 노즐 근처 | **77.8** | — | — |

컬럼 상부 온도 (T_top) = TI-6111D PV = **77.8°C**

### 6.2 현재 유량 현황

| 태그 | 역할 | PV (kg/hr) | SP (kg/hr) |
|:----:|:----:|:----------:|:----------:|
| FICQ-6101 | **F** (원료) | 820.7 | **820** |
| FICQ-6114 | **D** (경비물) | 17.4 | **16.7** |
| FICQ-6118 | **P** (제품) | 784.0 | **777.2** |
| FICQ-6116 | **B** (하부) | 25.2 | **24.54** |
| FICQ-6113 | **R_ext** (환류) | 350.7 | **350** |

### 6.3 검증: 현재 분할비

| 검증항목 | 계산 | 결과 | 설계 |
|:--------:|:----:|:----:|:----:|
| P/F | 784.0 / 820.7 | **0.955** | 0.95 ✓ |
| D/F | 17.4 / 820.7 | **0.021** | 0.02 ✓ |
| B/F | 25.2 / 820.7 | **0.031** | 0.03 ✓ |
| R_f | 350 / 777.2 | **0.450** | 0.5~1.2 ✗ |

> P/D/B의 분할비는 설계와 일치하나, **환류비(R_f)만 0.45로 설계 범위(0.5~1.2)를 하회**한다.

### 6.4 권장 설정값 (R_f = 0.8, ΔT = 5°C 가정)

| 설정값 | 태그 | **공식** | **계산값** | 현재 SP | 조정 |
|:-----:|:----:|:--------:|:---------:|:-------:|:----:|
| **F** | FICQ-6101 | P ÷ 0.95 | **818.1** | 820 | → 유지 |
| **D** | FICQ-6114 | 0.02/0.95 × P | **16.4** | 16.7 | → 미세조정 |
| **P** | FICQ-6118 | (기준) | **777.2** | 777.2 | → 유지 |
| **B** | FICQ-6116 | 0.03/0.95 × P | **24.5** | 24.54 | → 유지 |
| **R_ext** | FICQ-6113 | R_f × P | **622** | 350 | → **상향** |
| R_int | (내부) | R_ext × TCF | **641** | — | — |
| L/V | (내부) | R_int/(R_int+P) | **0.452** | 0.317 | → 상향 |

### 6.5 R_f 시나리오별 비교

| R_f | R_ext | R_int (ΔT=5°C) | L/V | R/F | 에너지 |
|:---:|:-----:|:--------------:|:---:|:---:|:------:|
| **0.45 (현재)** | **350** | **361** | 0.317 | 0.43 | ↓ 낮음 |
| **0.8** | **622** | **641** | 0.452 | 0.76 | 중간 |
| 1.0 | 777 | 800 | 0.507 | 0.95 | ↑ 높음 |
| 1.2 | 933 | 961 | 0.553 | 1.14 | ↑↑ 높음 |

---

## 7. 운전 가이드라인

### 7.1 설정 순서

1. **P (FICQ-6118)** — 제품 추출량을 목표 생산량에 맞춰 설정
2. **F (FICQ-6101)** — F = P / 0.95로 원료량 설정
3. **D (FICQ-6114)** — D = 0.02/0.95 × P로 경비물 설정
4. **B (FICQ-6116)** — B = 0.03/0.95 × P로 하부 설정
5. **R (FICQ-6113)** — R = R_f × P (R_f = 0.5~1.2 범위)로 환류 설정
6. **TICA-6111A** (Reboiler) — R 증가 시 재비기 부하 증가 → 온도 유지 확인

### 7.2 환류비 결정 트레이드오프

| R_f 증가 시 | 영향 |
|:-----------|:-----|
| 분리 효율 | ↑ (순도 증가) |
| 재비기 증기 소비 | ↑ (에너지 비용 증가) |
| 응축기 부하 | ↑ (냉각수 비용 증가) |
| 컬럼 내부 flooding 위험 | ↑ (범위 내에서만) |

### 7.3 주의사항

- **환류 drum 온도 센서**가 확인되지 않음 — ΔT 확인 후 TCF 재계산 필요
- **PGMEA 물성치(c_p, λ)** 는 일반값 — 실제 분석 데이터로 대체 권장
- **R_f = 0.8**을 첫 권장값으로 제시 — 순도 분석 결과 보며 증감
- R을 급격히 변경하지 말고 **단계적(step-wise) 조정** 후 정상상태 도달 확인
- **V_loss (진공 vent 손실)는 직접 계측 불가** — scrubber SC-6128(LI-6128) level 계측 이상으로 운전 상태 미확인. scrubber 정상 운영 여부 점검 필요
- **k_V = 0.01 (1%)** 은 일반적인 진공 증류 추정치. 실제 vent gas 분석 또는 물질수지 장기 추세로 보정 권장

---

## 8. 참고: 온도 Profile 해석

| 프로파일 형태 | 의미 |
|:------------|:------|
| 상부 >> 하부 (정상) | 양호한 분리 |
| 전 구간 균일 (flat) | 분리 불량, flooding, 또는 내부 이상 |
| 하부 > 상부 (정상 역전) | 정상 — reboiler에서 가열, top으로 갈수록 가벼운 성분 |

현재 C-6111 (79.6 → 79.1 → 78.8 → **77.8°C**):

- 하부 > 상부: **정상적인 하강 온도 profile** ✓ (가벼운 성분이 상부로 농축)
- 차이가 작음: **비교적 순수한 단일 성분(PGMEA) 컬럼**이므로 온도 구배가 크지 않은 것이 정상

---

## 9. 수식 검증 결과 및 정정

본 문서(§1~§8)의 수식을 검산한 결과와 정정 사항. **DCS 적용 시 §10을 기준으로 삼는다.**

### 9.1 발견된 불일치·오류

| # | 위치 | 문제 | 정정 |
|:-:|:-----|:-----|:-----|
| **V1** | §2 vs §6 | **k_P 이중 정의**: §2·§3·§5는 V_loss 포함 4항(`k_P=0.94`, `F=P÷0.94=826.8`), §6 설정표는 3항(`k_P=0.95`, `F=P÷0.95=818.1`). 동일 문서 내 충돌 | §10.2 — 측정가능 스트림만 비례계수로, V_loss는 잔차로 분리. 재정규화 불필요 |
| **V2** | §4.4·§6.4 | **L/V 정의 비표준**: `L/V = R/(R+P)`. 측류 추출은 P가 측류로 빠지므로 이는 열역학적 기액비가 아님 | 정류부(측류 노즐 상단) 실제 기액비 = `R/(R+D)`. §10.5 참조. 기존 식은 "제품기준 트래픽 지표"로만 명명 |
| **V3** | §5.3 방법A | **산술 오류**: "D+P+B=817.44" → 실제 16.36+777.2+24.54=**818.10** (SP 기준 818.44) | 잔차식 자체는 유효(§10.6). 표기값만 정정 |
| **V4** | §3.4 | **V_loss를 환산 설정값(8.27)으로 산출** — 유량계 부재로 제어 불가 변수 | V_loss는 **설정값 아님**. 물질수지 closure 계산 태그로만 운용(§10.6) |

### 9.2 정합성 확인된 부분 (그대로 사용 가능)

| 항목 | 확인 |
|:-----|:-----|
| 과냉각 보정 `TCF = 1 + c_p·ΔT/λ` | ✓ `c_p/λ = 2.0/330 = 0.00606 K⁻¹`, ΔT 0/5/10/15/20 → TCF 1.000/1.030/1.061/1.091/1.121 전부 정확 |
| 물질수지 검산 (§3.5) | ✓ `16.54+777.2+24.81+8.27 = 826.8`, 계수합 1.00 |
| R_f 환산 (§4.4·§6.5) | ✓ 채택된 L/V 정의 범위 내에서 내부 정합 (단 V2 적용 시 L/V 수치는 재계산 필요) |
| 온도 profile 해석 (§8) | ✓ 하강 profile 정상 판정 타당 |

### 9.3 심화 진단 — 공정제어 구조 결함 (V1~V4보다 중대) ★

산술·정의 오류(§9.1)보다 **제어 구조 차원의 결함**이 더 심각하다. 아래는 본문 §1~§11 및
연계 문서(`측류추출-시간지연-적용방식.md`, `측류추출-관계식.md`) 공통 결함이다.

| # | 결함 | 근거 / 위험 | 정정 방향 |
|:-:|:-----|:-----------|:----------|
| **D5** | **인벤토리(레벨) 폐루프 부재 · 자유도 과지정** [치명적] | F·D·P·B를 **모두 독립 유량 SP**로 명령. 그러나 컬럼 인벤토리는 **환류드럼·탑저 2개 홀드업**을 가지며 이 중 2개 유량은 **레벨 제어**가 잡아야 함. C-6111엔 실제로 **LICA-6113(드럼 레벨 제어기, SP/OP/PV 보유)** 존재 → D(또는 환류)를 개루프 비율로 동시에 명령하면 **레벨 루프와 충돌·표류** | 자유도 정리: **F(처리량)+P(측류제품)+R(환류)만 명령**, **D·B는 레벨 제어가 구동**. K_D·K_B는 **피드포워드 바이어스/기대값·모니터링**으로만 사용 |
| **D6** | **전달지연 독립 적용 시 인벤토리 표류** [치명적, §11 직결] | 각 스트림을 서로 다른 τ로 독립 지연하면 과도 중 `D+P+B ≠ F`, 차이 `dM/dt`가 홀드업에 누적 → 드럼/탑저 레벨 스윙 → 알람/오버플로/dry-out | **명시적 deadtime/lag는 P(및 FF 환류) 경로에만**. **D·B 인벤토리 동특성은 레벨 제어기가 적분으로 자동 정합**(별도 deadtime 튜닝 불필요) |
| **D7** | **P 지연 방향 비대칭 위험** [중요] | 시간지연 문서는 **피드 증가만** 가정. 피드 **감소** 시 P를 15~20분 느리게 지연하면 줄어든 피드 대비 **제품 과배출** → 중간단 인벤토리 하강·불순물 상승 → **순도 위반**(의도와 반대) | `θ_up/θ_dn`·`rate_up/rate_dn` 분리. 감소 시 P는 **더 빨리 추종**(과배출 방지) |
| **D8** | **온도기반 Step Test 부적합 (이 컬럼 한정)** [중요] | 시간지연 문서 §3은 트레이 온도로 지연 측정. 그러나 §8대로 C-6111은 **준단일성분 PGMEA, 구배 ~2°C(79.6→77.8)** → 온도는 압력지배·약한 조성지표 | 지연 측정은 **측류 analyzer·레벨 응답·유량 응답** 기준. (엔진은 "응답 지표 신호"를 컬럼별 설정) |
| **D9** | **관계식 문서 `R=R_f×D` 모순** [중요] | `측류추출-관계식.md` §2·§4가 환류 설정식을 `R=R_f×D`로 제시 → 본문 §4.1이 측류식엔 틀림(R_f=21.4)임을 이미 증명. 같은 문서 부록은 R을 P/F 기준으로 정정 → **자체 모순** | 환류는 **일관되게 `R=R_f×P`**(외부환류 기준, §10.4) |
| **D10** | **이동평균 ≠ 1차지연 혼용** [경미] | 시간지연 문서 §2가 MA(FIR)와 FOPDT(IIR)를 호환처럼 기술. MA는 ~window/2 군지연 추가로 동작 다름 | 역할 분리: **노이즈 제거=MA/EMA(F 전단)**, **전달보상=명시적 deadtime 링버퍼+lag**(§12 엔진에서 분리 구현) |
| **D11** | **진공 압력 안정 가정 미명시** [중요] | PICA-6111(진공) 변동 시 질량유량·split·vent loss·boilup 관계가 흔들림 | 비율식 유효 전제 = **압력 정상**. 압력 불안정도 **과도 게이트(§11.6)** 에 포함 |

> **종합**: 본 문서 계열의 비율 피드포워드는 "모든 스트림을 개루프 유량으로 명령"하는 전제가 잘못이다.
> **레벨 제어가 인벤토리를 닫고**, 피드포워드는 **F·P·R만** 좌표화하며 D·B엔 **바이어스/기대값**만 제공해야 안정하다.
> §10~§11의 계산식은 이 전제(D·B는 레벨 구동) 위에서 적용한다. §12 엔진은 스트림별로
> **"명령(commanded) / 레벨추종(level-driven) / 모니터"** 역할을 컬럼마다 설정하도록 설계한다.

---

## 10. DCS 실무 적용 계산식 (Implementable)

> **설계 원칙**
> 1. **측정 가능한 스트림(F·D·P·B·R_ext)만 비례제어 설정값으로 산출한다.**
> 2. **V_loss·R_int·L/V는 계측·제어 대상이 아니다** → "계산 모니터링 태그"로만 표시(설정값 금지).
> 3. 비례식은 **하한·상한 클램프**와 **rate limit**를 반드시 동반한다(공식만 적용 금지).
> 4. 마스터 변수는 운전 모드로 선택: **원료 주도(Feed-led)** 또는 **제품 주도(Product-led)**.

### 10.1 DCS I/O 점 (Point List)

| 구분 | 태그 | 역할 | 비고 |
|:----:|:----:|:----|:-----|
| 입력 | FICQ-6101.PV | F 원료 (측정) | 마스터 후보 |
| 입력 | FICQ-6118.PV | P 제품 측류 (측정) | 마스터 후보 |
| 입력 | FICQ-6114.PV | D 경비물 (측정) | |
| 입력 | FICQ-6116.PV | B 하부 (측정) | |
| 입력 | FICQ-6113.PV | R_ext 외부환류 (측정) | DCS는 외부환류만 제어 |
| 출력(SP) | FICQ-6114.SP, FICQ-6118.SP, FICQ-6116.SP, FICQ-6113.SP | 비례 설정값 | 클램프·rate limit 적용 |
| 계산 태그 | V_loss_calc, Yield_calc, LV_top_calc, R_int_calc | 모니터링 전용 | **SP 아님** |

### 10.2 비례 계수 — 목표(레시피) vs 관측 분리 ★

> **치명적 주의**: 비례계수를 매 스캔 PV(`K = D/F`)로 계산해서 SP에 쓰면 `D_sp = (D/F)×F = D`,
> 즉 **설정값이 현재 PV를 그대로 따라가는 무의미한 루프**가 된다. 반드시 아래처럼 분리한다.

**(a) 목표 계수 `K_*_t` — 제어 설정식 입력 (엔지니어/운전원 설정 상수)**
설계·랩 분석·시운전 캡처로 정한 고정 레시피 값. DCS에 **튜닝 파라미터**로 저장, 품질변경 시에만 수정.

```
K_D_t = 0.020       (경비물 목표 비율, D/F)
K_P_t = 0.950       (제품 목표 수율,   P/F)
K_B_t = 0.030       (하부 목표 비율,   B/F)
R_f_t = 0.80        (제품기준 환류비,  R_ext/P)
```

**(b) 관측 계수 `K_*_obs` — 모니터링·트렌드 전용 (SP 인가 금지)**
실제 분할이 목표에서 얼마나 벗어났는지 감시용. **3항을 1.00으로 강제 정규화하지 않는다.**

```
K_D_obs = D / F ; K_P_obs = P / F ; K_B_obs = B / F
k_V_obs = 1 − (K_D_obs + K_P_obs + K_B_obs)     ← vent 손실률 추정 (관측)
```

> §2의 "k_P=0.94 vs 0.95" 혼란은 여기서 해소된다: 관측 D/P/B는 F의 약 99%만 차지하고,
> **나머지 ≈1%가 V_loss**다. 목표 계수는 0.94로 줄이지 말고 0.95(=관측 수율)를 그대로 쓰되,
> 부족분 `k_V_obs`를 손실로 **보고만** 한다. (시운전 시 `K_*_obs`를 정상상태에서 캡처해 `K_*_t` 초기값으로 사용)

### 10.3 피드포워드 설정식 — 모드별

> **§9.3(D5) 적용**: 아래 D_SP·B_SP는 **D·B가 commanded일 때**의 식. 레벨 폐루프가 있으면(C-6111의 LICA-6113)
> **D·B는 level_driven**으로 두고 이 식은 **기대치/바이어스**로만 쓴다(개루프 명령 금지). commanded는 통상 **P·R**.

**[모드 A] 원료 주도 (Feed-led, DCS 표준·권장)** — F를 운전원이 잡고 나머지가 추종. **목표 계수(`K_*_t`) 사용**

```
D_SP = K_D_t × F_PV
P_SP = K_P_t × F_PV
B_SP = K_B_t × F_PV
R_SP = R_f_t × P_SP            (또는 R_f' × F_PV)
```

**[모드 B] 제품 주도 (Product-led)** — 목표 생산량 P_target을 잡고 F를 역산 (본문 §3·§7 방식)

```
F_SP = P_target / K_P_t
D_SP = (K_D_t / K_P_t) × P_target
B_SP = (K_B_t / K_P_t) × P_target
R_SP = R_f_t × P_target
```

> 연속탑은 통상 **모드 A**가 안정적(피드 변동을 즉시 추종, 레벨 컨트롤러와 충돌 적음). 생산계획상 제품량이 고정이면 모드 B로 F_SP만 산출 후 다시 모드 A로 전환 운전.

### 10.4 환류 설정식 (외부환류 기준)

DCS/FICQ가 계측·제어하는 것은 **외부 환류(R_ext)뿐**이다. 따라서 설정식은 R_ext 기준으로만 작성한다.

```
R_SP = R_f × P_SP            R_f ∈ [0.5, 1.2]  (정상운전 권장)
```

`R_int`(내부 환류)와 `TCF`는 **분리효율 해석용 오프라인 계산**일 뿐, 계측 불가 → **설정값으로 쓰지 않는다.**

### 10.5 모니터링 계산 태그 (제어 아님)

```
# 정류부(측류 노즐 상단) 실제 기액비 — 정정된 정의 (V2)
LV_top_calc = R_ext / (R_ext + D)

# 내부 환류 (해석용)
R_int_calc  = R_ext × (1 + c_p × ΔT / λ)        c_p/λ = 0.00606 /K
              ΔT = T_top − T_reflux_drum  (drum 온도계 미확보 시 표시 안 함)

# 참고: 본문 §4.4의 제품기준 트래픽 지표 (열역학 L/V 아님, 별도 표기)
LV_prod_index = R_int_calc / (R_int_calc + P)
```

### 10.6 물질수지 Closure / 수율 모니터 (V_loss는 여기서만)

```
V_loss_calc = F_PV − (D_PV + P_PV + B_PV)      # 잔차 = vent + 계측오차
Yield_calc  = P_PV / F_PV × 100                # 실제 제품 수율 [%]

# 건전성 게이트 (계측 오차대 고려)
IF |V_loss_calc| > 0.03 × F_PV  → "물질수지 불일치" 경보 (계측기 점검)
IF V_loss_calc < 0              → 음의 손실 = 계측기 드리프트/스팬 오류 의심
```

> V_loss는 **F·D·P·B가 모두 신선·정상일 때만** 의미. 하나라도 STALE/오류면 잔차 무효 처리(§realtime corroboration 게이트 연동).

### 10.7 안전 클램프 · 변화율 제한 (필수)

각 설정식 출력은 아래를 통과한 뒤에야 컨트롤러 SP로 인가한다.

```
SP_clamped = CLAMP(SP_raw, SP_min, SP_max)            # 계기 레인지·운전 한계
SP_out     = RATE_LIMIT(SP_clamped, ΔSP_max_per_min)  # 급변 방지(스텝 운전)

# 권장 한계 (예시 — 실제 계기 euhi/eulo 및 운전한계로 대체)
R_SP   : Δ ≤ 5%/min,  하한 = 최소 wetting 환류 (트레이 dry-out 방지)
F_SP   : Δ ≤ 3%/min
D/B_SP : 음수 금지, 0 근접 시 최소 흐름 유지(라인 막힘 방지)
```

### 10.8 스팀(재비기) 연동 — 환류 비교식 문서 정합

`knowledge/측류추출-관계식.md`의 스팀식과 정합:

```
S_SP = K_S × F_PV + f(ΔP) + Bias
       K_S = α × K_D × (R_f + 1)         (이론 비례계수)
       f(ΔP) : 탑 차압 오버라이드 (flooding 방지 감쇄)
       Bias  : 열손실·외기·계측오차 운전원 트림
```

> 단, `R = R_f × D`(일반탑)와 본문 `R = R_f × P`(측류)는 **R_f 기준이 다르다**. 스팀식의 `K_S = α·K_D·(R_f+1)`는 환류를 D 기준으로 본 일반탑 유도식이므로, 측류 운전(R∝P)에서는 `S_SP = α × (R_ext + D)`의 **직접 증기부하식**을 쓰는 것이 안전하다(R·D 모두 측정값 사용).

### 10.9 알고리즘 참조 (Structured Text 표기)

> **주의(§12.0)**: 이 의사코드는 **알고리즘 정의**다. 가변길이 데드타임·진짜 이동평균·다컬럼·dM/dt
> 과도게이트 등은 **DCS 펑션블록으로 다 못 구현** → 실제 연산은 **우리 프로젝트 코드(§12)** 가 수행하고
> 결과를 **권장 SP(보조지표)** 로 제시한다. 아래는 그 핵심 로직의 단일컬럼 표기.

알고리즘은 ① 품질·BAD 처리 ② 0 나눗셈 가드 ③ 입력 필터링 ④ enable/모드 게이트
⑤ BAD 입력 시 마지막 정상 SP 홀드 ⑥ deadband ⑦ SP는 클램프·rate-limit 후에만 인가를 모두 포함한다.

**설정 파라미터 (엔지니어 — 1회 입력, 품질변경 시만 수정)**

```text
PARAM  MODE          : INT   = 0        # 0=A(원료주도), 1=B(제품주도)
PARAM  ENABLE        : BOOL  = FALSE     # 마스터 인에이블 (운전원)
PARAM  K_D_t, K_P_t, K_B_t : REAL = 0.020, 0.950, 0.030   # 목표 분할계수
PARAM  R_f_t         : REAL  = 0.80      # 제품기준 환류비
PARAM  P_TARGET      : REAL  = 777.2     # 모드 B 목표 생산량 [kg/hr]
PARAM  TAU_FILT      : REAL  = 300.0     # 입력 1차필터 시정수 [s]
PARAM  F_MIN,F_MAX   : REAL  = 100, 1000
PARAM  D_MIN,D_MAX   : REAL  = 0,   60
PARAM  P_MIN,P_MAX   : REAL  = 0,   950
PARAM  B_MIN,B_MAX   : REAL  = 0,   80
PARAM  R_MIN,R_MAX   : REAL  = 150, 1100   # R_MIN = 트레이 wetting 하한
PARAM  DR_MAX        : REAL  = 30.0      # 환류 변화율 한계 [kg/hr/min] (≈5%/min)
PARAM  DF_MAX        : REAL  = 25.0      # 원료 변화율 한계 [kg/hr/min]
PARAM  DPB_MAX       : REAL  = 50.0      # 제품/하부/경비 변화율 한계
PARAM  DEADBAND      : REAL  = 0.5       # SP 갱신 데드밴드 [kg/hr]
```

**상태 변수 (블록 내부 보존)**

```text
STATE  Ff,Df,Pf,Bf,Rf_pv : REAL        # 필터된 입력
STATE  F_sp,D_sp,P_sp,B_sp,R_sp : REAL # 마지막 정상 SP (BAD 시 홀드)
STATE  initDone : BOOL = FALSE
```

**헬퍼**

```text
FUNC CLAMP(x,lo,hi)        = MAX(lo, MIN(hi, x))
FUNC RATELIM(new,old,dmax) = old + CLAMP(new-old, -dmax*Ts/60, +dmax*Ts/60)   # Ts=스캔주기[s]
FUNC LPF(x,xf)             = xf + (x-xf)*Ts/(TAU_FILT+Ts)
FUNC GOOD(pt)              = (pt.Quality == GOOD) AND (NOT pt.Stale)          # OPC 품질+신선도
FUNC SAFEDIV(a,b,dflt)     = IF (ABS(b) > 1e-6) THEN a/b ELSE dflt
```

**매 스캔 (Ts = 1~5 s) 본체**

```text
# ---- 0) 입력 읽기 + 품질 게이트 ----
okF = GOOD(FICQ_6101) ; okD = GOOD(FICQ_6114) ; okP = GOOD(FICQ_6118)
okB = GOOD(FICQ_6116) ; okR = GOOD(FICQ_6113)
F=FICQ_6101.PV ; D=FICQ_6114.PV ; P=FICQ_6118.PV ; B=FICQ_6116.PV ; R=FICQ_6113.PV

# ---- 1) 입력 필터 (정상값만 갱신, BAD는 직전 필터값 유지) ----
IF okF: Ff=LPF(F,Ff)  ;  IF okD: Df=LPF(D,Df)  ;  IF okP: Pf=LPF(P,Pf)
IF okB: Bf=LPF(B,Bf)  ;  IF okR: Rf_pv=LPF(R,Rf_pv)
IF NOT initDone AND okF AND okP:        # 초기화: 첫 정상값으로 SP 시드 (범프리스)
    F_sp=Ff; D_sp=Df; P_sp=Pf; B_sp=Bf; R_sp=Rf_pv; initDone=TRUE

# ---- 2) 모니터 계산 (항상, SP 인가 금지) ----
IF okF AND okD AND okP AND okB:
    V_loss   = Ff - (Df + Pf + Bf)
    Yield    = 100 * SAFEDIV(Pf, Ff, 0)
    K_D_obs  = SAFEDIV(Df,Ff,0); K_P_obs=SAFEDIV(Pf,Ff,0); K_B_obs=SAFEDIV(Bf,Ff,0)
    k_V_obs  = 1 - (K_D_obs+K_P_obs+K_B_obs)
    IF ABS(V_loss) > 0.03*Ff : ALARM("MassBalance_Mismatch")
    IF k_V_obs < 0           : ALARM("FlowMeter_Drift")     # 음의 손실 = 스팬오류
LV_top = IF okR AND okD THEN SAFEDIV(Rf_pv, Rf_pv+Df, 0) ELSE BAD   # 정정된 정의 R/(R+D)

# ---- 3) 제어 비활성 시: SP 산출 중단, 직전 SP 홀드 (운전원 수동 우선) ----
IF (NOT ENABLE) OR (NOT initDone):
    RETURN        # 출력 미인가 — 컨트롤러는 운전원/캐스케이드 SP 유지

# ---- 4) 피드포워드 SP 산출 (목표계수 K_*_t 사용) ----
IF MODE == 0:                                   # 모드 A: 원료 주도
    IF NOT okF: RETURN                           # 마스터 BAD → 홀드
    Draw = K_D_t * Ff ; Praw = K_P_t * Ff ; Braw = K_B_t * Ff
    Fraw = Ff                                    # F는 운전원 SP (추종 안 함)
ELSE:                                            # 모드 B: 제품 주도
    Fraw = SAFEDIV(P_TARGET, K_P_t, F_sp)
    Draw = SAFEDIV(K_D_t,K_P_t,0) * P_TARGET
    Braw = SAFEDIV(K_B_t,K_P_t,0) * P_TARGET
    Praw = P_TARGET
Rraw = R_f_t * Praw                              # 외부환류 기준 (R_int/TCF는 제어 안 함)

# ---- 5) 클램프 → rate-limit → 데드밴드 → 인가 ----
D_sp = RATELIM(CLAMP(Draw,D_MIN,D_MAX), D_sp, DPB_MAX)
P_sp = RATELIM(CLAMP(Praw,P_MIN,P_MAX), P_sp, DPB_MAX)
B_sp = RATELIM(CLAMP(Braw,B_MIN,B_MAX), B_sp, DPB_MAX)
R_sp = RATELIM(CLAMP(Rraw,R_MIN,R_MAX), R_sp, DR_MAX)
IF MODE == 1: F_sp = RATELIM(CLAMP(Fraw,F_MIN,F_MAX), F_sp, DF_MAX)

WRITE_IF_DELTA(FICQ_6114.SP, D_sp, DEADBAND)     # 데드밴드 초과 시에만 기록
WRITE_IF_DELTA(FICQ_6118.SP, P_sp, DEADBAND)
WRITE_IF_DELTA(FICQ_6116.SP, B_sp, DEADBAND)
WRITE_IF_DELTA(FICQ_6113.SP, R_sp, DEADBAND)
IF MODE == 1: WRITE_IF_DELTA(FICQ_6101.SP, F_sp, DEADBAND)
```

**적용 체크리스트**

| 항목 | 확인 |
|:-----|:-----|
| 목표계수 `K_*_t`는 **상수**, 관측 `K_*_obs`는 모니터 전용 (혼용 금지) | ☐ |
| `ENABLE=FALSE` 또는 BAD 입력 시 **직전 SP 홀드**(범프리스) | ☐ |
| 초기 시드(`initDone`)로 인에이블 순간 bump 방지 | ☐ |
| 각 하위 FIC는 **CAS 모드**(상위 계산블록이 SP 공급) 설정 | ☐ |
| `R_MIN`은 트레이 dry-out 방지 최소 환류로 설정 | ☐ |
| 모드 전환 시 새 모드 SP를 현재값으로 재시드 후 전환 | ☐ |
| 계산블록 자체 BAD/실행실패 시 하위 FIC는 **last-SP 유지**(fail-freeze) | ☐ |

---

## 11. FEED 변경 시 동적 보상 — 전달지연 (Dynamic Feedforward)

### 11.1 문제 정의

§10 모드 A는 `D_sp = K_D_t × F` 처럼 **F에 즉각(동일 스캔) 비례**한다. F를 ramp로 천천히 올려도,
**나머지 SP는 F를 그 자리에서 따라가므로** 다음 문제가 생긴다:

- 증분 원료가 **아직 추출 트레이에 도달하지 않았는데** 제품·하부를 미리 더 뽑음 → **컬럼 인벤토리(레벨) 과배출** → 조성 흐트러짐 → **hunting**.
- 각 추출점은 피드 트레이로부터 **물리적 거리·홀드업이 달라 응답 시점이 다르다**:
  - **상부 D / 환류** : 증기 상승은 빠르나 응축기·환류드럼 홀드업으로 **지체(τ) 큼**
  - **측류 P** : 피드 근처 → 지연 작음
  - **하부 B** : 액이 트레이 타고 내려가 리보일러 홀드업 → **데드타임(θ)·지체 큼**

→ 각 추출 SP를 **추출점까지의 전달지연(데드타임 θ + 1차 지체 τ)** 만큼 늦춰 인가해야 한다.

> **⚠ §9.3(D5·D6) 적용**: 아래 "스트림별 독립 지연"은 **D·B가 레벨 제어로 닫혀 있을 때만 안전**하다.
> C-6111처럼 **LICA-6113(드럼 레벨)** 이 D/환류를 구동하면, **명시적 deadtime/lag는 P(및 FF 환류)에만** 걸고
> **D·B의 전달지연은 레벨 제어기가 적분으로 자동 처리**하도록 둔다(개루프 독립 지연 금지 → 인벤토리 표류).
> 즉 §11.3~§11.5는 **commanded 스트림(P 등)에 한정** 적용한다.

### 11.2 제어 구조

```
F_target(SP1→SP2) ──[Ramp]──► F_ramp ─┐
                                       │   (driver = F_PV 권장, 필터링)
                      ┌────────────────┼────────────────┬───────────────┐
                      ▼                ▼                ▼               ▼
                 [Deadθ_D+Lagτ_D]  [Deadθ_P+Lagτ_P]  [Deadθ_B+Lagτ_B]  (R은 P 경유)
                      │                │                │
                   ×K_D_t           ×K_P_t           ×K_B_t
                      │                │                │
                  CLAMP/RATELIM    CLAMP/RATELIM    CLAMP/RATELIM
                      ▼                ▼                ▼
                  FICQ-6114.SP     FICQ-6118.SP     FICQ-6116.SP
                                       │
                                  R_sp = R_f_t × P_sp  (P가 이미 보상됨)
```

> **F 자체는 보상하지 않는다**(F가 disturbance 원천). F는 운전원 ramp 그대로,
> **D·P·B·R만** 각자의 θ·τ로 지연시킨다. ramp로 F가 천천히 변하면 D/P/B는 "ramp 추종 + 추가 지연"으로 이중 완만해진다.

### 11.3 보상기 수식

각 스트림 i ∈ {D, P, B} 에 대해 **순수 전달지연(데드타임) → 1차 지체**:

```
F_i(t) = LAG_τi ( F_driver(t − θ_i) )
SP_i   = K_i_t × F_i(t)
```

| 기호 | 의미 |
|:----:|:-----|
| θ_i | 피드 FT → 추출점 i 까지 **순수 이송 데드타임** [s] |
| τ_i | 추출점 i 의 **홀드업 1차 지체 시정수** [s] |

**더 엄밀히** (피드가 컬럼에 미치는 동특성 ≠ 추출이 미치는 동특성일 때) **lead-lag** 추가:

```
G_i(s) = e^(−θ_i·s) × (τ_ld_i·s + 1) / (τ_lg_i·s + 1)
```
초기엔 lead 끄고(τ_ld=0) **데드타임+지체만**으로 시작, hunting 잔류 시 lead로 미세 보정.

### 11.4 파라미터 산정 (bump test)

정상상태에서 F를 작은 스텝(예 ±5%)으로 주고, 각 추출 라인의 **조성/필요유량이 움직이기 시작하는 시각 = θ_i**,
**63% 도달까지 추가시간 ≈ τ_i**. 전형적 범위(컬럼별 반드시 실측):

| 스트림 | θ_i (데드타임) | τ_i (지체) | 근거 |
|:------:|:-------------:|:---------:|:-----|
| P (측류, 피드 근처) | 30~120 s | 1~3 min | 피드 인접 |
| D / 환류 (상부) | 60~180 s | 3~8 min | 증기상승+응축기·드럼 홀드업 |
| B (하부) | 120~300 s | 3~10 min | 트레이 하강+리보일러 홀드업 |

> **방향 비대칭 옵션**: 안전상 F **증가** 시 제품·하부는 θ를 **더 길게**(인벤토리 먼저 확보), F **감소** 시 θ를 **짧게**(과충전 방지). 기본은 대칭, 필요 시 `θ_up`/`θ_dn` 분리.
> **환류 R**: 순도 보호 위해 제품보다 **먼저** 확보되는 게 유리 → R은 P_sp 경유(P 지연 상속)하되, 원하면 R에 작은 **lead**를 줘 환류를 약간 선행시킴.

### 11.5 이산 구현 (계산블록 내부)

**데드타임 = 순환버퍼(FIFO)**, **지체 = IIR 1차필터**. (Experion DEADTIME·LAGLEAD 블록으로 대체 가능)

```text
# --- 초기화 (스트림별) ---
N_i   = ROUND(θ_i / Ts)                 # 버퍼 길이 (스캔수)
buf_i = ARRAY[N_i] of REAL, head_i = 0  # 순환버퍼
Fi    = F_driver                        # 지체필터 상태 (정상값 시드)

FUNC DEADTIME(x, buf, head, N):         # θ초 전 값 반환
    IF N <= 0: RETURN x                  # θ<Ts면 지연 없음
    buf[head] = x
    head = (head + 1) MOD N
    RETURN buf[head]                     # 가장 오래된(=θ 전) 값

FUNC LAG(x, state, tau):                 # 1차 지체
    RETURN state + (x - state) * Ts/(tau + Ts)
```

**매 스캔 — §10.9 "4) 피드포워드 SP 산출" 의 모드 A 블록을 아래로 교체**

```text
IF MODE == 0:                            # 모드 A: 원료 주도 + 동적보상
    IF NOT okF: RETURN                    # 마스터 BAD → 홀드
    Fd = Ff                               # driver = 필터된 F_PV
    # 방향 비대칭 데드타임 (옵션): F 상승/하강에 따라 N 선택
    # 스트림별: 데드타임 → 지체 → 게인
    Fd_D = LAG( DEADTIME(Fd, buf_D, head_D, N_D), Fi_D, tau_D ) ; Fi_D = Fd_D
    Fd_P = LAG( DEADTIME(Fd, buf_P, head_P, N_P), Fi_P, tau_P ) ; Fi_P = Fd_P
    Fd_B = LAG( DEADTIME(Fd, buf_B, head_B, N_B), Fi_B, tau_B ) ; Fi_B = Fd_B
    Draw = K_D_t * Fd_D
    Praw = K_P_t * Fd_P
    Braw = K_B_t * Fd_B
    Fraw = Ff                             # F는 운전원 SP, 보상 안 함
Rraw = R_f_t * Praw                       # 환류는 보상된 P 경유 (P 지연 상속)
# 이후 §10.9 "5) 클램프→rate-limit→데드밴드→인가" 그대로
```

> 게인(K)은 선형이라 `K·DEADTIME(F)` = `DEADTIME(K·F)` 로 등가 → 위처럼 **F를 먼저 지연**시키는 게 구현상 간단.
> 모드 B(제품 주도)는 F_target이 이미 운전원 ramp이므로, 동일하게 P_TARGET을 driver로 두고 D·B·F_SP에 θ·τ 적용.

### 11.6 과도상태 물질수지 — 경보 오발 방지 ★

전달지연 중에는 **인벤토리 축적항 dM/dt ≠ 0** 이라, 동적 물질수지는:

```
F = D + P + B + V_loss + dM/dt        ( dM/dt = 컬럼/드럼 홀드업 변화율 )
```

→ §10.6 의 `V_loss = F − (D+P+B)` 는 **과도 중 일시적으로 커진다(정상)**. 그대로 두면 `MassBalance_Mismatch` 오경보.
따라서 **과도 게이트**를 둔다:

```text
moving = ( ABS(dF/dt) > 0.01*F_MAX/60 )           # F 변화 중
settling = ( time_since_last_F_move < T_SETTLE )   # 이동 후 정착시간(= max θ_i + 3·max τ_i)
IF moving OR settling:
    SUPPRESS ALARM("MassBalance_Mismatch")          # 경보 보류
    V_loss_ss = INVALID                             # 정상상태 손실 산정 보류
ELSE:
    # 정상상태에서만 V_loss·Yield·k_V 신뢰 (§10.6)
```

> `T_SETTLE ≈ max(θ_i) + 3×max(τ_i)` (가장 느린 스트림=B 기준, 전형 15~40 min). 이 창 안에서는
> 물질수지·수율 KPI를 "정착 대기"로 표시하고 경보를 묶는다.

---

## 12. 프로젝트 코드 구현 방안 — 다중 컬럼 공유 "권장 SP(보조지표)" 엔진

### 12.0 작업 단계 정의 (Scope) ★ 반드시 먼저 읽을 것

> DCS 펑션블록은 **가변길이 데드타임 버퍼·진짜 이동평균·다컬럼 공유·dM/dt 과도게이트·비대칭
> up/down 동특성·운전원 편집 경험상수**를 다 담지 못한다. 따라서 이 연산은 **우리 프로젝트 코드**에서
> 수행하고, 결과를 **운전원에게 권장값으로 제시**한다.

| 항목 | 본 단계의 정의 |
|:-----|:----|
| **성격** | **보조지표(Advisory)** — 폐루프 제어 **아님**. 제어 레지스터(SP/OP)에 **자동 쓰기 안 함** |
| **모드 무관(mode-agnostic)** | 유량제어기가 **AUTO든 MANUAL이든** 무관하게, 전달지연까지 반영한 **정확한 권장 SP**를 계산·표시 |
| **출력** | 운전원 화면(우리 Web UI, 또는 별도 **표시 전용 태그**)에 **권장 SP·현재값·차이·추세**를 띄움 |
| **운전원 역할** | 권장값을 **참고**해 **직접(수동) 인가**. 최종 판단·조작은 운전원 |
| **목표** | 권장값이 반복적으로 타당함을 보여 **운전원의 확신을 축적** → 추후(별도 phase) RSP 감독제어로 승격 |
| **비침습성** | 제어 루프를 건드리지 않으므로 **즉시 가동 가능**(쓰기 가드·워치독은 Stage 3 전제조건) |

> ⚠ "모든 FIC가 PID AUTO"라고 가정하지 않는다. MANUAL에서 운전원이 OP를 직접 잡고 있어도, 우리는
> **그 운전원이 다음에 맞춰야 할 SP**(전달지연 정합)를 계산해 보여주는 것이 본질이다.

### 12.1 다중 컬럼 공유 아키텍처

이 연산은 **C-6111 전용이 아니라 여러 컬럼이 공유하는 라이브러리**다. **컬럼-불가지(column-agnostic)
순수 연산 블록** + **컬럼별 설정(데이터)** + **컬럼별 런타임 상태**로 분리한다.

```
[재사용 연산 블록 (순수·단위테스트 가능, 컬럼 무관)]
  MovingAverage / Ema      ─ 노이즈 제거 (F 전단)        ← D10
  DeadTimeBuffer           ─ 가변길이 링버퍼 (전달지연 θ)  ← DCS 불가
  FirstOrderLag / LeadLag  ─ 지체 τ (및 lead 보정)
  RateLimiter (up/dn 분리) ─ 비대칭 변화율               ← D7
  Clamp                    ─ 레인지/운전한계
  RatioFeedforward         ─ K_i × (보상된 driver)
  MassBalanceMonitor       ─ dM/dt(레벨) 포함 과도게이트   ← D6·D11

        ▲ 위 블록들을 조합 ▲
[FeedforwardEngine]  EngineTick(ColumnConfig cfg, Pv snapshot, ColumnState st) → AdvisoryResult
        │
[Supervisor]  활성 컬럼 N개를 주기적으로 Tick (ExperionRealtimeService 패턴 차용)
        │
[설정: Web UI → DB(컬럼/스트림 설정) → 엔진]   [출력: AdvisoryResult → Web UI/표시태그]
```

- **엔진은 상태를 cfg/st 인자로만** 다룬다(전역 상태 없음) → 컬럼마다 독립 인스턴스, 상호 격리.
- 새 컬럼 추가 = **DB에 설정 row 추가 + 태그 바인딩**만. 코드 변경 0.

### 12.2 역할 분담

| 주체 | 담당 |
|:-----|:-----|
| **DCS** | 실제 제어(PID), **레벨 폐루프(LICA-6113 등)로 인벤토리 유지**, PV/모드 제공 (§9.3 D5) |
| **우리 코드(엔진)** | MA/EMA·데드타임·lag·비율·클램프·**비대칭 rate**·**과도 물질수지 게이트**·권장 SP 산출. **쓰기 안 함** |
| **Web UI** | ① 컬럼별 **경험상수 공급 페이지** ② 컬럼별 **권장 SP 대시보드**(현재 vs 권장 vs 차이 vs 추세) |
| **운전원** | 권장값 참고해 **수동 인가**(AUTO면 SP, MANUAL이면 OP 조정). 최종 권한 |

### 12.3 데이터 흐름 (Advisory)

```
realtime_table / OPC PV ─► [Supervisor.Tick]
                             │  cfg(DB) + state(메모리/DB)
                             ▼
                       FeedforwardEngine ──► AdvisoryResult { perStream: {pv, recSP, gap, trend, valid}, transient, massBal }
                             │
                             ├─► Web UI 대시보드 (운전원 화면)
                             └─► (옵션) 표시 전용 태그  ※ 컨트롤러 SP 레지스터 아님
   ── 본 단계는 여기서 끝 (운전원이 보고 수동 인가) ──
```

### 12.4 신규/재사용 컴포넌트

| 레이어 | 컴포넌트 | 신규/재사용 |
|:-------|:---------|:-----------|
| Core/Application | `IFeedforwardEngine`, `ColumnConfig`, `StreamConfig`, `AdvisoryResult` (DTO/옵션) | 신규 |
| Infrastructure/Control | 연산 블록 6종 + `FeedforwardEngine` + `FeedforwardSupervisor` | 신규 (순수 로직, 단위테스트) |
| Infrastructure (read) | PV/모드 스냅샷 | **재사용** — `ExperionRealtimeService`/`realtime_table` |
| Infrastructure/Database | `ff_column_config`, `ff_stream_config`(+ 선택 `ff_state`) 테이블 | 신규 (`ExperionDbContext` boot DDL 패턴) |
| Web/Controllers | `FeedforwardController` — 설정 CRUD(admin) + 권장값 status(공개) | 신규 |
| Web/wwwroot | 신규 탭(예: Tab 18) — 설정 폼 + 권장 SP 대시보드 | 신규 (Tab 16/17 패턴) |
| **쓰기/RSP/가드** | `ExperionOpcWriteClient` + WriteGuard | **본 단계 미사용** — Stage 3 전제 |

### 12.5 컬럼/스트림 설정 (경험상수 = Web UI 공급)

우리가 결정 못 하는 값·경험치는 **전부 Web UI에서 컬럼별로 입력**하고 DB 저장(품질변경 시만 수정).

```
ColumnConfig {
  id, name,
  feedTag,                     // F 유량 PV 태그
  pressureTag,                 // 진공 압력 (안정 게이트, D11)
  levelTags[],                 // 드럼/탑저 레벨 PV (dM/dt·과도게이트, D6)
  maWindowSec | tauF,          // F 노이즈 필터 (D10)
  enabled, advisoryOnly=true   // 본 단계 강제 true
  streams: StreamConfig[]
}
StreamConfig {
  tag,                         // 예: ficq-6118 (P)
  role,                        // commanded | level_driven | monitor   ← §9.3 D5
  K_t,                         // 목표 비율 (commanded일 때)
  thetaUpSec, thetaDnSec,      // 전달 데드타임 (비대칭, D7)
  tauSec, tauLeadSec,          // 지체/리드 (lead-lag)
  spMin, spMax,                // 클램프
  rateUp, rateDn,              // 비대칭 변화율 (D7)
  deadband,
  responseSignalTag            // step test 응답 지표(analyzer/level/flow, D8)
}
```

| 역할(role) | 의미 (§9.3 적용) |
|:----------:|:-----|
| `commanded` | 엔진이 권장 SP 산출 (예: **P**, FF 환류 **R**) — 전달지연 적용 |
| `level_driven` | **레벨 제어가 구동**(예: C-6111의 **D**, **B**). 권장값은 "레벨추종 기대치/바이어스"로만 표시, 독립 deadtime 미적용 (D5·D6) |
| `monitor` | V_loss·수율 등 산출만 (SP 금지, §10.5~10.6) |

> **기본 권장 매핑(C-6111)**: F=feed, **P=commanded**, **R=commanded(P 경유)**, **D·B=level_driven**, V_loss=monitor.
> 다른 컬럼은 레벨 폐루프 구성에 맞춰 role을 재지정.

### 12.6 연산 루프 (mode-agnostic · advisory, 의사코드)

```text
# Supervisor가 활성 컬럼마다 Ts(1~5s) 주기로 호출
AdvisoryResult Tick(cfg, st):
    snap = ReadPVs(cfg.feedTag, cfg.pressureTag, cfg.levelTags, [s.tag for s in cfg.streams],
                   alsoMode=true)          # 모드는 표시용으로만 읽음 (AUTO/MAN 무관)
    if not Good(snap.feed): return Hold(st, reason="FEED BAD")

    # 1) F 노이즈 필터 (이동평균/EMA) — DCS가 못하는 진짜 윈도우 MA 가능
    Ff = st.maF.Push(snap.feed.pv)         # MovingAverage 또는 Ema

    # 2) 과도/압력 게이트 (D6·D11) — 레벨로 dM/dt 산출
    dMdt   = st.levelDeriv.Update(snap.levels)         # 홀드업 변화율
    moving = abs(st.feedDeriv.Update(Ff)) > cfg.feedMoveThresh
    pUnstable = abs(snap.pressure.pv - st.pressFilt) > cfg.pressBand
    transient = moving or pUnstable or st.settleTimer.Active

    # 3) 스트림별 권장값
    for s in cfg.streams:
        if s.role == commanded:
            theta = (Ff rising) ? s.thetaUp : s.thetaDn      # 비대칭 (D7)
            Fd    = st[s].dead.Through(Ff, theta/Ts)         # DeadTimeBuffer (가변길이)
            Fd    = st[s].lag.Step(Fd, s.tau, s.tauLead)     # FirstOrderLag/LeadLag
            raw   = s.K_t * Fd
            rec   = RateLimit(Clamp(raw, s.spMin, s.spMax),
                              st[s].lastRec, s.rateUp, s.rateDn)  # 비대칭 rate
            st[s].lastRec = rec
        elif s.role == level_driven:
            rec = s.K_t * Ff            # "기대치" 표시용 (레벨이 실제 구동). deadtime 미적용
        else:  # monitor
            rec = null
        result.add(s.tag, pv=snap[s].pv, recSP=rec,
                   gap = (rec!=null ? rec - snap[s].pv : null),
                   trend = sign(rec - st[s].lastRec),
                   valid = not transient)        # 과도 중엔 "정착 대기"로 표시

    # 4) 물질수지 모니터 (과도 게이트로 경보 보류, §11.6)
    if not transient and AllGood(F,D,P,B):
        result.massBal = { Vloss: Ff-(D+P+B), yield: 100*P/Ff }
    else:
        result.massBal = SETTLING(remainSec = st.settleTimer.Remain)

    # ★ 쓰기 없음 — result를 Web UI/표시태그로 반환만
    return result
```

> **MANUAL 대응**: 컨트롤러가 MANUAL이어도 위 계산은 동일. UI는 "현재 PV vs 권장 SP, 차이, 추세
> 화살표"를 보여 운전원이 **수동으로 OP를 어느 방향으로 얼마나** 움직일지 판단하게 한다.

### 12.7 운전원 화면 (권장 SP 대시보드)

컬럼별 카드:

| 표시 | 내용 |
|:-----|:-----|
| 모드 배지 | 각 FIC의 AUTO/MAN/CAS (참고 표시) |
| 스트림 행 | `현재 PV │ 권장 SP │ 차이(Δ) │ ▲/▼ 추세 │ valid/정착대기` |
| 전달지연 상태 | "FEED 변경 감지 — P 권장값이 향후 N분에 걸쳐 X→Y로 상승" (지연 진행 시각화) |
| 물질수지 | V_loss·수율 (정상상태만; 과도 중 "정착 N분 남음") |
| level_driven 주석 | "D·B는 레벨 제어가 구동 — 권장값은 기대치" |

### 12.8 단계적 도입 (운전원 신뢰 사다리)

| Stage | 내용 | 쓰기 | 전제 |
|:-----:|:-----|:----:|:-----|
| **1 Shadow** | 계산·**로그만**, 화면 미표시 | ✗ | 없음 (즉시) |
| **2 Advisory ★본 단계** | 권장 SP **화면 표시**, 운전원 **수동 인가** | ✗ | 없음 (비침습) |
| 3 Supervisory(후속) | RSP로 SP 추종 쓰기(운전원 채택 스위치) | △ RSP | **WriteGuard(min/max·rate·Δcap)+워치독+데드맨** 신규 구현 선행 |

> Stage 3은 **운전원이 Advisory 단계에서 확신을 가진 뒤** 별도 합의로 진행. `측류추출-자동운전-플랜`의
> RSP/MAN-OP·쓰기가드 설계를 따른다(현재 `ExperionOpcWriteClient`는 가드 0건 → 그대로 쓰면 위험).

### 12.9 검증 포인트 (본 단계)

- 연산 블록 6종 **단위테스트**(데드타임 길이·MA 윈도·비대칭 rate·lag 스텝응답).
- 다컬럼 **상태 격리**(한 컬럼 BAD가 타 컬럼 영향 없음).
- 재기동 시 상태 **bumpless 시드**(첫 정상 PV로 lag/버퍼 초기화) — 권장값 점프 방지.
- 과도 게이트가 FEED 이동·압력 불안정에 **물질수지 경보를 정확히 보류**.
- **쓰기 경로 0건** 확인(advisory 단계 불변식): 엔진/컨트롤러에서 SP·OP write 호출 부재.

---

## 13. 온도 프로파일 기반 전달지연 검출 & Sweet-Spot 유지 (가능성 평가)

> **착상(운전원 가설)**: FEED↑ → 탑저 TICA-6111A.PV↓ → 스팀↑로 boilup 재정합. 평형 도달까지
> TICA-6111A·TI-6111B·TI-6111C·TI-6111D의 **온도 변화 순서/시점으로 전달지연을 검출**하고,
> 그걸로 **제품 노즐 근처 sweet spot을 유지**하며 투입량 변화에 대응할 수 있는가?

### 13.1 인과사슬 검증 (타당)

고정 듀티에서 FEED↑ → 하부 액부하↑·기화율↓ → 탑저 조성이 가벼워짐(저비점) → **TICA-6111A.PV↓**,
+ 과냉각 피드 **현열 수요**가 하강을 가속 → 운전원/TICA가 **스팀↑**로 boilup 재정합. **사슬 자체는 맞다.**

### 13.2 무엇이 검출되고 무엇이 안 되는가

| 함정 | 내용 |
|:-----|:-----|
| **① 에너지 ≠ 조성** | 온도 onset 순서(A→B→C→D)는 대부분 **증기 boilup 파동(빠름)**. 제품 순도를 지배하는 **조성 프론트 이동은 느림(P 15~20분)**. → 온도로 θ를 잡으면 **빠른 에너지 지연만, 느린 조성 지연은 과소추정** |
| **② 낮은 SNR (D8)** | 준단일성분 PGMEA, 구배 ~2°C로 평탄. 제품존 조성변화 온도효과 ≲0.1°C → 노이즈에 묻힘. **가장 지키고 싶은 지점이 가장 약한 신호** |
| **③ 진공압 결합 (D11)** | T_bp = f(P, 조성). PICA-6111/스팀이 vapor load→압력을 흔들면 조성과 무관하게 온도 이동 |
| **④ 폐루프 오염** | TICA가 이미 스팀 조작 → TICA-6111A.PV는 "딥-회복" **폐루프 합성응답**. 순진한 feed→onset은 **스팀 동특성을 전달지연으로 오귀속** |

### 13.3 신호 조건화 (DCS 불가 · 우리 코드)

| 처리 | 식 / 목적 |
|:-----|:----------|
| **압력보정온도 PCT** | `T_PCT = T_meas − (dT/dP)·(P − P_ref)` — 진공 노이즈 제거. `dT/dP`는 데이터 캘리브레이션 (함정 ③) |
| **차온 ΔT / 이중차온** | `TI-6111C − TI-6111D` 등 — 공통모드 압력변동 상쇄, **프론트 이동만 부각**(고순도 컬럼 정석, 함정 ②) |

### 13.4 Passive 전달지연 식별 (자연 외란 활용)

딥테스트 없이 **정상 운전 중**:

```
θ_i = argmax_τ  ρ( ΔF(t),  ΔPCT_i(t+τ) )        # F→온도 교차상관 지연
```

- **스팀 S(=TICA-6111A.OP)를 2번째 입력으로 부분상관**(partial corr) → 폐루프 오염 회피(함정 ④).
- 미분/사전백색화(pre-whitening)한 ΔF·ΔS·ΔPCT 사용. 외란 충분치 않으면 **신뢰도 낮음**으로 표시.
- 결과 θ_i는 §12 엔진의 **deadtime 파라미터를 자동 튜닝**(advisory θ의 근거가 됨).

### 13.5 Sweet-Spot 유지 = 프론트 위치 (피드포워드 + 온도 피드백)

```
        FEED 변화
           │  (빠른 보상)
   ┌───────┴────────┐
   ▼                ▼
[피드포워드 §11~§12]   [온도 피드백 §13]  ← 느린 프론트 위치 유지
  P·R 권장 SP          제품존 PCT/ΔT = sweet-spot 지표
                       프론트 드리프트 시 → 환류/boilup 트림 권장
```

- 사용자가 원한 그림(투입량 변해도 sweet spot 유지)은 **2층 구조**로 실현: 빠른 에너지=피드포워드,
  느린 조성 프론트=온도 피드백. **온도는 "조성 프론트 위치 프록시"** 로 쓰는 게 정확한 용법.
- **민감 트레이**(|dT_PCT/d위치| 최대) 또는 제품존 ΔT를 프론트 지표로 선정. 여전히 **advisory**(운전원 인가).

### 13.6 §12 엔진 확장 (신규 연산블록)

| 블록 | 역할 |
|:-----|:-----|
| `PressureComp` | PCT 계산 (온도−압력보정) |
| `DiffTemp` | 차온/이중차온 |
| `CrossCorrLagEstimator` | F·S 다입력 부분상관 θ 식별 + 신뢰도 |
| `FrontPositionIndicator` | 제품존 PCT/ΔT → sweet-spot 건전성 + 드리프트 트림 권장 |

> ColumnConfig에 `tempTags[]`, `pressureTag`, `sensitiveTrayTag`, `responseSignalTag(analyzer 우선)` 추가.
> 컬럼별로 "온도지표 사용 여부/민감트레이"를 설정 → 다컬럼 공유 유지.

### 13.7 평가 결론 & 전제조건

- **할 만하고 옳은 방향**(피드백이 모델오차 보정 → 개루프 deadtime보다 우수).
- 단 **단일점 생온도로는 이 컬럼에서 약함** → (a) **PCT/차온 필수**, (b) **스팀 포함 다변수 식별**,
  (c) 측류 **analyzer 있으면 corroborate**, (d) 온도유도 θ는 **신뢰도 등급 붙은 추정치**로 취급.
- **온도는 빠른 에너지 지연엔 강하고 느린 조성 지연엔 약함** — 둘을 구분 사용.
- 전제: 실 플랜트 적용 시 **온도 프로파일/센서 건전성** 먼저 검증(평탄·구배 방향). (현재는 데모 시스템 — 온도값은 인위 생성)

---

## 14. 오차·외란 예산과 보정값 실효성 (Error Budget) ★

> **질문**: 미세 보정값들이 실플랜트의 센서오차·신호전달오차·외란(특히 한국 여름/겨울
> 냉각수 온도차)에 비해 **실제로 의미 있는 영향력**을 가지는가?

### 14.1 결정적 민감도 — 진공압 → 온도

PGMEA @48.5 torr, ~350K, λ≈43.6 kJ/mol → Clausius-Clapeyron:

```
dT/dP ≈ 0.5 °C / torr   (근사)
```

→ **진공 ±2 torr = 온도 ±1°C = 컬럼 전체 구배(~2°C)의 절반.** 수 torr 진공 노이즈가
조성 온도신호를 통째로 덮음. PCT가 *필수*인 동시에 생온도의 취약성을 보여줌.

### 14.2 오차예산 (이 컬럼, 근사)

| 출처 | 크기 | 비교 |
|:-----|:----:|:-----|
| 원료 유량계 | ±1~2% | 비율 신호(피드 10~20%)보다 **훨씬 작음** ✓ |
| 물질수지 V_loss | ~1% | 유량계 오차와 **동급** → 순간값 신뢰불가 (§5.3) |
| 온도센서 RTD | ±0.1~0.3°C | 조성신호 <0.1°C와 **동급/이상** ⚠ |
| **진공압→온도** | **~0.5°C/torr** | 진공 ±2 torr = 구배 절반 ⚠⚠ |
| TCF 과냉각 | +3~6% | 유량오차보다 크나 **계절변동·해석전용** |
| **계절 CW 스윙(한국)** | **여름/겨울 15~25°C** | k_V 0.5→2%(4배)·TCF·진공도 변동 — **느린 대형 바이어스** |

### 14.3 보정값 3등급

| 등급 | 항목 | 판정 |
|:----:|:-----|:-----|
| **A 견고** | 비율 피드포워드(D·P=K·F), 전달지연 **타이밍**, 유량 노이즈 필터 | 신호 ≫ 노이즈. θ는 ±50% 틀려도 0보다 우월(정밀도 불필요). **가치의 대부분** |
| **B 한계** | TCF(3~6%), V_loss(0.5~2%) | 유량오차 동급 + 계절변동 + 해석/모니터 전용 → **"참고 추세"로만, 순간 정밀보정 금지**. V_loss는 **장기 MA**로만 의미 |
| **C 취약** | 제품존 PCT 조성추론 | 조성<0.1°C < (압력 0.5°C/torr + 센서 0.1~0.3°C) → 노이즈 바닥 아래. **analyzer/차온 보조 필수** |

### 14.4 계절 외란(한국 CW) = 느린 바이어스로 처리

여름/겨울 냉각수 스윙은 **크지만 느린(계절·일주기)** 외란 → 피드포워드(분 단위)와 **시간척도 분리**.

- **정밀 모델링 금지** — K·TCF·k_V를 고정상수로 박으면 계절마다 틀림.
- **느린 바이어스 적응/운전원 트림(Bias)** 으로 흡수 (관계식 문서의 "Bias의 필요성"):
  - K·k_V는 **물질수지 장기 MA로 천천히 자동 갱신**.
  - PCT `P_ref`·`dT/dP`는 **계절 재캘리브레이션**, 또는 **차온(ΔT)** 으로 공통모드(압력·계절) 상쇄.
- **빠르고 정밀한 보정(타이밍·비율) ↔ 느리고 큰 외란(계절)** 을 서로 다른 메커니즘으로 분리 처리.

### 14.5 결론 — advisory 아키텍처를 정당화

- 미세 보정(TCF·V_loss·제품존 온도)의 절대 영향력은 실플랜트 오차/계절외란에 **묻혀 작다**.
- 따라서 그것들을 **정밀 제어식이 아니라 "신뢰도 플래그 붙은 추세"로 강등**, 계절외란은 **느린 바이어스 트림**으로 넘긴다.
- 시스템 가치의 대부분은 **견고한 A등급(비율·타이밍·필터)** 에서 나오며, 이는 오차에 강하다.
- advisory(자동쓰기 없음)라 **미세 보정이 애초에 정밀할 필요가 없다** — 운전원이 계절 바이어스를 자연 흡수.
- **설계 반영(§12 엔진)**: 각 출력에 **confidence 등급(A/B/C)** 표기, V_loss·k_V는 **장기 MA**, K·TCF는
  **느린 적응/계절 프로파일**, 제품존 지표는 **analyzer 우선·온도는 차온**.

---

## 부록 A. 정정 요약 (한 줄)

- 설정값은 **F·D·P·B·R_ext 5개 측정 스트림에만** 부여. (§10.3)
- **V_loss·R_int·L/V는 계산 모니터링 태그** — SP 금지. (§10.5~10.6)
- L/V 열역학 정의는 `R/(R+D)`, 본문 `R/(R+P)`는 제품기준 지표로 별도. (§10.5)
- 모든 비례식은 **CLAMP + RATE_LIMIT** 후 인가. (§10.7)
- FEED 변경 시 D·P·B·R SP는 **추출점별 데드타임 θ + 지체 τ로 전달지연** 인가(즉각 연동 금지). F만 운전원 ramp. (§11)
- 전달지연 중에는 **dM/dt≠0** → 물질수지 경보를 **과도 게이트로 보류**(오발 방지). (§11.6)
- 온도로 전달지연 검출·sweet-spot 유지 **가능하나 조건부**: 단일점 생온도 약함 → **PCT/차온+스팀포함 다변수 식별** 필수, 온도유도 θ는 추정치. (§13)
- **진공 0.5°C/torr** = 구배 절반. 보정 3등급(A견고:비율·타이밍·필터 / B한계:TCF·V_loss / C취약:제품존온도). 계절 CW외란은 **느린 바이어스 트림**으로(정밀모델 금지). (§14)
- **인벤토리(레벨)는 D·B를 구동** — F·D·P·B 전부 개루프 명령은 자유도 과지정. **P·R만 commanded, D·B는 level_driven**. (§9.3 D5·D6)
- 본 구현은 **다중 컬럼 공유 엔진** — 컬럼-불가지 연산 블록 + 컬럼별 설정(DB)/상태. (§12.1)
- 본 단계 = **보조지표(Advisory)**: AUTO/MANUAL 무관, **권장 SP를 화면 표시·운전원 수동 인가**, **자동 쓰기 없음**. RSP는 후속 Stage 3. (§12.0·§12.8)
