————————————————————————————————————————————————————————————————

1 \[Introduction\]

1.1 Explanation of Problem

1.1.1 Kettle Performance Issues at Praters

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.

1.1.2 Why Is Burn-On a Problem? Why Are Wait Times So Long?

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.

————————————————————————————————————————————————————————————————

2 \[Kettle 1\]

2.0.1 \[Water Data\]

\[\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.

2.0.2 \[ CheeseData \]

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)

————————————————————————————————————————————————————————————————

3 \[Kettle 2\]

3.0.1 \[ Water Data \]

\[\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)

3.0.2 \[ CheeseData \]

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)

————————————————————————————————————————————————————————————————

4 \[Kettle 3\]

4.0.1 \[ Water Data \]

4.0.2 CURRENTLY NO DATA

4.0.3 \[ Cheese Data \]

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)

————————————————————————————————————————————————————————————————

5 \[Kettle 4\]

5.0.1 \[ Water Data \]

CURRENTLY NO DATA

5.0.2 \[ Cheese Data \]

CURRENTLY NO DATA

————————————————————————————————————————————————————————————————

6 \[ Kettle 5 \]

CURRENTLY NO DATA

————————————————————————————————————————————————————————————————

7 \[ Kettle 6 \]

CURRENTLY NO DATA

————————————————————————————————————————————————————————————————

8 \[Data Comparison\]

8.0.1 Water 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

8.0.2 Cheese Data

# 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.

8.0.2.1 Time Elapsed for Kettle1: 3hours 46minutes

8.0.2.2 Time Elapsed for Kettle2: 4hours 4minutes

8.0.2.3 Time Elapsed for Kettle3: 1hours 52minutes

————————————————————————————————————————————————————————————————

9 \[Chat GPT\]

9.0.1 Jacket Surface Area

  • 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.

9.0.2 Kettle Wall Thickness and Material

  • 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.

9.0.3 Agitation or Mixing

  • 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.

9.0.4 Steam Condensate Removal

  • 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.

9.0.5 Initial Load or Contents

  • 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.

9.0.6 Scale or Fouling Inside Jacket

  • 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.

9.0.7 Insulation of the Kettle

  • 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.

11 \[R Code\]

I will fill at a later date when more data is collected