OEE, Uptime and Performance
One of the fundemental KPI’s within a factory is Uptime and OEE.
OEE
Overall Equipment Effectiveness (OEE) measures how efficiently a manufacturing operation uses its resources (facilities, time, and materials) compared to its full potential during scheduled production times. It shows the percentage of manufacturing time that is truly productive. An OEE score of 100% means that only good parts are produced (100% quality), at the maximum speed (100% performance), and without any interruptions (100% availability).
OEE is mostly used as a Key Performance Indicator (KPI). OEE can be compare the previous periods to measure improvement projects or can be used to check if production is running above the set base line. A OEE of 100% is almost never the goal since in most cases it can never be reached.
An OEE of more than 100% is impossible. In that case the scheduled time or designed speed is set to low.
On this page we will focus on availability and performance.
Availability - Uptime
The Availability portion of the OEE Metric represents the percentage of scheduled time that the operation is available to operate. The Availability Metric is a pure measurement of Uptime that is designed to exclude the effects of Quality and Performance. The losses due to wasted availability are called availability losses
Example:
A given Work Center is scheduled to run for an 8-hour (480-minute) shift with a 30-minute scheduled break and during the break the lines stop, and unscheduled downtime is 60 minutes.
- The scheduled time = 480 minutes - 30 minutes = 450 minutes.
- Operating Time = 480 Minutes – 30 Minutes Schedule Loss – 60 Minutes Unscheduled Downtime = 390 Minutes
- Calculation: Availability = operating time / scheduled time[6]
- Availability = 390 minutes / 450 minutes = 86.6%
Availability is 86.6%.
Performance
The Performance portion of the OEE Metric represents the percentage of performance loss compared to the designed speed of the manufacturing operation.
Example 1: Continuous Work Center.
A given Work Center is scheduled to run for an 8-hour (480-minute) shift with a 30-minute scheduled break.
-
Operating Time = 450 Min Scheduled – 60 Min Unscheduled Downtime = 390 Minutes
-
Design speed of the machine is 500 m/min
-
The Work Center produces 50.000 meter material during the shift
-
50.000 meter / 500 m/min = 100 Minutes
-
Performance (Productivity) = 100 Minutes / 390 Minutes = 25.6%
Performance is 25.6%.
Example 2: Discrete Work Center
A given Work Center is scheduled to run for an 8-hour (480-minute) shift with a 30-minute scheduled break.
-
Operating Time = 450 Min Scheduled – 60 Min Unscheduled Downtime = 390 Minutes
-
The Standard Rate for the part being produced is 40 Units/Hour or 1.5 Minutes/Unit
-
The Work Center produces 242 Total Units during the shift. Note: The basis is Total Units, not Good Units. The Performance metric does not penalize for Quality.
-
Time to Produce Parts = 242 Units * 1.5 Minutes/Unit = 363 Minutes
-
Performance (Productivity) = 363 Minutes / 390 Minutes = 93.1%
Performance is 93.1%.
Creating an OEE Dashboard
Availability
For calculating the Availability, the Uptime of the Work Center needs to be known. A simple Boolean (on/off, 1/0) will do. A Work Center does not always have this information available. A transformation in the Connection can be used to create the boolean.
Read more about transformations here.
Once the boolean is available in UpBlue, the availability can be calculated.
integrate
The integrate()
function is the perfect fit for calculating the availability. integrate()
calculates the integral of the boolean. The integral is the surface of the graph. In other words: the UpTime. The total seconds the value is “on”.
The integrate()
functions takes into account the spacing between datapoints. If for example the datapoints are not evenly spaced, the integrate function will compensate for that.
For example this data is logged of a Work Center:

1 is on, 0 is off. There are in total 113 datapoints. 56 “1” datapoints, 57 “0” datapoints. These datapoints are not evenly spaced since deduplication is active in the transformation.

To calculate the uptime per the selected range in the dashboard, use this function:
integrate(
WorkCenter_On[$__range]
)/$__range
WorkCenter_On is the name of the tag
$__range
by the dashboard will be filled with the total seconds of the time range. When running this query, the query will be transformed to;
integrate(
WorkCenter_On[86400s]
)/86400s
Result:

The availability of this Work Center is 2.56%. Since this Work Center has a 8 hour shift, we multiply the result by 3.
integrate(
WorkCenter_On[$__range]
)/$__range
*3
Result: 7.68% availability ** Bar chart ** To calculate the availability per hour, use this query:
integrate(
WorkCenter_On[1h]
)/1h
Set the Min step on 1h
.

Result:

To set the unit, navigate to options and set:

To rename the x-axis values, navigate to options and set:

To calculate the availability in minutes, add *60
.
integrate(
WorkCenter_On[1h]
)/1h
*60
Set the unit to minutes
.
To calculate per day, replace all 1h
with 1d
.
To calculate per week, replace all 1h
with 1w
.
Make sure there is minimal 1 datapoint in each timewindow. For example [1h], there has to be a datapoint in each hour. Use deduplication with a timeout. For example 5 minutes.
Alternatives
There are alternatives to integrate()
.
share_eq_over_time
share_eq_over_time
calculates the share of values over the number of values.
For example the same dataset:

share_eq_over_time(
WorkCenter_On[$__range]
, 1);
Result will be 0.496
. This is obviously wrong since this number should be 0.0256
like calculated before with integrate()
.
share_eq_over_time
is short for:
count_eq_over_time(
WorkCenter_On[$__range]
, 1)
/
count_over_time(
WorkCenter_On[$__range]
)
So share_eq_over_time
does not calculate the running average!
When deduplication is not active, the datapoints are evenly spaced and there is absolutely no data missing, share_eq_over_time
will generate the correct results.
A sub_query can be used to fill in the gabs by deduplication;
share_eq_over_time(
last_over_time(WorkCenter_On[24h])
[$__range:5s]
,1)
With this query, a datapoints is created per 5 seconds, thereby creating a evenly spaced dataset.
To breakdown the query:
share_eq_over_time(
last_over_time(WorkCenter_On[24h])
[$__range:5s]
,1)
Will fill in the gabs. When there is no datapoints, the query will look behind for a maximum of 24 hour to find the last datapoint.
share_eq_over_time(
last_over_time(WorkCenter_On[24h])
[$__range:5s]
,1)
[$__range:5s]
will calculate the results of the sub-query(last_over_time) in the timerange of the dashboard with a resolution of 5 seconds.
The result will be the same as integrate()
. There is one big down-side to this query: a sub-query is limited to 100.000 datapoints. So if the $__range
is larger than 100.000 * 5 seconds, the query will fall.
This equals 5.7 days. Decreasing the resolution to for example 1 min will increase the query to a maximum of 69,4 days.
sum_over_time
In the connection, a transformation called “timer” is available. The timer has an option “Only maximum value”. With this option enabled, only when a Work Center stops, the total running time is sent to the database. By taking the sum of all times, the total availability can be calculated.
Only use this method if the Work Center has short runs. If a Work Center runs for example 2 hours; the graph will show a availability of 0% the first hour and 200% the second hour.
sum_over_time(
WorkCenter_Timer_only_max[$__range]
)/$__range
WorkCenter_Timer_only_max
is the tag name.
Performance
Performance can be calculated two ways. This is depending if the performance is calculated for a Discrete Work Center or a Continuous Work Center.
Discrete Work Center
A Discrete Work Center produces items. The Performance is calculated based on the number of items processes by the Work Center. To calculate the Performance, a counter is needed. A counter can be created by a transformation if the Work Center does not supply a counter. Read more about transformations here.
Do not try to count “pulses” in the query. Use a counter transformation to count pulses at the source. This is much more reliable.
increases(
WorkCenter_Counter[1h]
)
WorkCenter_Counter
is the tag
Set the Min step on 1h
.

This will calculate the increase of the counter for the last 1h. Divide the produced units by the maximum of the Work Center to calculate the Performance.
To calculate per day, replace all 1h
with 1d
.
To calculate per week, replace all 1h
with 1w
.
Continuous Work Center
A continuous Work Center has a specific “Speed”. For example m/min for a printing press. To calculate the average speed, the same function as for Availability can be used. Namely: integrate()
. Instead of calculating the total duration in sec, integrate()
can also calculate the area of speed.
integrate(
WorkCenter_Speed[$__range]
)
WorkCenter_Speed
is the name of the tag.
This query will calculate the area of the speed.
For example this Work Center is running at 100m/min for 10 sec. The query will return 100*10 = 1000. Divide this by the total nummer of seconds of the Work Center running for the average speed
integrate(
WorkCenter_Speed[$__range]
)
/
(
integrate(
WorkCenter_On[$__range]
)
)
For example the maxumum speed is 500 m/min, the Query will be;
integrate(
WorkCenter_Speed[$__range]
)
/
(
integrate(
WorkCenter_On[$__range]
)
)
/500
This query does not account for the Work Center running while in Setup.