Files
ExperionCrawler/docs/측류추출식-통합유량설정공식.md

1169 lines
60 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 측류 추출식 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)