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

60 KiB
Raw Blame History

측류 추출식 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회 입력, 품질변경 시만 수정)

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(36%), V_loss(0.52%) 유량오차 동급 + 계절변동 + 해석/모니터 전용 → "참고 추세"로만, 순간 정밀보정 금지. 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)