————————————————————————————————————————————————————————————————
At Praters, we are currently experiencing issues with our kettle systems. We operate six kettles that are each attempting to run product as quickly as possible while minimizing burn-on. The ideal scenario is for these kettles to heat product with little to no residue left behind, allowing operators to reload new product with minimal downtime. However, when burn-on occurs, it requires a labor-intensive cleaning process, delaying production and increasing waste — not just in labor, but also in opportunity cost from lost batches and idle equipment.
Cheese is a particularly delicate product to run through kettles. It’s highly sensitive to temperature changes and prone to scorching if not handled with precision. Many factories struggle to find a balance between speed (time to temp) and product integrity, especially when equipment is aging or inconsistent.
In our facility, the issue is compounded by several factors:
Equipment Variability: Each of the six kettles has a different setup in terms of age, design, and automation capabilities. This inconsistency leads to unpredictable performance across kettles.
Controls & Designs: The kettles are using either newer controls that we are still learning from or have outdated controls that don’t allow for precise ramping of temperature. This results in either underheating (slowing production) or overheating (causing burn-on).
Improper Steam Management: In some cases, steam is introduced too aggressively or too late in the cycle. Poor modulation or lack of feedback loops means temperatures can overshoot, creating hot spots at the bottom of the kettle.
Product Load Size & Agitation: Cheese needs to be evenly agitated to avoid clumping or scorching. If the agitators are not functioning properly or the load is too large, product can sit too long against the kettle surface and burn.
Lack of Consistent Real-Time Monitoring: Without consistent real-time feedback (e.g., temperature probes, pressure readings, or control loop tuning), it’s difficult for operators to adjust the process in time to prevent damage.
————————————————————————————————————————————————————————————————
\[\text{For the water collection test on Kettle 1 the three overshoots were the following:}\]
\[\text{Overshoot #1 - }2.3^\circ\ F\]
\[\text{Overshoot #2 - }3.3^\circ\ F\]
\[ \text{Overshoot #3 - }9.0^\circ\ F \]
| ActualTime | TimeMinutes | Temp |
|---|---|---|
| 1:03pm | 0 | 67 |
| 1:27pm | 24 | 108 |
| 1:42pm | 39 | 121 |
| 1:57pm | 54 | 133 |
| 2:12pm | 69 | 141 |
| 2:27pm | 84 | 148 |
| 2:42pm | 99 | 152 |
| 2:57pm | 114 | 156 |
if (!require(ggplot2)) install.packages("ggplot2", dependencies = TRUE)
## Loading required package: ggplot2
library(ggplot2)
# Recreate vectors just to be safe
Time1 <- c(0, 24, 39, 54, 69, 84, 99, 114)
Temp1 <- c(67, 108, 121, 133, 141, 148, 152, 156)
# Create a proper numeric data frame
plot_data <- data.frame(Time = Time1, Temperature = Temp1)
# Generate smooth line chart
ggplot(plot_data, aes(x = Time, y = Temperature)) +
geom_line(color = "steelblue", size = 1.5) +
geom_point(color = "darkred", size = 3) +
scale_x_continuous(breaks = seq(0, 120, by = 15)) +
scale_y_continuous(breaks = seq(60, 160, by = 10)) +
labs(
title = "Kettle 1 Water Test",
x = "Time (Minutes)",
y = "Temperature (°F)"
) +
theme_minimal(base_size = 16)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
PROGRAMMED TEMP OF 200
| ActualTime | TimeMinutes | Temp |
|---|---|---|
| 10:39am | 118 | 141 |
| 10:51am | 130 | 145 |
| 11:02am | 141 | 148 |
| 11:16am | 155 | 151 |
| 11:59am | 178 | 154 |
| 12:02pm | 201 | 157 |
| 12:14pm | 213 | 159 |
| 12:27pm | 226 | 162 |
# Install and load required package
if (!require(ggplot2)) install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
# Recreate vectors
Time3 <- c(118, 130, 141, 155, 178, 201, 213, 226)
Temp3 <- c(141, 145, 148, 151, 154, 157, 159, 162)
# Create data frame
plot_data2 <- data.frame(Time = Time3, Temperature = Temp3)
# Generate line chart
ggplot(plot_data2, aes(x = Time, y = Temperature)) +
geom_line(color = "seagreen", size = 1.5) +
geom_point(color = "firebrick", size = 3) +
scale_x_continuous(breaks = seq(110, 230, by = 15)) +
scale_y_continuous(breaks = seq(140, 165, by = 5)) +
labs(
title = "Kettle 1 Cheese Test",
x = "Time (Minutes)",
y = "Temperature (°F)"
) +
theme_minimal(base_size = 16)
————————————————————————————————————————————————————————————————
\[\text{For the water collection test on Kettle 2 the three overshoots were the following:}\]
\[\text{Overshoot #1 - }2.3^\circ\ F\]
\[\text{Overshoot #2 - }3.0^\circ\ F\]
\[ \text{Overshoot #3 - }8.0^\circ\ F \]
| ActualTime | TimeMinutes | Temp |
|---|---|---|
| 1:31pm | 0 | 67 |
| 1:51pm | 22 | 104 |
| 2:10pm | 39 | 125 |
| 2:25pm | 54 | 139 |
| 2:40pm | 69 | 149 |
| 2:56pm | 84 | 156 |
# Install and load required package
if (!require(ggplot2)) install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
# Recreate vectors
Time2 <- c(0, 22, 39, 54, 69, 84)
Temp2 <- c(67, 104, 125, 139, 149, 156)
# Create data frame
plot_data3 <- data.frame(Time = Time2, Temperature = Temp2)
# Generate line chart
ggplot(plot_data3, aes(x = Time, y = Temperature)) +
geom_line(color = "darkorange", size = 1.5) +
geom_point(color = "darkblue", size = 3) +
scale_x_continuous(breaks = seq(0, 90, by = 15)) +
scale_y_continuous(breaks = seq(60, 160, by = 10)) +
labs(
title = "Kettle 2 Water Test",
x = "Time (Minutes)",
y = "Temperature (°F)"
) +
theme_minimal(base_size = 16)
| ActualTime | Time | Temp |
|---|---|---|
| 10:39am | 87 | 147 |
| 10:51am | 99 | 148 |
| 11:01am | 109 | 149 |
| 11:16am | 124 | 150 |
| 11:40am | 148 | 150 |
| 12:02pm | 170 | 152 |
| 12:14pm | 182 | 152 |
| 12:27pm | 195 | 154 |
| 12:44pm | 212 | 157 |
| 1:03pm | 231 | 160 |
| 1:16pm | 244 | 162 |
# Install and load required package
if (!require(ggplot2)) install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
# Recreate vectors
Time4 <- c(87, 99, 109, 124, 148, 170, 182, 195, 212, 231, 244)
Temp4 <- c(147, 148, 149, 150, 150, 152, 152, 154, 157, 160, 162)
# Create data frame
plot_data4 <- data.frame(Time = Time4, Temperature = Temp4)
# Generate line chart
ggplot(plot_data4, aes(x = Time, y = Temperature)) +
geom_line(color = "purple", size = 1.5) +
geom_point(color = "black", size = 3) +
scale_x_continuous(breaks = seq(80, 250, by = 20)) +
scale_y_continuous(breaks = seq(145, 165, by = 5)) +
labs(
title = "Kettle 2 Cheese Test",
x = "Time (Minutes)",
y = "Temperature (°F)"
) +
theme_minimal(base_size = 16)
————————————————————————————————————————————————————————————————
| Time | Temp |
|---|---|
| 59 | 149 |
| 71 | 152 |
| 81 | 155 |
| 89 | 156 |
| 95 | 158 |
| 101 | 160 |
| 105 | 161 |
# Install and load required package
if (!require(ggplot2)) install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
# Recreate vectors
Time5 <- c(59, 71, 81, 89, 95, 101, 105)
Temp5 <- c(149, 152, 155, 156, 158, 160, 161)
# Create data frame
plot_data5 <- data.frame(Time = Time5, Temperature = Temp5)
# Generate line chart
ggplot(plot_data5, aes(x = Time, y = Temperature)) +
geom_line(color = "darkgreen", size = 1.5) +
geom_point(color = "red", size = 3) +
scale_x_continuous(breaks = seq(55, 110, by = 10)) +
scale_y_continuous(breaks = seq(145, 165, by = 5)) +
labs(
title = "Kettle 3: Cheese Test",
x = "Time (Minutes)",
y = "Temperature (°F)"
) +
theme_minimal(base_size = 16)
————————————————————————————————————————————————————————————————
CURRENTLY NO DATA
CURRENTLY NO DATA
————————————————————————————————————————————————————————————————
CURRENTLY NO DATA
————————————————————————————————————————————————————————————————
CURRENTLY NO DATA
————————————————————————————————————————————————————————————————
# Install and load required package
if (!require(ggplot2)) install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
# Data for Kettle 1
Time1 <- c(0, 24, 39, 54, 69, 84, 99, 114)
Temp1 <- c(67, 108, 121, 133, 141, 148, 152, 156)
# Data for Kettle 2
Time2 <- c(0, 22, 39, 54, 69, 84)
Temp2 <- c(67, 104, 125, 139, 149, 156)
# Combine into one dataframe
kettle_data <- data.frame(
Time = c(Time1, Time2),
Temp = c(Temp1, Temp2),
Kettle = c(rep("Kettle 1", length(Time1)), rep("Kettle 2", length(Time2)))
)
# Plot both lines
ggplot(kettle_data, aes(x = Time, y = Temp, color = Kettle)) +
geom_line(size = 1.5) +
geom_point(size = 3) +
scale_x_continuous(breaks = seq(0, 120, by = 15)) +
scale_y_continuous(breaks = seq(60, 160, by = 10)) +
labs(
title = "Temperature Rise Comparison: Kettle 1 vs Kettle 2",
x = "Time (Minutes)",
y = "Temperature (°F)",
color = "Kettle"
) +
theme_minimal(base_size = 16) +
theme(legend.position = "top")
For the water data, Kettle2 gets to temp 30 minutes quicker than Kettle1
# Install and load required package
if (!require(ggplot2)) install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
# Cheese Kettle Data Sets
# Data Set 3
Time3 <- c(118, 130, 141, 155, 178, 201, 213, 226)
Temp3 <- c(141, 145, 148, 151, 154, 157, 159, 162)
# Data Set 4
Time4 <- c(87, 99, 109, 124, 148, 170, 182, 195, 212, 231, 244)
Temp4 <- c(147, 148, 149, 150, 150, 152, 152, 154, 157, 160, 162)
# Data Set 5
Time5 <- c(59, 71, 81, 89, 95, 101, 105)
Temp5 <- c(149, 152, 155, 156, 158, 160, 161)
# Combine all data
cheese_data <- data.frame(
Time = c(Time3, Time4, Time5),
Temp = c(Temp3, Temp4, Temp5),
Kettle = c(
rep("Cheese Kettle 1", length(Time3)),
rep("Cheese Kettle 2", length(Time4)),
rep("Cheese Kettle 3", length(Time5))
)
)
# Plot
ggplot(cheese_data, aes(x = Time, y = Temp, color = Kettle)) +
geom_line(size = 1.5) +
geom_point(size = 3) +
scale_x_continuous(breaks = seq(50, 250, by = 20)) +
scale_y_continuous(breaks = seq(140, 165, by = 5)) +
labs(
title = "Cheese Kettle Temperature Comparison",
x = "Time (Minutes)",
y = "Temperature (°F)",
color = "Kettle"
) +
theme_minimal(base_size = 16) +
theme(legend.position = "top")
Important information to note: Temp for Kettle2 was raised from 190F to 200F at the 195 minute mark. Kettle1 started with a programmed temp of 200F. Kettles 2 and 3 had burn-on while 1 did not.
————————————————————————————————————————————————————————————————
Explanation: A larger steam jacket surface area allows more heat transfer.
Why it matters: More contact between the steam jacket and the kettle contents leads to faster heating.
Check: Compare the area of the jackets in contact with the contents.
Explanation: Differences in wall thickness or material (e.g., stainless steel vs. another alloy) affect thermal conductivity.
Why it matters: Thinner or more conductive materials transfer heat more efficiently.
Check: Review manufacturer specs for wall material and thickness.
Explanation: One kettle may have an agitator or better mixing.
Why it matters: Stirring improves heat distribution and reduces hot/cold spots, speeding heating.
Check: Observe whether one kettle stirs the product during heating and how vigorously.
Explanation: Poor condensate drainage in the jacket reduces effective heat transfer.
Why it matters: Accumulated condensate acts as an insulator, reducing heat flow.
Check: Ensure steam traps and drainage systems are working correctly.
Explanation: Differences in product mass, consistency, or specific heat capacity.
Why it matters: More dense or higher-water-content materials take longer to heat.
Check: Confirm identical product type, volume, and initial temperature.
Explanation: Mineral scale buildup can insulate the jacket.
Why it matters: Reduces thermal conductivity over time.
Check: Inspect for scaling, especially if one kettle is older or has harder water exposure.
Explanation: Better-insulated kettles lose less heat to the environment.
Why it matters: More heat goes into the product rather than escaping.
Check: Compare external insulation and surface temperatures.
I will fill at a later date when more data is collected