375 lines
7.8 KiB
Markdown
375 lines
7.8 KiB
Markdown
|
|
## Estates
|
|
***
|
|
|
|
```plantuml
|
|
@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
|
|
```
|
|
|
|
## Calculations
|
|
***
|
|
```plantuml
|
|
@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
|
|
|
|
```
|
|
|
|
## Components
|
|
***
|
|
|
|
```plantuml
|
|
@startuml BlenderSystemComponents
|
|
|
|
skinparam component {
|
|
BackgroundColor LightCyan
|
|
BorderColor Black
|
|
}
|
|
|
|
package "Blender System" {
|
|
[Syrup Flow Control] as SyrupControl
|
|
[Water Flow Control] as WaterControl
|
|
[CO2 Injection] as CO2Control
|
|
[Second Gas Injection] as Gas2Control
|
|
[Deaeration System] as DeaerSystem
|
|
[Temperature Control] as TempControl
|
|
[Tank Level Control] as LevelControl
|
|
[Pressure Control] as PressControl
|
|
}
|
|
|
|
package "BlenderPID_PIDSPCalc" as PIDCalc {
|
|
[Ratio Calculator] as RatioCalc
|
|
[Water SP Calculator] as WaterSPCalc
|
|
[Syrup SP Calculator] as SyrupSPCalc
|
|
[CO2 SP Calculator] as CO2SPCalc
|
|
[Level SP Calculator] as LevelSPCalc
|
|
[Temperature SP Calculator] as TempSPCalc
|
|
[Critical Condition Detection] as CritDetect
|
|
}
|
|
|
|
package "Input Parameters" {
|
|
[Recipe Parameters] as Recipe
|
|
[Production Settings] as ProdSettings
|
|
[System Constants] as Constants
|
|
}
|
|
|
|
package "PID Controllers" {
|
|
[RMM301 PID] as WaterPID
|
|
[RMP302 PID] as SyrupPID
|
|
[RVM301 PID] as PressurePID
|
|
[RVN304 PID] as DeaerPID
|
|
}
|
|
|
|
Recipe --> RatioCalc
|
|
ProdSettings --> WaterSPCalc
|
|
Constants --> RatioCalc
|
|
|
|
RatioCalc --> WaterSPCalc
|
|
RatioCalc --> SyrupSPCalc
|
|
RatioCalc --> CO2SPCalc
|
|
|
|
WaterSPCalc --> WaterPID
|
|
SyrupSPCalc --> SyrupPID
|
|
CO2SPCalc --> CO2Control
|
|
LevelSPCalc --> LevelControl
|
|
TempSPCalc --> TempControl
|
|
|
|
WaterPID --> WaterControl
|
|
SyrupPID --> SyrupControl
|
|
PressurePID --> PressControl
|
|
DeaerPID --> DeaerSystem
|
|
|
|
WaterControl --> CritDetect
|
|
SyrupControl --> CritDetect
|
|
CritDetect --> SyrupSPCalc : Correction feedback
|
|
|
|
@enduml
|
|
```
|
|
|
|
|
|
### Sequence
|
|
***
|
|
|
|
```plantuml
|
|
@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
|
|
```
|
|
|
|
|
|
## Clases
|
|
***
|
|
|
|
```plantuml
|
|
@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
|
|
``` |