Skip to content

Manufacturing and machineryMuvia Industrial

The control chart that warns you first

Weighings from the checkweigher become an X̄-R chart with 3σ limits and the Western Electric rules, recalculated at every shift change. A worn nozzle shows up hours before the scrap does, and Cpk shift by shift tells you where to act.

Illustrative scenario: it describes a typical case, not a customer project.

Scrap is counted at the end of the shift. The drift started hours earlier.

Every fifteen minutes a filler weighs a sample of bottles, and the figure ends up in a log someone reads at the end of the shift or when a customer complains. A wearing nozzle moves the mean by a few tenths of a gram an hour: no single bottle is out of specification until it is too late.

Control charts exist for exactly this, but kept by hand or in a spreadsheet they come too late. In Muvia the weighings arrive from the line, the chart recalculates itself and the Western Electric rules flag a mean that is starting to move, not bottles that are already out.

Who it's for
Quality managers, process engineers, shift supervisors and maintenance on filling and packaging lines.
Diagram: the checkweigher over OPC UA and the filler's Siemens S7 PLC send weighings and nozzle status through the edge node; an Excel file brings the specification and the Cpk target. Muvia produces the X̄-R chart with the Western Electric rules, an alarm when the process goes out of control, Cpk by shift on a dashboard and the capability notebook.

In Muvia, step by step

Real product screens, recorded on a project with sample data.

1 of 5

The video · Weighings from the checkweigher become an X̄-R chart with 3σ limits and the Western Electric rules, recalculated at every shift change. A worn nozzle shows up hours before the scrap does, and Cpk shift by shift tells you where to act.

What you get

Drift is seen before the scrap
A mean that moves trips a rule while the bottles are still in specification, not afterwards.
A chart that is always current
Nobody copies weighings into a spreadsheet: the chart recalculates itself every shift.
The shift to look at first
Cpk shift by shift shows where the process is least capable and where to act.
Rules written once
Limits and rules live in one function: they apply the same way to every line you connect.

For the technical team

How it is built in Muvia

  1. 1

    Connect checkweigher and filler

    On the edge node you configure the checkweigher's OPC UA driver and the filler's S7 driver: every weighing arrives with its timestamp and its subgroup. If the connection drops, the node keeps the readings in a local buffer.

  2. 2

    Compute the chart in Python

    A Python function computes the mean and range of each subgroup, the 3σ limits from the reference period and the Western Electric rules. A flow runs it at every shift change and writes the result to a table.

  3. 3

    Watch the drift in Analysis

    In Analysis the chart shows the mean, the limits and the centre line; each rule is a condition that colours the out-of-control stretches, and annotations record what happened, such as a nozzle being replaced.

  4. 4

    Alert the line

    A threshold on the violated-rules column opens an episode in the alarm register: the shift supervisor takes it on and notes what was done to the filler.

  5. 5

    Measure capability by shift

    A notebook brings together Cp and Cpk for each shift, the mean hour by hour and the actions agreed, and prints to PDF for the quality meeting.

Python function

import pandas as pd

A2 = 0.577  # subgroups of 5 weighings

def at_least(mask, n, k):
    """True where at least k of the last n subgroups meet the mask."""
    return mask.astype(int).rolling(n).sum() >= k

def transform(inputs, params, ctx):
    d = inputs["rows"]
    g = d.groupby("subgroup").agg(
        start=("ts", "min"), mean=("weight_g", "mean"),
        range=("weight_g", lambda s: s.max() - s.min()))
    ref = g[g["start"] < pd.Timestamp(params["reference_end"])]
    centre = ref["mean"].mean()
    sigma = A2 * ref["range"].mean() / 3
    z = (g["mean"] - centre) / sigma
    g["centre_line"] = centre
    g["upper_limit"] = centre + 3 * sigma
    g["lower_limit"] = centre - 3 * sigma
    g["rule_1"] = z.abs() > 3
    g["rule_2"] = at_least(z > 2, 3, 2) | at_least(z < -2, 3, 2)
    g["rule_3"] = at_least(z > 1, 5, 4) | at_least(z < -1, 5, 4)
    g["rule_4"] = at_least(z > 0, 8, 8) | at_least(z < 0, 8, 8)
    g["out_of_control"] = g.filter(like="rule_").any(axis=1)
    return {"rows": g.reset_index()}
Mean and range per subgroup, 3σ limits from the reference period and the four Western Electric rules: the function the flow runs at every shift change.
The data it needs
  • The net weight of 5 bottles every 15 minutes from the checkweigher, over OPC UA
  • Filler speed and nozzle status from the Siemens S7 PLC
  • The weight specification and the Cpk target from an Excel file
  • Shifts and the reference period used to compute the limits

Tell us which machines you run. We'll tell you how to read them.

PLC brand, protocol, how the floor is connected: with those three answers, in a demo with one of our engineers, we show you how Muvia Industrial puts line data next to the rest of the business.