当前位置: 首页 > news >正文

基于Flask的SPC实时监控系统,支持多种控制图在线计算与展示

本文还有配套的精品资源,点击获取

简介:一套开箱即用的统计过程控制(SPC)软件,用Python Flask构建,专注制造业和质检场景的过程稳定性监测。系统能上传CSV或Excel格式的质量数据,自动完成Xbar-R、Xbar-S、I-MR、P、NP、C、U等常用控制图的计算,并实时渲染折线图、散点图等可视化结果。前端采用Bootstrap+jQuery搭建响应式界面,集成文件上传、用户头像管理、操作日志记录、静态资源分发等功能;后端包含完整数据库迁移脚本(基于Flask-Migrate)、环境隔离(env目录)、调试开关、备份机制(bak)、上传文件存储(uploads)、样式与脚本资源(css/js/fonts/jquery插件)以及多语言支持基础结构。所有统计逻辑均在Python中实现,不依赖外部服务,可本地部署运行。配套提供spc-dashboard.sql和alarm.sql数据库初始化脚本,支持快速导入测试数据与告警规则。适用于工厂产线巡检、质量工程师日常分析、高校SPC教学演示等实际需求。

1. 项目概述:这不是一个“演示系统”,而是一套能直接跑在车间工控机上的SPC监控工具

我做质量系统开发快十二年了,从最早用Excel手算控制图,到后来部署商业SPC软件(动辄几十万授权+每年维护费),再到自己搭平台——这套基于Flask的SPC实时监控系统,是我和团队在三个真实产线落地后沉淀下来的“最小可行工业级方案”。它不追求炫酷3D图表或AI预测,核心就干一件事:让班组长、巡检员、质量工程师,在Windows 7工控机、甚至一台8GB内存的旧笔记本上,双击启动,5分钟内就能把当天的尺寸、硬度、电阻等实测数据拖进去,立刻看到Xbar-R图有没有出界、I-MR图的趋势是否漂移、P图的不合格率是否连续7点上升。它不是教学玩具,也不是云端SaaS概念产品,而是真正嵌进工厂日常节奏里的“过程稳定性听诊器”。

关键词里“Flask SPC”不是技术堆砌标签,而是工程权衡的结果:Flask轻量、无强制ORM绑定、调试直观、部署简单,特别适合制造业IT基础设施普遍薄弱的现实——很多车间连独立服务器都没有,只能靠一台带SSD的研华工控机跑全栈;“控制图实时计算”强调的是毫秒级响应,比如上传一个含500组子组(每组5个测量值)的CSV,后端必须在800ms内完成Xbar、R、UCL/LCL全部计算并返回JSON,前端才能做到无缝刷新图表,而不是让用户盯着“加载中…”转圈;“统计过程监控”则点明它的定位:不是替代MES或QMS,而是作为它们的“过程稳定性感知层”,当MES告诉你“某工单合格率98%”,它要立刻回答“这98%是稳定产出的,还是靠最后100件挑出来的?”。

整套系统设计时,我们反复问自己一个问题:“如果明天产线停机两小时,质量主管冲进办公室说‘马上给我看昨天下午三点到四点那批轴承外径的Xbar-S图,我要判断是不是夹具松动’,我们能不能在3分钟内调出来?”答案决定了所有架构选择:放弃Docker容器化(车间IT不会配K8s)、不用Redis缓存(增加运维复杂度)、数据库只用SQLite起步(spc-dashboard.sql脚本可一键导入,后续再平滑升级PostgreSQL)、前端不搞Vue/React单页应用(避免Webpack构建链路断裂导致上线失败)。你看到的env目录不是摆设,是给产线IT同事准备的“开箱即用环境隔离区”;bak目录里的自动备份脚本,会在每天凌晨2点把当天所有上传数据、计算结果、操作日志打包成spc-bak-20240520.zip,存在本地NAS上;uploads目录结构按日期分层(uploads/2024/05/20/xxx.csv),既防文件名冲突,又方便审计追溯。它解决的从来不是“技术先进性”,而是“今天下午三点前,能不能让王师傅在车间大屏上看到这张图”。

2. 系统整体设计与思路拆解:为什么选Flask?为什么拒绝“微服务”?

2.1 架构选型:轻量框架如何扛住产线真实负载?

很多人第一反应是:“SPC系统怎么不用Django?功能更全啊。”但我们在汽车零部件厂实测过:Django的Admin后台虽然强大,但默认开启的CSRF中间件、Session存储、模板引擎预编译,在只有2核CPU、4GB内存的工控机上,会让一次Xbar-R计算的响应时间从320ms拉长到1.8秒。而Flask的Werkzeug WSGI服务器,在关闭调试模式后,纯Python计算逻辑的吞吐量高出近3倍。更重要的是,Flask的“显式优于隐式”哲学,让我们能精准控制每一行代码的执行路径——比如控制图计算模块spc/calculators.py里,所有算法都写成纯函数(def xbar_r_chart(data: List[List[float]]) -> Dict[str, Any]),不依赖任何Flask上下文,这意味着未来如果需要把计算模块抽出来做成独立服务,或者集成进PLC的Python运行时,几乎零改造成本。

我们刻意回避了“微服务”架构,原因很实在:在电子厂部署时,曾尝试把计算服务拆成独立Flask API,结果发现车间网络经常抖动,一次HTTP请求超时就会导致整张控制图渲染失败,操作员只能重传数据。最终回归单体架构,但做了关键优化:计算逻辑与Web请求完全解耦。具体做法是在spc/worker.py里实现了一个轻量级任务队列(基于Python内置queue.Queue),所有上传请求到达/upload路由后,立即返回“已接收”,同时将文件路径、参数(子组大小、控制限系数k)推入队列;后台守护线程持续消费队列,执行计算,并将结果存入SQLite的calculation_results表。这样既保证了前端响应速度(用户上传后1秒内看到“处理中”提示),又避免了长计算阻塞Web服务器。实测在i5-6300HQ处理器上,并发处理3个Xbar-S计算任务(每任务含200子组)时,CPU占用率稳定在65%以下,无丢包、无超时。

2.2 控制图算法设计:为什么只支持这7种?背后的统计学约束

系统明确支持Xbar-R、Xbar-S、I-MR、P、NP、C、U七种控制图,这个数字不是随意定的。它严格对应ISO 7870-2:2013《统计过程控制 第2部分:常规控制图》和AIAG SPC手册的核心要求。我们砍掉了EWMA、CUSUM等高级图,不是技术做不到,而是现场验证发现:90%以上的产线问题,用这7种基础图已足够暴露。比如某电机厂反馈,他们用I-MR图监控绕线电阻,连续12点落在中心线一侧,立刻锁定是铜线供应商批次变更;而用EWMA图反而因参数敏感,把正常的工艺微调误判为异常。

每种图的算法实现都嵌入了统计学硬约束:
-Xbar-R图:强制要求子组大小n在2~10之间(超出则报错),因为R图的控制限系数D3/D4查表值在此范围外无定义;
-P图与NP图:自动校验样本量n是否满足np≥5且n(1-p)≥5(大样本正态近似条件),不满足时前端弹窗提示“建议改用NP图或增加样本量”,而非强行计算;
-U图:对单位缺陷数u进行泊松分布拟合检验,若卡方检验p值<0.05,则标记该数据集“可能不服从泊松分布”,建议检查数据采集方式(如是否混入不同型号产品)。

这些约束不是写在文档里,而是固化在spc/validators.py的校验函数中,每次计算前自动触发。比如上传一个含50个子组(每组n=3)的CSV,系统会先调用validate_xbar_r_input(data, n=3),确认所有子组数据均为数值、无空值、子组内极差R>0(排除全相同数据),全部通过才进入计算流程。这种“防御性编程”看似繁琐,却避免了质量工程师拿着错误结果去开会的尴尬——去年帮一家医疗器械厂排查时,就靠这个校验发现了他们把“合格/不合格”文本数据误传为数值,系统直接拦截并提示“检测到非数值字段,请检查CSV格式”,省去半天溯源时间。

2.3 前端可视化策略:为什么坚持Chart.js而非ECharts?

static/js/charts.js里,所有图表渲染都基于Chart.js v4(非最新v4.4,而是锁定v4.2.1),这个选择源于一次惨痛教训。最初用ECharts 5.4,其3D渲染效果确实惊艳,但在某LED封装厂的老旧工控机(Windows 7 + Intel GMA 3150显卡)上,加载一张含200个数据点的Xbar-R图,GPU内存泄漏导致整个界面卡死。换成Chart.js后,同样配置下帧率稳定在60FPS,且其Canvas 2D渲染对低配硬件更友好。

更重要的是,Chart.js的插件机制让我们能深度定制工业场景需求:
-失控点高亮插件:自动识别超出UCL/LCL的点,用红色菱形标记,并在tooltip中显示“超出上控制限(UCL=3.21)”,点击可跳转到原始数据行;
-趋势线标注插件:当检测到连续7点上升/下降时,在图表右上角添加黄色警示框,文字为“趋势异常:连续7点上升(依据Western Electric规则)”;
-子组区间着色插件:对每个子组的数据点,用不同透明度的背景色块覆盖(如子组1用#4e73df10,子组2用#1cc88a10),让操作员一眼分辨数据分组逻辑。

这些插件代码不足200行,却极大提升了现场判读效率。你不需要记住“7点上升意味着什么”,图表已经用颜色和文字告诉你。而ECharts的插件生态太庞大,一个tooltip定制就要引入十几个依赖,违背了“轻量可靠”的初衷。

3. 核心细节解析与实操要点:从上传到告警的完整链路

3.1 文件上传与数据解析:如何应对车间最混乱的CSV格式?

产线数据源五花八门:三坐标测量仪导出的TXT(制表符分隔)、SPC采集终端生成的CSV(逗号分隔但含中文标题)、甚至老师傅手写的Excel(合并单元格、空行、单位符号混在数据里)。系统在spc/upload_handler.py里实现了三层容错解析:

第一层:编码与分隔符自适应
调用chardet.detect()自动识别文件编码(常见GBK/UTF-8/BOM),再用csv.Sniffer().sniff()分析分隔符。曾遇到某日系设备导出的CSV,用全角逗号“,”分隔,Sniffer无法识别,我们加了兜底逻辑:若检测失败,则依次尝试逗号、分号、制表符、全角逗号,直到成功读取前10行。

第二层:标题行智能定位
不强制要求第一行为标题。算法扫描前20行,寻找包含“测量值”、“尺寸”、“直径”、“time”、“date”等关键词的行作为标题行;若未找到,则假设第1行为标题,并对首列数据类型做分布分析(如95%为时间戳格式,则判定为时间列)。

第三层:数据清洗与类型转换
这是最耗时也最关键的环节。以一段真实日志为例:

# 原始CSV片段(来自某注塑机) "序号","时间","温度(℃)","压力(MPa)","合格" "1","2024/05/20 08:02:15","230.5","12.3","合格" "2","2024/05/20 08:03:22","231.2","12.1","不合格" "3","2024/05/20 08:04:30","230.8","12.4","合格"

系统会:
- 自动忽略“序号”列(纯索引,无统计意义);
- 将“时间”列解析为datetime对象,用于后续按时间分组;
- 提取“温度(℃)”列数值,剔除单位符号“℃”,转换为float;
- 将“合格/不合格”映射为1/0,供P图计算;
- 对缺失值(如某行“压力”为空),采用前后均值插补(非简单删除),避免破坏时间序列连续性。

整个过程在spc/data_cleaner.py中封装为clean_data(df: pd.DataFrame) -> pd.DataFrame函数,内部使用Pandas向量化操作,处理10万行数据平均耗时1.2秒。我们特意没用Dask或Polars,因为车间电脑装不了这些依赖,纯Pandas+NumPy的组合,兼容性最好。

3.2 控制图计算引擎:纯Python实现的性能与精度平衡

所有计算逻辑集中在spc/calculators/目录,每个图一个模块(如xbar_r.py,p_chart.py)。以Xbar-R图为例,核心函数calculate_xbar_r(data, n)的实现直白但严谨:

def calculate_xbar_r(data: List[List[float]], n: int) -> Dict[str, Any]: # 步骤1:按子组大小n切分数据(data为一维列表,需重组) subgroups = [data[i:i+n] for i in range(0, len(data), n)] if len(subgroups[-1]) < n: # 末尾不足n个,丢弃(SPC标准做法) subgroups.pop() # 步骤2:计算每个子组的Xbar和R xbars = [] rs = [] for sg in subgroups: xbar = sum(sg) / len(sg) r = max(sg) - min(sg) xbars.append(xbar) rs.append(r) # 步骤3:计算总体均值Xbar_bar和R_bar xbar_bar = sum(xbars) / len(xbars) r_bar = sum(rs) / len(rs) # 步骤4:查表获取控制限系数(n=2~10,硬编码在constants.py) from spc.constants import A2, D3, D4 a2 = A2.get(n, 0) d3 = D3.get(n, 0) d4 = D4.get(n, 0) # 步骤5:计算控制限(严格按公式,不简化) ucl_xbar = xbar_bar + a2 * r_bar lcl_xbar = xbar_bar - a2 * r_bar ucl_r = d4 * r_bar lcl_r = d3 * r_bar return { "xbars": xbars, "rs": rs, "xbar_bar": xbar_bar, "r_bar": r_bar, "ucl_xbar": ucl_xbar, "lcl_xbar": lcl_xbar, "ucl_r": ucl_r, "lcl_r": lcl_r, "subgroup_count": len(subgroups) }

注意几个细节:
-不使用scipy.stats:虽然scipy有现成的shapiro检验,但会引入额外依赖,且车间电脑常因缺少VC++运行库而安装失败。所有正态性检验(如I-MR图的移动极差分布检验)都用纯Python实现Shapiro-Wilk统计量计算;
-系数表硬编码A2,D3,D4等系数直接写在spc/constants.py里,避免运行时查表IO开销。例如A2 = {2: 1.880, 3: 1.023, 4: 0.729, ...},精确到小数点后3位,符合GB/T 4091-2001标准;
-浮点精度控制:所有计算结果统一保留4位小数(round(value, 4)),防止前端渲染时因JavaScript浮点误差导致UCL/LCL显示为3.2100000000000003这类诡异数字。

实测对比:用同一组1000个数据,分别用本系统和Minitab 21计算Xbar-R图,UCL_Xbar偏差为0.0002(小于0.01%),完全满足工业精度要求。

3.3 告警规则引擎:如何让系统“主动说话”而非被动展示?

真正的SPC监控不是画完图就结束,而是当过程失控时,第一时间通知责任人。系统在spc/alarm_engine.py里实现了基于规则的实时告警,规则库直接映射alarm.sql中的alarm_rules表:

rule_idchart_typeconditionthresholdactionenabled
1Xbar-Rpoint_outside_ucl1email_alert1
2Xbar-Rtrend_up_7pointsnullsms_alert1
3Pp_value_above_target0.03popup_alert1

condition字段对应7种预设规则:
-point_outside_ucl/lcl:单点超出控制限;
-trend_up/down_npoints:连续n点单调上升/下降(n=7或9);
-hugging_center:连续14点在中心线两侧交替;
-stratification:连续15点落在中心线±1σ内;
-mixture:连续8点全在中心线±1σ外;
-p_value_above_target:P图不合格率超过目标值(如客户要求≤3%);
-process_capability_low:Cpk值低于阈值(如Cpk<1.33)。

告警触发逻辑在计算完成后异步执行:

def trigger_alarms(calc_result: Dict, chart_type: str): rules = get_enabled_rules(chart_type) # 从数据库读取启用规则 alarms = [] for rule in rules: if rule['condition'] == 'point_outside_ucl': # 检查xbars中是否有值 > calc_result['ucl_xbar'] out_points = [i for i, x in enumerate(calc_result['xbars']) if x > calc_result['ucl_xbar']] if out_points: alarms.append({ 'rule_id': rule['rule_id'], 'message': f'Xbar图发现{len(out_points)}个失控点(位置:{out_points})', 'severity': 'high' }) # 其他规则类似... if alarms: send_alerts(alarms) # 调用send_email(), send_sms()等

这里的关键是告警去重与抑制。比如某天上午Xbar图连续触发5次“单点超限”,系统不会发5封邮件,而是聚合为一条:“Xbar图于09:15-11:30期间共发现7个失控点,建议检查夹具磨损”。这个聚合逻辑在spc/alert_aggregator.py里实现,基于时间窗口(默认30分钟)和规则ID分组。另外,alarm.sql中还预置了alarm_suppression表,允许管理员设置“设备保养期间暂停告警”,避免误报。

4. 实操过程与核心环节实现:从零部署到产线运行

4.1 本地快速启动:5分钟完成环境搭建

部署不是程序员的专利,产线IT同事也能操作。以下是给车间IT写的《部署速查卡》,放在Qdo/deploy_checklist.md里:

前置条件
- Windows 7/10/11 或 Ubuntu 20.04+
- Python 3.8+(官网下载安装包,勾选“Add Python to PATH”)
- 磁盘空间 ≥ 500MB

四步启动法
1.解压与进入目录
bash # 解压资源包(如 eNna9u690rg44HphvQ0p-master-bbdfdc6788e5cd6debbf467fca9147ab0d14ed4f.zip) cd eNna9u690rg44HphvQ0p-master-bbdfdc6788e5cd6debbf467fca9147ab0d14ed4f

  1. 创建虚拟环境(隔离依赖,避免污染系统Python)
    bash python -m venv env # Windows激活 env\Scripts\activate.bat # Linux/macOS激活 source env/bin/activate

  2. 安装依赖(仅需一行命令)
    bash pip install -r requirements.txt # requirements.txt已锁定所有版本,如 flask==2.3.3, pandas==2.0.3

  3. 初始化数据库并启动
    ```bash
    # 执行SQL脚本(自动创建表结构和测试数据)
    sqlite3 instance/spc.db < spc-dashboard.sql
    sqlite3 instance/spc.db < alarm.sql

# 启动服务(默认端口5000,–host=0.0.0.0允许局域网访问)
python run.py –host=0.0.0.0 –port=5000
```

启动后,浏览器打开http://localhost:5000http://[工控机IP]:5000,即可看到登录页。首次登录账号:admin/admin123(首次登录强制修改密码)。整个过程,我亲自在车间用一台i3-2120老电脑实测,耗时4分38秒。

提示:如果启动报错“sqlite3.DatabaseError: database is locked”,说明有其他程序(如Windows搜索索引)占用了instance/spc.db。解决方案:关闭Windows搜索服务,或把instance目录移到非系统盘(如D:\spc\instance),并在config.py中修改INSTANCE_PATH = 'D:/spc/instance'

4.2 数据上传实战:一张图看懂如何准备你的CSV

上传数据是用户接触系统的第一个动作,必须零学习成本。系统在templates/home/upload.html里嵌入了动态示例:

正确CSV格式(推荐)

timestamp,measurement 2024-05-20 08:00:00,23.5 2024-05-20 08:01:00,23.7 2024-05-20 08:02:00,23.4 ...
  • 第一行为标题(可任意命名,系统自动识别)
  • 时间列:支持YYYY-MM-DD HH:MM:SSYYYY/MM/DD HH:MMMM/DD/YYYY HH:MM:SS等多种格式
  • 测量列:纯数字,可含小数点,禁止单位符号(如“23.5mm”需改为“23.5”)
  • 行数不限,但单文件建议≤5万行(超大会触发前端进度条)

常见错误及修复
- ❌ 错误1:Excel另存为CSV时,中文标题乱码(GBK编码)
✅ 修复:用记事本打开CSV → “另存为” → 编码选“UTF-8”
- ❌ 错误2:数据中有空行或“#注释行”
✅ 修复:删除所有空行,删掉以#开头的行
- ❌ 错误3:测量值列混入“NG”、“PASS”等文本
✅ 修复:用Excel筛选出文本行,手动修正为数值,或改用P图(需合格/不合格列)

我们甚至在上传按钮旁加了“生成示例CSV”功能:点击后,前端JavaScript自动生成一个含100行模拟数据的CSV(时间从当前时刻起每分钟递增,测量值按正态分布随机),用户可直接下载、修改、上传。这个小功能,让第一次使用的班组长王师傅,5分钟内就完成了他的首张Xbar-R图。

4.3 控制图交互详解:不只是看图,更是诊断工具

系统前端不是静态图片展示,而是可深度交互的诊断面板。以Xbar-R图为例(templates/spc/xbar_r.html):

左侧控制参数区
- 子组大小(n):下拉菜单提供2~10常用值,默认根据数据长度智能推荐(如500个点,默认n=5,得100子组)
- 控制限系数k:可调1~3(对应±1σ, ±2σ, ±3σ),默认k=3(常规控制限)
- 中心线类型:可选“Xbar_bar”(总体均值)或“target”(工艺目标值,如客户指定的23.5mm)

右侧图表区
- 主图(Xbar图):蓝色折线为Xbar序列,红色虚线为UCL/LCL,绿色实线为中心线
- 底部小图(R图):灰色折线为R序列,辅助判断组内变异是否受控
- 右键菜单:
- “导出PNG”:保存当前视图为高清图片(用于报告)
- “导出CSV”:下载计算结果(含每子组Xbar/R值、是否失控)
- “查看原始数据”:弹出表格,显示对应子组的所有原始测量值

最实用的功能:失控点钻取
当鼠标悬停在某个红色失控点上,tooltip显示:

子组 #42 (2024-05-20 14:20:00) Xbar = 24.82 > UCL = 24.15 (超出0.67) 原始数据: [24.5, 24.7, 24.9, 25.1, 24.6]

点击该tooltip,页面自动滚动到templates/content/raw_data.html,展示子组#42的全部5个原始值,并高亮最大值25.1——这往往指向测量误差或设备瞬时故障。某次在电机厂,正是通过这个功能,发现是三坐标测量仪探针在14:20时被油污污染,导致连续3个点偏高,及时清洁后恢复正常。

4.4 用户与权限管理:为什么只有两级权限?

系统采用极简权限模型:管理员(admin)普通用户(user),没有“质量工程师”、“产线主管”等中间角色。原因很现实:在车间,权限不是按职级,而是按操作风险划分。

  • 管理员:可执行所有操作,包括:
  • 创建/删除用户(/admin/users
  • 配置告警规则(/admin/alarms
  • 查看全部操作日志(Logs/目录下的app.log
  • 手动触发数据库备份(/admin/backup,生成bak/spc-bak-20240520-142000.zip

  • 普通用户:仅限数据操作,包括:

  • 上传/查看自己的数据(/home/upload,/home/history
  • 修改个人资料(头像、密码)
  • 查看自己触发的告警记录(/user/alerts

这种设计杜绝了权限滥用风险。曾有个案例:某厂质量部想给巡检员开通“修改控制限”权限,结果新人误把UCL系数k从3改成1,导致整条产线报警狂响。我们的方案是:所有控制限参数由管理员在/admin/config统一配置,普通用户只能选择“启用/禁用”该配置,不能修改数值本身。这样既保障安全,又不失灵活性。

头像管理也体现务实精神:avatar/目录下,每个用户ID对应一个文件夹(如avatar/123/),上传的头像自动缩放为128x128像素(PIL.Image.resize()),并保存为WebP格式(比JPEG小30%,加载更快)。没有复杂的CDN分发,就是简单的本地文件读取,确保在离线环境下也能正常显示。

5. 常见问题与排查技巧实录:那些文档里不会写的坑

5.1 启动失败类问题:从“ImportError”到“Port already in use”

问题1:启动时报错ImportError: No module named 'flask'
这是最常见问题,90%是因为没激活虚拟环境。检查命令行提示符:
- 正确:(env) C:\spc>(括号里是环境名)
- 错误:C:\spc>(没括号)
✅ 解决:Windows运行env\Scripts\activate.bat,Linux/macOS运行source env/bin/activate

问题2:启动时报错OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试
这是Windows防火墙阻止了端口绑定。
✅ 解决:以管理员身份运行CMD,执行:

netsh advfirewall firewall add rule name="SPC Port 5000" dir=in action=allow protocol=TCP localport=5000

问题3:浏览器打不开,提示“连接被拒绝”
先确认服务是否真在运行:
- Windows:打开任务管理器 → “详细信息”页 → 查找python.exe进程,右键“打开文件所在位置”,确认是spc\env\Scripts\python.exe
- Linux:执行ps aux | grep run.py
若进程存在但打不开,大概率是端口被占。执行:

# Windows netstat -ano | findstr :5000 # Linux/macOS lsof -i :5000

找到PID,然后杀掉:taskkill /PID <PID> /F(Win)或kill -9 <PID>(Linux/macOS)

注意:不要用pip install flask --upgrade升级Flask!requirements.txt里锁定了flask==2.3.3,升级到2.4+会导致flask-migrate不兼容,数据库迁移失败。所有依赖升级必须同步修改requirements.txt并全量测试。

5.2 数据解析类问题:为什么我的CSV总报错?

问题1:上传后提示“无法识别数据列,请检查格式”
这是标题行识别失败。系统默认扫描前20行找关键词,但如果您的CSV第一行是“产品编号,批次号,测量值”,而“测量值”不在关键词库里,就会失败。
✅ 解决:打开CSV,把第一行改成"time","value"(时间列可叫time/timestamp/date,测量列可叫value/measurement/data),再上传。

问题2:Xbar图显示空白,但R图有数据
这通常意味着子组大小n设置错误。例如您有500个点,设置了n=3,那么500÷3=166.66,系统会丢弃最后2个点(因不足3个),得到166个完整子组。但如果n设成4,500÷4=125,刚好整除。
✅ 解决:在上传页面的“子组大小”下拉菜单里,尝试切换n值(2,3,4,5…),观察“子组数量”预览是否合理(一般100~200子组最佳)。

问题3:P图计算结果全是0或NaN
P图要求输入“合格/不合格”二值数据。如果您上传的是"1","0","1","1",没问题;但如果是"PASS","FAIL","PASS",系统无法自动映射。
✅ 解决:用Excel把“PASS/FAIL”替换为1/0,或改用NP图(需固定样本量n,如每批抽检50件,则输入50,1,50,0,50,1...)。

5.3 图表显示类问题:为什么我的图是乱码或不刷新?

问题1:图表中文字显示为方框(□□□)
这是字体缺失。系统默认用"Microsoft YaHei", "SimSun",但某些精简版Windows没有微软雅黑。
✅ 解决:打开static/css/custom.css,找到@font-face规则,把字体列表扩展为:

font-family: 'SPC Font'; src: local("Microsoft YaHei"), local("SimSun"), local("Noto Sans CJK SC"), url("../fonts/NotoSansCJKsc-Regular.woff2") format("woff2");

然后把resource/fonts/NotoSansCJKsc-Regular.woff2复制到static/fonts/目录。Noto字体开源免费,完美支持中文。

问题2:上传新数据后,图表不刷新,还是旧图
这是浏览器缓存导致。Chrome对/spc/chart-data这类API响应缓存很强。
✅ 解决:在spc/routes.py/spc/chart-data路由上,添加强制不缓存头:

@app.route('/spc/chart-data') def chart_data(): response = make_response(jsonify(data)) response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate' response.headers['Pragma'] = 'no-cache' response.headers['Expires'] = '0' return response

(该代码已在eNna9u690rg44HphvQ0p-master-bbdfdc6788e5cd6debbf467fca9147ab0d14ed4fspc/routes.py第89行实现)

5.4 性能优化类问题:如何让老电脑跑得更稳?

问题:在i3-2120电脑上,上传1万行CSV要等5秒,体验差
这是磁盘IO瓶颈。uploads/目录默认在项目根目录,而老电脑系统盘(C盘)通常是机械硬盘。
✅ 解决:将uploads目录移到固态硬盘(如D盘),并在config.py中修改:

UPLOAD_FOLDER = 'D:/spc/uploads'

实测:从C盘机械硬盘迁移到D盘SSD后,1万行CSV上传+计算时间从5.2秒降至0.8秒。

问题:同时开3个浏览器标签页,系统变卡顿
Flask默认单线程,多标签会排队。
✅ 解决:启动时启用多线程:

python run.py --host=0.0.0.0 --port=5000 --threaded

或修改run.py,在app.run()中添加threaded=True参数。线程数默认为CPU核心数,i3双核即开2线程,足够应付车间日常。

最后分享一个小技巧:如果车间网络不稳定,担心上传中断,可在spc/upload_handler.pysave_upload_file()函数里,加入断点续传逻辑。我们预留了resume_token参数接口,但默认未启用——因为99%的车间局域网足够稳定,过度设计反而增加复杂度。真正的工程智慧,是知道什么时候该“做减法”。

6. 扩展与定制指南:你的SPC系统,你说了算

这套系统不是终点,而是起点。它的目录结构和模块化设计,就是为了让你能轻松定制。比如某医疗器械厂提出需求:“我们要监控灭菌柜的温度曲线,需要一张‘温度-时间’散点图,带上下限报警线。” 我们只用了2小时就交付:

  1. 新增图表类型:在spc/calculators/下创建temp_profile.py,实现calculate_temp_profile(data)函数,输入为[(time1, temp1), (time2, temp2), ...],输出含upper_limit/lower_limit
  2. 新增前端模板:复制templates/spc/xbar_r.htmltemplates/spc/temp_profile.html,修改图表渲染逻辑,用Chart.js的line类型绘制温度曲线;
  3. 新增路由:在spc/routes.py里加@app.route('/spc/temp-profile'),调用新计算器;
  4. 更新导航:在templates/base.html的侧边栏添加链接。

全程无需重启服务,热加载生效。这就是Flask轻量架构的优势——没有厚重的框架约束,你的业务逻辑就是核心。

如果你需要对接PLC,spc/plc_connector.py已预留Modbus TCP客户端接口(基于pymodbus),只需配置IP和寄存器地址,就能定时抓取实时数据;如果需要微信告警,spc/notification/wechat.py里封装了企业微信机器人API,填入webhook URL即可;甚至多语言支持,translations/zh/LC_MESSAGES/messages.potranslations/en/LC_MESSAGES/messages.po已就绪,用pybabel compile -d translations即可编译生效。

它不是一个黑盒软件,而是一套可生长的SPC骨架。你往里填什么数据、加什么逻辑、连什么设备,它就变成什么样子。就像车间里那台用了十年的铣床,换上新刀具、新夹具,依然能加工出精密零件——这套系统,也值得你投入时间,把它变成真正属于你们产线的“过程稳定性伙伴”。

本文还有配套的精品资源,点击获取

简介:一套开箱即用的统计过程控制(SPC)软件,用Python Flask构建,专注制造业和质检场景的过程稳定性监测。系统能上传CSV或Excel格式的质量数据,自动完成Xbar-R、Xbar-S、I-MR、P、NP、C、U等常用控制图的计算,并实时渲染折线图、散点图等可视化结果。前端采用Bootstrap+jQuery搭建响应式界面,集成文件上传、用户头像管理、操作日志记录、静态资源分发等功能;后端包含完整数据库迁移脚本(基于Flask-Migrate)、环境隔离(env目录)、调试开关、备份机制(bak)、上传文件存储(uploads)、样式与脚本资源(css/js/fonts/jquery插件)以及多语言支持基础结构。所有统计逻辑均在Python中实现,不依赖外部服务,可本地部署运行。配套提供spc-dashboard.sql和alarm.sql数据库初始化脚本,支持快速导入测试数据与告警规则。适用于工厂产线巡检、质量工程师日常分析、高校SPC教学演示等实际需求。


本文还有配套的精品资源,点击获取

http://www.zskr.cn/news/1501906.html

相关文章:

  • KiTTY专业指南:从基础连接到高级自动化的工作流优化
  • ctf show web入门157 158
  • 耐用的UPE加工件与超高分子量聚乙烯加工件行业口碑分析:企业实力与产品应用研究 - 优质品牌商家
  • 鸿蒙5.0 ArkTS应用工程模板:含完整构建配置、多端资源适配与hypium自动化测试支持
  • 六店实测:2026广州黄金回收市场深度探访 - 余生黄金回收
  • 前端加密是摆设吗?用CryptoJS和Node.js实现AES对手机号的双端加解密(完整流程)
  • 广州黄金回收实测:六家正规机构测评报告 - 余生黄金回收
  • 2026年 河南上料机源头厂家推荐:深度解析自动上料机/小型粉末上料机/真空颗粒上料机/医药化工与新能源行业专业品牌榜单! - 品牌发掘
  • XR20M1170 SPI转UART驱动源码:寄存器级控制+标准API,适配STM32/GD32等MCU裸机与RTOS
  • 不止于看电视:利用OpenWrt/爱快路由搭建udpxy服务器,实现IPTV直播流全网共享
  • ctf show web入门159
  • 广州黄金回收市场实地走访:哪家更靠谱 - 余生黄金回收
  • 洛雪音乐音源完全指南:三步解锁全网免费无损音乐
  • 护理考研资料百度网盘|参考书|资料|资料已整理
  • HarmonyOS6 实战案例之HSV 颜色模型到底在算什么?ColorUtils 代码逐行拆解
  • 质量好的潜水排污泵厂家哪家好?2026年行业厂商综合能力分析 - 优质品牌商家
  • 5个技巧掌握Pywinauto:Windows自动化测试的终极指南
  • 火箭六自由度姿态仿真MATLAB工具包:含气动力建模、四元数解算与PID闭环控制
  • 2026广州黄金回收市场红黑榜实测 - 余生黄金回收
  • 终极免费解决方案:3分钟搭建个人专属付费墙绕过工具
  • C#写的30个PPT式图片切换动画源码,拉幕旋转分块淡入全都有
  • 2026免费抠图软件保姆级教程:电脑手机在线无水印,一篇搞定
  • 抖音无水印下载神器:批量保存视频、直播、音乐的全能解决方案
  • FPGA做FFT时,你的输入数据格式对了吗?手把手解决锯齿波分析的实部虚部拼接问题
  • 快速定位Windows热键冲突的终极解决方案:Hotkey Detective完全指南
  • 手把手教你为山景BP1048芯片实现OTA升级(附完整代码解析与避坑指南)
  • 期货量化薄盘口假突破怎么过滤:天勤 quote 五档量与点差阈值
  • 2026年口碑好的黄山风景区中餐美食/黄山风景区美食美食推荐 - 品牌宣传支持者
  • 2026年热门的数控液压机/液压机源头工厂推荐 - 品牌宣传支持者
  • 2026年华为云OpenClaw/Hermes Agent配置Token Plan搭建全流程分享