262 lines
11 KiB
Markdown
262 lines
11 KiB
Markdown
# Feedforward Advisory — 과도상태(Transient) 메커니즘
|
||
## 운전원 교육 자료
|
||
|
||
> 대상: C-6111 PGMEA 측류추출 증류탑 FF(Feedforward Advisory) 시스템
|
||
> 버전: 2026-05 Phase I
|
||
|
||
---
|
||
|
||
## 1. 개요
|
||
|
||
FF 시스템은 Feed(공급유량) 변동 시 각 스트림(P/R/D/B)의 **권장 SP(Setpoint)를 실시간 계산**하여 운전원에게 제시합니다. 그러나 Feed나 압력이 불안정할 때는 권장값을 곧바로 신뢰할 수 없습니다. 이때 **과도상태(Transient)** 메커니즘이 작동하여 권장값을 "참고용"으로 전환하고, 안정화될 때까지 기다립니다.
|
||
|
||
### ⚠️ 중요: FF는 Advisory(보조지표)입니다
|
||
|
||
**FF 시스템은 DCS의 실제 Setpoint(SP)를 절대 변경하지 않습니다.** Transient 여부와 관계없이:
|
||
- DCS SP는 운전원이 설정한 값 그대로 유지됨
|
||
- FF는 권장값(Recommended SP)을 화면에 표시만 함
|
||
- 운전원이 권장값을 검토한 후 **직접 DCS에 입력**해야 적용됨
|
||
- Transient 중에는 권장값에 `valid=false`(신뢰도 낮음) 플래그만 추가됨
|
||
|
||
즉, FF가 transient 상태라고 해서 **공정에 실제 변화가 일어나지는 않습니다.** 단지 운전원이 참고할 권장 숫자가 "아직 믿을 만한 상태가 아니다"라는 신호일 뿐입니다.
|
||
|
||
---
|
||
|
||
## 2. Transient 진입 조건
|
||
|
||
Transient는 다음 **3가지 조건** 중 하나라도 만족하면 발동합니다.
|
||
|
||
| 조건 | 감지 방식 | 파라미터 | 기본값 |
|
||
|:----|:---------|:---------|:------|
|
||
| **① FEED 이동** | Feed 유량의 순간변화율(미분)이 임계 초과 | `FeedMoveThreshold` | **5%/분** |
|
||
| **② 압력 불안정** | 압력PV가 필터 추종 범위 이탈 | `PressureBand` | **3.0** |
|
||
| **③ 정착 대기 중** | 위 조건이 해제된 후 SettleTimer가 0이 아님 | `SettleSec` | **1800초(30분)** |
|
||
|
||
### 2.1 FEED 이동 감지 — 상세
|
||
|
||
```
|
||
FeedFilter: 1차 저역통과필터 (τ=300초, 시정수 5분)
|
||
목적: 공급유량의 순간 노이즈 제거, 실질적인 변화만 포착
|
||
|
||
FeedDeriv: 필터 출력의 미분값 (틱당 변화량 → 분당 변화율)
|
||
moving = |dF| × 60 > FeedMoveThreshold (기본 5%/분)
|
||
```
|
||
|
||
예:
|
||
- Feed가 820→1000으로 180만큼 변화
|
||
- FeedFilter가 300초 시정수로 부드럽게 추종
|
||
- 1차 틱(2초)에서 dF ≈ (821.2-820)/2 = 0.6/sec = 36/min
|
||
- **36 > 5 → moving = true**
|
||
|
||
### 2.2 압력 불안정 감지 — 상세
|
||
|
||
```
|
||
PressFilter: 1차 저역통과필터 (τ=60초)
|
||
목적: 압력 신호의 고주파 진동 제거
|
||
|
||
pUnstable = |압력PV - PressFilter출력| > PressureBand (기본 3.0)
|
||
```
|
||
|
||
의미: 필터가 추종 가능한 범위를 실제 압력이 벗어나면 "불안정"으로 판단.
|
||
|
||
### 2.3 정착 대기(SettleTimer) — 상세
|
||
|
||
```
|
||
if (moving || pUnstable)
|
||
SettleTimer = SettleSec (1800초) // ← 리셋
|
||
else
|
||
SettleTimer = max(0, SettleTimer - ScanSec)
|
||
```
|
||
|
||
Transient 조건이 해제되어도 **SettleTimer가 0이 될 때까지(최대 30분) transient 유지.**
|
||
|
||
---
|
||
|
||
## 3. Transient 상태에서의 동작
|
||
|
||
### 3.1 UI 표시
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────┐
|
||
│ 과도상태: 압력 불안정 — 권장값 정착 대기 │
|
||
│ │
|
||
│ 스트림 │ PV │ 권장 SP │ Δ │ 신뢰 │
|
||
│ P │ 780.2 │ 779.0 │ -1.2 │ A (흐림) │
|
||
│ R │ 620.0 │ 623.2 │ +3.2 │ A (흐림) │
|
||
│ D │ 16.5 │ 16.4 │ -0.1 │ B (흐림) │
|
||
│ B │ 24.8 │ 24.6 │ -0.2 │ B (흐림) │
|
||
│ │
|
||
│ 물질수지: 정착 대기 (1795s) │
|
||
└─────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
- 모든 스트림의 권장값이 **valid = false** (회색/흐리게 표시, `.ff-stale`)
|
||
- 권장값 계산은 **내부적으로 계속 진행**되지만, 운전원 화면에서는 "참고용" 표시
|
||
- 물질수지(V_loss, 수율) 계산 **중단**
|
||
- 우측 하단에 정착 대기 시간 카운트다운
|
||
|
||
### 3.2 Transient 중 Recommended SP는 어떻게 되나?
|
||
|
||
**Recommended SP는 계속 업데이트됩니다. 이전값에 고정되지 않습니다.**
|
||
|
||
```
|
||
예: Feed 820→1000 step, P stream 기준
|
||
|
||
t=0min Feed step, transient 시작
|
||
P_rec = 779 (deadtime 중, 이전 Feed≈820 기준)
|
||
t=1min P_rec = 781 (deadtime 끝나며 새 Feed 반영 시작)
|
||
t=5min P_rec = 799 (Lag τ=900s로 서서히 상승)
|
||
t=15min P_rec = 861
|
||
t=30min P_rec = 916 (transient 해제, valid=true 전환)
|
||
t=45min P_rec = 950 (정상상태 도달)
|
||
```
|
||
|
||
계산 자체는 멈추지 않습니다:
|
||
- FeedFilter, PressFilter, DeadTimeBuffer, Lag, RateLimiter 모두 **정상 작동**
|
||
- Recommended SP도 매 틱(2초)마다 **계속 재계산되어 갱신됨**
|
||
- **단, `valid=false` 플래그만 붙어서 화면에 흐리게 출력**
|
||
|
||
즉, transient가 풀리는 순간 **이미 최신 Feed를 반영한 권장값이 valid=true로 전환**됩니다.
|
||
|
||
---
|
||
|
||
## 4. Transient 종료 후 — 정상 상태 전환
|
||
|
||
### 조건
|
||
```
|
||
moving = false AND pUnstable = false AND SettleTimer = 0
|
||
```
|
||
|
||
### 전환 효과
|
||
1. 모든 스트림 `valid = true` — 권장값 본격 표시
|
||
2. 물질수지 계산 재개:
|
||
```
|
||
V_loss = FeedFilter출력 - (D_PV + P_PV + B_PV)
|
||
수율 = 100 × P_PV / FeedFilter출력
|
||
```
|
||
3. MassBalanceState 평가:
|
||
- `|V_loss| > 0.03 × Feed` → **"물질수지 불일치(계측 점검)"**
|
||
- `V_loss < 0` → **"음의 손실(스팬 오류 의심)"**
|
||
- else → **"정상"**
|
||
|
||
### 주의: Transient 해제 ≠ 정상상태 도달
|
||
|
||
Transient가 풀려도 P stream의 Lag(τ=900초=15분)가 아직 정착 중일 수 있음:
|
||
|
||
```
|
||
예) Feed 820→1000 변경 시:
|
||
t=0분 Feed step, transient 시작
|
||
t=30분 SettleTimer=0, transient 해제
|
||
→ P 권장은 아직 950(최종값)에 도달 전 (약 910~920)
|
||
t=45분 P 권장 95% 도달 (3τ)
|
||
```
|
||
|
||
운전원은 transient 해제 후에도 **권장값이 서서히 움직이는 것**을 정상으로 이해해야 함.
|
||
|
||
---
|
||
|
||
## 5. 스트림별 동작 차이
|
||
|
||
| 역할 | Deadtime | Lag | Rate Limit | Transient 영향 |
|
||
|:----|:---------|:----|:-----------|:---------------|
|
||
| **P** (Commanded) | θ=60초 | τ=900초 | 30/min | valid=false만 적용, 계산은 계속 |
|
||
| **R** (Reflux) | P 경유(상속) | P 경유 | 30/min | P와 동일 |
|
||
| **D** (LevelDriven) | 없음 | 없음 | 없음 | `K×Feed` 즉시 반영, valid=false |
|
||
| **B** (LevelDriven) | 없음 | 없음 | 없음 | `K×Feed` 즉시 반영, valid=false |
|
||
|
||
**LevelDriven**은 단순 비례식:
|
||
```
|
||
D_rec = 0.02 × FeedFilter출력
|
||
B_rec = 0.03 × FeedFilter출력
|
||
```
|
||
deadtime/lag이 없으므로 Feed 변동에 즉시 반응하지만, 어디까지나 **기대치(Feedforward bias)**입니다. 실제 SP는 레벨 제어기(LIC)가 결정합니다.
|
||
|
||
---
|
||
|
||
## 6. 설정 파라미터 튜닝 가이드
|
||
|
||
| 파라미터 | 현재값 | 느슨하게 | 엄격하게 | 영향 |
|
||
|:---------|:-------|:---------|:---------|:-----|
|
||
| `FeedMoveThreshold` | 5/분 | ↑ 증가 | ↓ 감소 | 크면 Feed 변동 둔감, 작으면 민감 |
|
||
| `PressureBand` | 3.0 | ↑ 증가 | ↓ 감소 | 크면 압력 둔감, 작으면 민감 |
|
||
| `SettleSec` | 1800초 | ↓ 감소 | ↑ 증가 | 작으면 빨리 해제, 크면 오래 대기 |
|
||
| `FeedFilterTauSec` | 300초 | ↓ 감소 | ↑ 증가 | 작으면 빠른 반응, 크면 늦은 반응 |
|
||
| `PressFilterTauSec` | 60초 | ↓ 감소 | ↑ 증가 | 작으면 압력 빠른 추종, 크면 늦음 |
|
||
|
||
### 튜닝 예시
|
||
|
||
**"transient가 너무 자주 걸려요" →**
|
||
- `FeedMoveThreshold` 증가 (예: 5→8) — 미세 Feed 변동 무시
|
||
- `PressureBand` 증가 (예: 3→5) — 압력 진동 허용폭 확대
|
||
- 단, 너무 느슨하면 실제 불안정 상황을 놓칠 수 있음
|
||
|
||
**"transient가 너무 오래 가요" →**
|
||
- `SettleSec` 감소 (예: 1800→900) — 정착 대기시간 단축
|
||
- 단, 30분은 의도된 값 — 압력/Feed가 안정된 후에도 일정 시간 관찰하도록 설계
|
||
|
||
---
|
||
|
||
## 7. 실제 운전 시나리오 예시
|
||
|
||
### 시나리오 1: Feed 정상 증가 (의도적)
|
||
|
||
```
|
||
운전 조작: FICQ-6101 SP를 820→1000으로 변경
|
||
FF 반응:
|
||
1. FeedDeriv 36/min → transient 시작
|
||
2. 30분간 valid=false (흐림 표시)
|
||
3. 30분 후 valid=true 전환
|
||
- P 권장 ≈ 910 (아직 950 도달 전, Lag 진행 중)
|
||
- D 권장 ≈ 20 (0.02 × 1000)
|
||
- B 권장 ≈ 30 (0.03 × 1000)
|
||
4. 약 45분 후 P 권장 950에 정착
|
||
```
|
||
|
||
운전원 행동:
|
||
- transient 중에는 권장값을 **참고**만 하고, 자신의 판단으로 SP 조정
|
||
- transient 해제 후 권장값이 합리적이면 추종
|
||
- P 권장이 최종값(950)에 도달하는 건 **15분 더 걸림** 인지
|
||
|
||
### 시나리오 2: 압력 진동 (진공펌프 기동)
|
||
|
||
```
|
||
현상: PICA-6111 압력이 3torr 이상 진동
|
||
FF 반응:
|
||
1. pUnstable = true → transient 시작
|
||
2. SettleTimer 1800초 리셋
|
||
3. 압력 안정 후에도 30분간 transient 유지
|
||
```
|
||
|
||
운전원 행동:
|
||
- 진공계 안정화 확인
|
||
- transient가 불편하면 `SettleSec` 또는 `PressureBand` 조정 검토
|
||
|
||
### 시나리오 3: Feed 미세 변동 (transient 미진입)
|
||
|
||
```
|
||
Feed 820→830 (+10, 약 1.2% 변화)
|
||
FF 반응:
|
||
1. FeedDeriv ≈ 2/min → 5 이하 → moving=false
|
||
2. Transient 미진입 → 권장값 계속 유효
|
||
3. P 권장: 0.95×830 ≈ 788.5 (lag/rate 적용)
|
||
```
|
||
|
||
---
|
||
|
||
## 8. FAQ
|
||
|
||
**Q: transient 중인데 권장값이 보이긴 하는데 흐려요. 왜죠?**
|
||
A: 계산은 계속되지만 운전원이 **아직 신뢰할 단계가 아니다**는 의미입니다. 압력이나 Feed가 안정된 후 30분이 지나면 선명하게 전환됩니다.
|
||
|
||
**Q: transient를 강제로 해제할 수 있나요?**
|
||
A: 현재 UI에는 강제 해제 기능이 없습니다. 설정에서 `SettleSec`을 0으로 줄이면 transient 시간을 없앨 수 있습니다. 단, 권장값의 신뢰성이 떨어질 수 있습니다.
|
||
|
||
**Q: transient 중에도 권장값을 SP에 반영해야 하나요?**
|
||
A: **아니요.** transient 중 권장값은 "참고용"입니다. 운전원의 경험과 판단으로 SP를 결정하세요. transient 해제 후 권장값을 검토하고 반영하세요.
|
||
|
||
**Q: P stream 권장값이 왜 이렇게 느리게 변하나요?**
|
||
A: Lag 시정수 τ=900초(15분) 때문입니다. Feed 변화가 Deadtime(60초)을 거쳐 Lag에 들어가면 15분에 걸쳐 서서히 정착합니다. 이는 공정의 실제 응답 특성을 모델링한 것입니다.
|
||
|
||
**Q: LevelDriven(D/B)은 왜 deadtime/lag이 없나요?**
|
||
A: D/B는 레벨 제어기(LIC)가 실제 SP를 결정합니다. FF가 계산하는 값은 **기대치(bias)**일 뿐입니다. 실제 레벨 제어 루프가 deadtime/lag을 처리하므로, FF 단에서는 즉시 반영해도 무방합니다.
|