终检记录全是"合格",客户端做关键尺寸复测却发现整批贴近规格上限——用着没超差,但工艺窗口已经漂移,下一批必出废品。这就是"合格"和"受控"的区别:检验是事后挑出坏的,SPC 是事前看出要坏。上位机天然握着每一件产品的实时测量值,把这些数据按统计方法用起来,产线在出废品之前自己就会喊停。

一、先分清:规格限是客户给的,控制限是数据长出来的

概念来源回答的问题
规格限 USL/LSL图纸、客户要求这件产品合不合格(出货判定)
控制限 UCL/LCL过程自身数据按 ±3σ 计算,定期评审更新过程稳不稳定(有没有异常因素)
中心线 CL子组均值的平均过程当前围绕哪个值波动
最常见的低级错误:把公差线画在控制图上当控制限。规格限和控制限是两套东西:过程能力足够时控制限远在规格限内侧;把规格限当控制限,等于让过程一路漂到快出废品才报警,SPC 就白做了。控制限也不能因为想让图好看而随意收窄,评审更新要留记录。

二、数据怎么分组:合理子组是 SPC 的命门

控制图的基本单位不是单件数据,而是子组(subgroup)。合理子组的原则一句话:组内尽量只有普通原因波动(短时间、同设备、同刀具、同操作),组间才可能暴露特殊原因。

做法说明
子组大小 n计量型 Xbar-R 图推荐 n=4~5(现场每 1~2 小时连抽 5 件,或直接取连续 5 件自动数据)
抽样频次先密后疏:量产初期每小时一组,稳定受控后可降到每班两组;换型/换刀/换料后加密重建
组内不跨条件禁止把两台设备、两个班次、两种原料的数据混进一个子组——那叫"分层没做好",控制限会被撑得虚宽
数据来源优先用上位机自动采集的测量值(扭矩、压力、尺寸测试值),自动数据要按时间窗自动组子组;人工录入必须扫码绑定量具和时间,防补录造假

图型选择上:连续尺寸/扭矩/温度这类计量值用 Xbar-R(均值-极差),n 大(>10)时用 Xbar-S;只有合格/不合格判定用 p 图或 np 图,计缺陷数用 c/u 图。离散制造现场 90% 的需求就是 Xbar-R。

数据类型图型典型工位
计量值,n=2~9Xbar-R机加工尺寸、拧紧扭矩、注液量、压装力
计量值,n≥10 或自动高频Xbar-S电池分容、大批量全检数据按盒分组
单件连续产出,无法组子组I-MR(单值-移动极差)批次型化工反应、每小时只有一件的慢节拍工序
计数:合格/不合格,样本量不等p每班不良率(产量浮动)
计数:单位缺陷数u / c注塑件外观点数、PCBA 焊点缺陷数

三、控制限怎么算:25 组起步,系数查表

新过程量产初期先连续采集至少 25 个子组,确认过程稳定后计算初始控制限:

X̄̄ = 所有子组均值的平均  R̄ = 所有子组极差的平均 UCLx = X̄̄ + A2 · R̄  LCLx = X̄̄ − A2 · R̄ UCLr = D4 · R̄    LCLr = D3 · R̄ 组内标准差 σ̂ = R̄ / d2 n=5 时:A2=0.577,D3=0,D4=2.114,d2=2.326(标准系数表,n不同值不同)
public class Subgroup
{
    public int No;
    public double[] Values;
    public double Mean => Values.Average();
    public double Range => Values.Max() - Values.Min();
}

public class ControlChart
{
    // n=5 的标准系数;实际应做成按n查表的配置
    private const double A2 = 0.577, D3 = 0.0, D4 = 2.114, D2 = 2.326;

    public (double cl, double ucl, double lcl, double sigma) Build(List<Subgroup> groups)
    {
        if (groups.Count < 25)
            throw new InvalidOperationException("建限至少25组");

        double xBarBar = groups.Average(g => g.Mean);
        double rBar = groups.Average(g => g.Range);
        return (xBarBar,
                xBarBar + A2 * rBar,
                xBarBar - A2 * rBar,
                rBar / D2);
    }
}

建限之后控制限不是一成不变:换型、设备大修、工艺参数正式变更后重新建限;常规情况下定期(如每月)评审,评审动作和新旧限值都要留版本记录,历史点按当时的控制限判异——这与配方版本管理(120 篇)是同一个思路。

四、控制图长什么样:六个分区和点的语言

UCL
CL
LCL

子组序号 → 红区=>±3σ(A区) 橙区=2~3σ(B区) 绿区=±1σ(C区)

上半图中红点超出 UCL(规则1报警),而此前连续 6 点单调上升(规则3已经预警)——真实产线往往先出趋势、后出超差,趋势类规则的价值是在废品出现前几个小时就通知工艺员

五、判异八规则:让上位机自动读"点的语言"

1
1点超3σ点落在A区外,最强烈的突变信号
2
连续9点同侧均值持续偏移,刀具磨损/对刀漂移
3
连续6点递增或递减明显趋势,磨损、温升、原料渐变
4
连续14点上下交替两种分布混合,双设备/双原料分层问题
5
3点中2点超2σ同侧A区附近聚集,均值在移动
6
5点中4点超1σ同侧B区外聚集,轻度偏移
7
连续15点在±1σ内异常"太稳定":数据造假、量具分辨力不足或分层错误
8
连续8点在±1σ外双峰混合,两个总体被画在一张图上
public class RuleEngine
{
    // 每来一个新子组,把最近若干点子组均值丢进来判一次
    public List<int> Evaluate(List<double> x, double cl, double sigma)
    {
        var hit = new List<int>();
        int n = x.Count, i = n - 1;

        if (Math.Abs(x[i] - cl) > 3 * sigma) hit.Add(1);

        if (i >= 8 && x.Skip(i - 8).All(v => v > cl) ||
            i >= 8 && x.Skip(i - 8).All(v => v < cl)) hit.Add(2);

        if (i >= 5)
        {
            var seg = x.Skip(i - 5).Take(6).ToList();
            bool up = true, down = true;
            for (int k = 1; k < seg.Count; k++)
            { up &= seg[k] > seg[k - 1]; down &= seg[k] < seg[k - 1]; }
            if (up || down) hit.Add(3);
        }

        // 规则5:连续3点中2点在同侧2σ外
        if (i >= 2)
        {
            var seg = x.Skip(i - 2).Take(3).ToList();
            if (seg.Count(v => v > cl + 2 * sigma) >= 2 ||
                seg.Count(v => v < cl - 2 * sigma) >= 2) hit.Add(5);
        }

        // 规则6:连续5点中4点在同侧1σ外
        if (i >= 4)
        {
            var seg = x.Skip(i - 4).Take(5).ToList();
            if (seg.Count(v => v > cl + sigma) >= 4 ||
                seg.Count(v => v < cl - sigma) >= 4) hit.Add(6);
        }

        // 规则7:连续15点全在±1σ内(先警惕量具失分辨力)
        if (i >= 14 && x.Skip(i - 14).All(v => Math.Abs(v - cl) < sigma)) hit.Add(7);

        if (i >= 7 && x.Skip(i - 7).All(v => Math.Abs(v - cl) > sigma)) hit.Add(8);
        return hit;
    }
}
规则不是开得越多越好。八条全开,误报率会明显上升(每条约千分之几的误报概率叠加在高频子组上很烦)。量产建议:规则 1、2、3 必开,5、6 按客户要求开,4、7、8 在排查分层/数据质量问题时开。报警文案直接写可能原因("连续6点上升,查刀具磨损"),不要只弹一个"规则3"。

六、过程能力:Cpk 回答"就算现在合格,余量还有多少"

Cp = (USL − LSL) / (6σ̂) Cpk = min[(USL − μ̂), (μ̂ − LSL)] / (3σ̂) Pp/Ppk:公式同形,但 σ 用全部单件数据的整体标准差(含组间变异) Cpk 只看离散不看居中,必须和 Cp 一起看;Ppk 反映长期实际表现,通常 Ppk ≤ Cpk
public static (double cp, double cpk, double ppk) Capability(
    List<double> allValues, double sigmaWithin, double usl, double lsl)
{
    double mean = allValues.Average();
    double cp = (usl - lsl) / (6 * sigmaWithin);
    double cpk = Math.Min(usl - mean, mean - lsl) / (3 * sigmaWithin);

    double s = Math.Sqrt(allValues.Sum(v => (v - mean) * (v - mean))
                              / (allValues.Count - 1));
    double ppk = Math.Min(usl - mean, mean - lsl) / (3 * s);
    return (cp, cpk, ppk);
}
// 判定基准(汽车行业常见要求,具体看客户手册):
// Cpk ≥ 1.67 能力充足;1.33~1.67 可接受但需监控;1.0~1.33 不足,必须改进;
// <1.0 不可接受——即使现在没出超差,批量一大必然有废品流到客户手里
Cpk 低的典型原因排查方向
Cp 高、Cpk 低离散不大但整体偏中心——先调对刀/配方目标值,把均值拉回中心,成本最低
Cp、Cpk 都低离散太大——查设备精度、工装重复定位、原料批次一致性、量具GR&R
Cpk 高、Ppk 低组内稳定但组间漂移大——查换班、换料、温升、设备间差异(分层)

七、失控之后怎么办:报警要接处置闭环,否则只是换个地方刷屏

  1. 自动标记与隔离:判异触发后,从上一个稳定点之后生产的 SN 自动置"待复检",过站系统(121 篇)拦截,未经复检不能入库;
  2. 推送与升级:工位橙灯 + 看板提示,15 分钟无人确认升级到班组长(复用 117 篇报警通道),报警同时带上控制图截图和可能原因;
  3. 找特殊原因:5M1E(人机料法环测)——换刀、换料批、设备维修、调参数记录与报警时间点对齐,八成的特殊原因能在时间轴上直接对上;
  4. 处置与复产:原因消除后首件必检(连续 3~5 组回到受控),工艺或质量双签字复产,处置记录与受影响 SN 清单存档;
  5. 量具先过关:量具 GR&R 超过 10%、分辨力不足(最小刻度不能小于公差带 1/10)时,控制图数据本身不可信,先做 MSA 再谈 SPC。

八、上线验收清单

  1. 子组正确:自动采集按时间窗成组,组内不跨设备/班次,抽 10 组核对原始数据;
  2. 建限合规:用 ≥25 组稳定数据建限,控制限数值与手工 Excel 复算一致,规格限没有被误当控制限;
  3. 判异验证:灌入造好的越界点、9点同侧、6点上升序列,规则命中与报警文案正确;
  4. 处置闭环:触发规则1后区间内 SN 被拦截,复检/双签流程走通,受影响清单可导出;
  5. Cpk 对账:选一个尺寸用第三方软件复算 Cp/Cpk/Ppk,结果一致到小数点后两位;
  6. 换型重建:换型后控制限重新建立、历史图按型号与版本隔离查询,不串图。

SPC 在产线上真正跑起来的标志,不是墙上多了几张图,而是形成了一个闭环:数据自动成组、异常自动判读、产品自动隔离、原因有人处理、复产有人签字。上位机手里的实时测量值,只有经过合理子组和判异规则的组织,才能从"存在数据库里的数字"变成提前几小时拦下批量事故的能力——合格是对一批产品的交代,受控才是对整条产线的掌控。