60 KiB
측류 추출식 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 설정 순서
- P (FICQ-6118) — 제품 추출량을 목표 생산량에 맞춰 설정
- F (FICQ-6101) — F = P / 0.95로 원료량 설정
- D (FICQ-6114) — D = 0.02/0.95 × P로 경비물 설정
- B (FICQ-6116) — B = 0.03/0.95 × P로 하부 설정
- R (FICQ-6113) — R = R_f × P (R_f = 0.5~1.2 범위)로 환류 설정
- 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)
설계 원칙
- 측정 가능한 스트림(F·D·P·B·R_ext)만 비례제어 설정값으로 산출한다.
- V_loss·R_int·L/V는 계측·제어 대상이 아니다 → "계산 모니터링 태그"로만 표시(설정값 금지).
- 비례식은 하한·상한 클램프와 rate limit를 반드시 동반한다(공식만 적용 금지).
- 마스터 변수는 운전 모드로 선택: 원료 주도(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회 입력, 품질변경 시만 수정)
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]
상태 변수 (블록 내부 보존)
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
헬퍼
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) 본체
# ---- 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 블록으로 대체 가능)
# --- 초기화 (스트림별) ---
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 블록을 아래로 교체
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 오경보.
따라서 과도 게이트를 둔다:
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, 의사코드)
# 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 |
유량오차 동급 + 계절변동 + 해석/모니터 전용 → "참고 추세"로만, 순간 정밀보정 금지. 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)