Obsidean_VM/04-SIDEL/00 - MASTER/MIXER/Documentacion/FB1751 - BlenderPID_PIDSPCa...

16 KiB


%% Obsidean Requirements obsidian://show-plugin?id=obsidian-plantuml obsidian://show-plugin?id=obsidian-mindmap-nextgen %%

Overview

BlenderPID_PIDSPCalc is a function block that calculates setpoints for PID controllers in a beverage blending system. It handles calculations related to syrup and water flows, CO2 injection, tank levels, and temperature control in beverage production.

Temporary Variables

  • ValBinTmr131: WORD variable for timer
  • ValBcdTmr131: S5TIME variable for timer

Main Variables

  • mCriticalBlending: Critical blending state (BOOL)
  • Timer conversion variables: TimerConvDINT, TimerConvTIME, TimerConvS5TIME
  • Slew rate variables: mTargetRatioSlewOut, mTargetProdSlwd, mTargetFillerProdSlwd, etc.
  • mBevBrixDelta: Brix delta for beverage
@startuml BlenderClassDiagram

skinparam class {
  BackgroundColor LightCyan
  BorderColor Black
}

class BlenderPID_PIDSPCalc {
  +Execute()
}

class RecipeParameters {
  +ProductBrix: REAL
  +ProdBrixOffset: REAL
  +SyrupBrix: REAL
  +Ratio: REAL
  +CO2Vols: REAL
  +CO2Fact: REAL
  +GAS2Vols: REAL
  +SP_ProdTemp: REAL
  +ProdTankPress: REAL
}

class SystemVariables {
  +gActualSyrupPerc: REAL
  +gActualWaterPerc: REAL
  +gActual_RatioM: REAL
  +gActual_Prod_SP: REAL
  +gActual_Prod_Flow: REAL
  +gSP_H2O: REAL
  +gSP_SYR: REAL
  +gSP_CO2: REAL
  +gSP_GAS2: REAL
  +gCriticalBlending: BOOL
}

class PIDControllers {
  +RMM301: PID
  +RMP302: PID
  +RVM301: PID
  +RVN304: PID
}

class OperationModes {
  +gBlenderProdMode: BOOL
  +gBlenderRinseMode: BOOL
  +gBlenderCIPMode: BOOL
  +gBlenderStableFlow: BOOL
  +First_Production: BOOL
}

class TankSetpoints {
  +gSP_SYR_Level: REAL
  +gSP_DEAIR_Level: REAL
  +gSP_STORAGE_Level: REAL
  +gSP_H2O_Temperature: REAL
  +gSP_Prod_Temperature: REAL
}

BlenderPID_PIDSPCalc -- RecipeParameters
BlenderPID_PIDSPCalc -- SystemVariables
BlenderPID_PIDSPCalc -- PIDControllers
BlenderPID_PIDSPCalc -- OperationModes
BlenderPID_PIDSPCalc -- TankSetpoints

@enduml

Main Calculations


@startuml BlenderPIDCalculationFlow

skinparam activity {
  BackgroundColor<<Recipe>> PaleGreen
  BackgroundColor<<Calculation>> LightBlue
  BackgroundColor<<Decision>> LightYellow
  BackgroundColor<<Output>> Pink
  BorderColor Black
}

start

:Initialize variables;

partition "Recipe Parameters" {
  :Determine beverage type;
  if (Sugar beverage?) then (yes)
    :Calculate syrup percentage based on Brix;
    note right: gActualSyrupPerc = (ProductBrix + ProdBrixOffset) / gActualSyrupBrix
  else (no)
    :Calculate syrup percentage based on ratio;
    note right: gActualSyrupPerc = 1 / (Ratio + 1)
  endif
  
  :Calculate water percentage;
  note right: gActualWaterPerc = 1 - gActualSyrupPerc
  
  :Calculate mixing ratio;
  note right: gActualRatioM = gActualWaterPerc / gActualSyrupPerc
}

partition "Flow Setpoint Calculations" {
  if (Production mode?) then (yes)
    :Calculate CO2 equilibrium pressure;
    
    :Set tank pressure setpoint based on mode;
    
    :Calculate target production rate;
    
    :Apply slew rate limiting;
    
    :Calculate water flow setpoint;
    note right: gSP_H2O = gActual_Prod_SP / (gActualSP_RatioVol + 1.0) * gActualSP_RatioVol
    
    :Check for critical blending conditions;
    
    :Calculate syrup flow setpoint;
    note right: gSP_SYR = (gSyrSPRef + gSyrSPTemp) * gActualSyrupDens
    
    :Calculate CO2 setpoint;
    
    if (Second gas injection enabled?) then (yes)
      :Calculate second gas setpoint;
    else (no)
      :Set second gas setpoint to zero;
    endif
  else (no)
    :Set all flow setpoints to zero;
  endif
}

partition "Tank Level Controls" {
  :Calculate syrup tank level setpoint;
  
  :Calculate deaeration tank level setpoint;
  
  :Calculate storage tank level setpoint;
}

partition "Temperature Controls" {
  :Calculate water and product temperature setpoints;
}

stop

@enduml

1. Brix Delta Calculation

For systems with Brix meter:

mBevBrixDelta = \frac{ProdMeterHighBrix - ProductBrix}{2.0}

For systems without Brix meter:

mBevBrixDelta = 0.06

2. Syrup Percentage Calculation

For sugar beverages during first production:

gActualSyrupPerc = \frac{ProductBrix + ProdBrixOffset + gFirstProdExtraBrix}{gActualSyrupBrix}

For sugar beverages in normal production:

gActualSyrupPerc = \frac{ProductBrix + ProdBrixOffset + gBrixTrackingCorr}{gActualSyrupBrix}

For diet beverages during first production:

gActualSyrupPerc = \frac{1}{Ratio + 1} + gFirstProdDietExtraSyr

For diet beverages in normal production:

gActualSyrupPerc = \frac{1}{Ratio + 1}

3. Water Percentage Calculation

gActualWaterPerc = 1 - gActualSyrupPerc

4. Mixing Ratio Calculation

For syrup with density > 0.99 and non-sugar beverage:

gActualRatioM = \frac{gActualWaterPerc}{(gActualSyrupPerc \times gActualSyrupDens)}

For other cases:

gActualRatioM = \frac{gActualWaterPerc}{gActualSyrupPerc}

5. Volumetric Ratio Calculation

gActualSPRatioVol = \frac{gActualRatioM \times gActualSyrupDens}{gH2ODensity}

6. CO2 Equilibrium Pressure Calculation

gCO2EqPressure = CO2EqPress(iCO2Vol, iTemp) + 0.3

Where:

  • iCO2Vol = CO2Vols \times gFirstProdExtraCO2Fact \times CO2Fact
  • iTemp = SPProdTemp

7. Water Flow Setpoint Calculation

gSPH2O = \frac{gActualProdSP}{(gActualSPRatioVol + 1.0)} \times gActualSPRatioVol

8. Syrup Flow Setpoint Calculation

gSPSYR = (gSyrSPRef + gSyrSPTemp) \times gActualSyrupDens

Where:

  • gSyrSPRef = \frac{gActualProdSP}{(gActualSPRatioVol + 1.0)} or \frac{gH2OFlowMeas}{gActualSPRatioVol}
  • gSyrSPTemp = LIMIT(-1.0 \times gSyrSPRef \times gSyrupSPRecFact, gBlendError \times gKRecBlendError, gSyrSPRef \times gSyrupSPRecFact)

9. CO2 Setpoint Calculation

gActualSPCO2 = (CO2Vols - gDeairCO2Comp + gCO2TrackingCorr) \times CO2Fact \times (1 - \frac{ProductBrix}{100.0})
gSPCO2 = gCO2SPRef + gCO2SPTemp

Where:

  • gCO2SPRef = gActualSPCO2 \times gActualProdFlow
  • gCO2SPTemp = LIMIT(-1.0 \times gCO2SPRef \times gCO2SPRecFact, gCO2SPTemp2, gCO2SPRef \times gCO2SPRecFact)
  • gCO2SPTemp2 = gCarboCO2Error \times gKRecCarboCO2Error

Tank Level Control

Syrup Tank Level

The syrup tank level setpoint (gSP_SYR_Level) is calculated based on operation mode:

  • In CIP mode: CIPTP301MinLevel
  • During first production: gTP301FirstProdLvl with ramp to gTP301ProdLvl
  • During normal production: gTP301ProdLvl

Deaeration Tank Level

The deaeration tank level setpoint (gSP_DEAIR_Level) is calculated:

  • In CIP mode: CIPTN301MinLevel
  • During first production: ramp to gTN301ProdLvl
  • During normal production: gTN301ProdLvl

Temperature Control

Temperature is controlled based on cooling mode:

For product chiller: $gSPH2OTemperature = SPProdTemp$

For water chiller: $gSPH2OTemperature = SPProdTemp - \left(\frac{gCpSyrup \times (gMeterSyrTemp - SPProdTemp) \times gActualSyrupDens}{gCpH2O}\right)$

Critical Blending Detection

Blending is considered critical when: |gBlendError| > 0.5 \text{ AND } \left|\frac{RMM301.SP - RMM301.PV}{RMM301.SP}\right| > 0.2$$

And when: $gActualProdSP > (0.6 \times gBlenderNomSpeed)$

Additional Features

  • The block implements slew rate control for various setpoints to prevent abrupt changes
  • Includes CO2 compensation based on temperature
  • Handles different recipes (sugar, diet, water)
  • Controls multiple valves and pumps to maintain precise ratios

Process Modes

The function block handles multiple operating modes:

  1. Production mode
  2. CIP (Clean-In-Place) mode
  3. Rinse mode
  4. First production mode
  5. Water line mode

Each mode has specific setpoints and control parameters for optimal process control.

@startuml BlenderOperationalStates
 
skinparam state {
  BackgroundColor<<Production>> LightGreen 
  BackgroundColor<<CIP>> LightBlue
  BackgroundColor<<Rinse>> LightYellow
  BackgroundColor<<Startup>> LightPink
} 
 
[*] --> Idle

state Idle

state "Production Mode" as Production <<Production>> {
  state "First Production" as FirstProd
  state "Normal Production" as NormalProd
  state "Production Runout" as RunOut
  
  FirstProd --> NormalProd : First production\ncompleted
  NormalProd --> RunOut : End production\nrequested
  RunOut --> FirstProd : New recipe
}

state "CIP Mode" as CIP <<CIP>> {
  state "Tank Cleaning" as TankCIP
  state "Line Cleaning" as LineCIP
  TankCIP --> LineCIP
}

state "Rinse Mode" as Rinse <<Rinse>> {
  state "Cold Rinse" as ColdRinse
  state "Hot Rinse" as HotRinse
  ColdRinse --> HotRinse
}

state "Startup Sequence" as Startup <<Startup>> {
  state "Deaerator Startup" as DeaerStartup
  state "Syrup Startup" as SyrupStartup
  state "Blend/Fill Startup" as BlendStartup
  
  DeaerStartup --> SyrupStartup
  SyrupStartup --> BlendStartup
}

Idle --> Startup : Start system
Startup --> FirstProd : Startup complete
Production --> Rinse : Production complete
Rinse --> CIP : Rinse complete
CIP --> Idle : CIP complete
Production --> CIP : Emergency CIP
Rinse --> Idle : Emergency stop

@enduml

Oxygen and CO2 Calculations

The block calculates oxygen content in water, syrup, and product:

gProductO2 = \frac{gActualRatioM \times gDeairWaterO2 + gSyrupO2}{gActualRatioM + 1}

It also calculates CO2 solubility and volume based on temperature and pressure conditions.


Flowchart:


flowchart TD
    Start([Start]) --> A
    A[Initialize variables] --> B
    
    B{"Has Brix<br>meter?"} -->|Yes| C1["Calculate mBevBrixDelta<br>based on measurements"]
    B -->|No| C2["Use default value<br>mBevBrixDelta = 0.06"]
    
    C1 --> D
    C2 --> D
    
    D{"Is sugar<br>beverage?"} -->|Yes| E1
    D -->|No| E2
    
    E1{"First<br>production?"} -->|Yes| F1["Calculate gActualSyrupPerc<br>with extra Brix"]
    E1 -->|No| F2["Calculate gActualSyrupPerc<br>with Brix compensation"]
    
    E2{"First<br>production?"} -->|Yes| F3["Calculate gActualSyrupPerc<br>with extra syrup"]
    E2 -->|No| F4["Calculate gActualSyrupPerc<br>based on ratio"]
    
    F1 --> G
    F2 --> G
    F3 --> G
    F4 --> G
    
    G{"Water<br>recipe?"} -->|Yes| H1["Adjust percentages<br>for pure water"]
    G -->|No| H2["Calculate gActualWaterPerc"]
    
    H1 --> I
    H2 --> I
    
    I["Calculate mixing ratios"] --> J["Calculate gActualSP_RatioVol"]
    
    J --> K["Calculate maximum<br>slew rates"]
    
    K --> L{"Production<br>mode?"} -->|Yes| M1["Calculate CO2<br>equilibrium pressure"]
    L -->|No| M2["Set production<br>setpoint to zero"]
    
    M1 --> N["Set tank<br>pressure setpoints"]
    N --> O["Calculate current<br>production setpoint"]
    O --> P["Apply slew<br>rate limits"]
    M2 --> Q
    P --> Q
    
    Q["Calculate water<br>flow setpoint"] --> R["Evaluate critical<br>blending condition"]
    
    R --> S["Calculate syrup<br>flow setpoint"]
    
    S --> T["Calculate CO2<br>temperature compensation"]
    
    T --> U["Calculate O2<br>content in product"]
    
    U --> V["Calculate CO2<br>injection setpoint"]
    
    V --> W{"Second gas<br>injection?"} -->|Yes| X1["Calculate second<br>gas setpoint"]
    W -->|No| X2["Second gas<br>setpoint = 0"]
    
    X1 --> Y
    X2 --> Y
    
    Y["Calculate tank<br>level setpoints"]
    
    Y --> Z["Calculate temperature<br>setpoints"]
    
    Z --> End([End])

Sequence


@startuml BlenderSequence

skinparam sequence {
  LifeLineBackgroundColor LightYellow
  ParticipantBackgroundColor LightCyan
}

participant "BlenderPID_PIDSPCalc" as Calc
participant "Water Flow Controller" as Water
participant "Syrup Flow Controller" as Syrup
participant "CO2 Controller" as CO2
participant "Tank Level Controller" as Level
participant "Temperature Controller" as Temp

activate Calc

== Startup Phase ==

Calc -> Level : Set deaerator tank level setpoint
activate Level
Level -> Calc : Level feedback
deactivate Level

Calc -> Temp : Set target water temperature
activate Temp
Temp -> Calc : Temperature feedback
deactivate Temp

== First Production Phase ==

Calc -> Water : Set initial water flow
activate Water
Water -> Calc : Flow measurement
deactivate Water

Calc -> Syrup : Set initial syrup flow (with extra syrup)
activate Syrup
Syrup -> Calc : Flow measurement
deactivate Syrup

Calc -> CO2 : Set CO2 injection (with extra CO2)
activate CO2
CO2 -> Calc : CO2 measurement
deactivate CO2

== Normal Production Phase ==

loop While in production mode
  Calc -> Water : Adjust water flow setpoint
  activate Water
  Water -> Calc : Flow measurement
  deactivate Water
  
  Calc -> Syrup : Adjust syrup flow setpoint
  activate Syrup
  Syrup -> Calc : Flow measurement
  
  alt Critical blending detected
    Calc -> Syrup : Apply correction factor
  end
  deactivate Syrup
  
  Calc -> CO2 : Adjust CO2 setpoint
  activate CO2
  CO2 -> Calc : CO2 measurement
  deactivate CO2
  
  Calc -> Level : Monitor and maintain target levels
  activate Level
  Level -> Calc : Level feedback
  deactivate Level
end

== Runout Phase ==

Calc -> Water : Ramp down water flow
Calc -> Syrup : Ramp down syrup flow
Calc -> CO2 : Reduce CO2 injection
Calc -> Level : Adjust tank levels for end of production

deactivate Calc

@enduml
---
markmap:
  height: 860
  highlight: false
---
# BlenderPID_PIDSPCalc

## Initialization
- Initialize variables
- Set up slew rate limits
- Configure timer variables

## Beverage Type Detection
### Sugar Beverage
- Calculate syrup percentage based on Brix
#### First Production Mode
- Formula: $gActualSyrupPerc = \frac{ProductBrix + ProdBrixOffset + gFirstProdExtraBrix}{gActualSyrupBrix}$
- Add extra Brix for first production
#### Normal Production Mode
- Formula: $gActualSyrupPerc = \frac{ProductBrix + ProdBrixOffset + gBrixTrackingCorr}{gActualSyrupBrix}$
- Apply Brix tracking correction

### Diet Beverage
- Calculate syrup percentage based on ratio
#### First Production Mode
- Formula: $gActualSyrupPerc = \frac{1}{Ratio + 1} + gFirstProdDietExtraSyr$
- Add extra syrup (1.2% more)
#### Normal Production Mode
- Formula: $gActualSyrupPerc = \frac{1}{Ratio + 1}$

### Water Recipe
- Set water percentage to 100%
- Set syrup percentage to 0%

## Ratio Calculations
- Water percentage: $gActualWaterPerc = 1 - gActualSyrupPerc$
- Mixing ratio: $gActualRatioM = \frac{gActualWaterPerc}{gActualSyrupPerc}$
- Volumetric ratio: $gActualSPRatioVol = \frac{gActualRatioM \times gActualSyrupDens}{gH2ODensity}$

## Production Mode Operations
### CO2 Equilibrium Pressure Calculation
- Calculate pressure based on CO2 volumes
- Add safety margin (0.3 bar)
- Set tank pressure setpoints

### Production Setpoint Management
- Apply production speed limits
- Handle first production special conditions
- Apply slew rate limiting for smooth changes

### Water Flow Control
- Formula: $gSPH2O = \frac{gActualProdSP}{gActualSPRatioVol + 1.0} \times gActualSPRatioVol$
- Handle water-only recipes

### Critical Blending Detection
- Monitor blending error magnitude
- Monitor flow deviation percentage
- Enable tracking mode if critical

### Syrup Flow Control
- Track water flow in critical conditions
- Calculate reference setpoint
- Apply blend error correction
- Formula: $gSPSYR = (gSyrSPRef + gSyrSPTemp) \times gActualSyrupDens$

## CO2 and Gas Control
### CO2 Temperature Compensation
- Calculate temperature-based compensation
- Account for deaeration effect

### Oxygen Content Calculation
- Calculate water O2 content
- Calculate syrup O2 content
- Calculate product O2 content: $gProductO2 = \frac{gActualRatioM \times gDeairWaterO2 + gSyrupO2}{gActualRatioM + 1}$

### CO2 Injection Control
- Calculate CO2 volumes setpoint
- Apply corrections based on flow
- Formula: $gSPCO2 = gCO2SPRef + gCO2SPTemp$
- First production: $gActualSPCO2 = (CO2Vols - gDeairCO2Comp) \times gFirstProdExtraCO2Fact \times CO2Fact \times (1 - \frac{ProductBrix}{100.0})$

### Secondary Gas Injection
- Calculate second gas volumes if enabled
- Formula: $gActualSPGAS2 = GAS2Vols \times GAS2Fact \times (1 - \frac{ProductBrix}{100.0})$
- Set to zero if disabled

## Tank Level Control
### Syrup Tank
- Set level based on operation mode
- Use slew limiting for transitions
- Handle CIP mode conditions

### Deaeration Tank
- Set level based on operation mode
- Handle startup conditions
- Control deaeration effectiveness

### Storage Tank
- Set level based on target level
- Apply slew rate limiting

## Temperature Control
### Product Chiller Mode
- Set water and product temperature equal
- Match recipe temperature setpoint

### Water Chiller Mode
- Compensate for syrup temperature
- Formula: $gSPH2OTemperature = SPProdTemp - \frac{gCpSyrup \times (gMeterSyrTemp - SPProdTemp) \times gActualSyrupDens}{gCpH2O}$

### CIP Mode
- Set appropriate temperature for cleaning