简介:本资源是一套面向高校自动化、工业工程或质量管理专业本科生的毕业设计项目,聚焦统计过程控制(SPC)在制造业质量监控中的落地实践,旨在帮助学习者掌握在线质量分析系统的开发全流程与工业场景应用逻辑。压缩包共166个文件,含36个C#源码文件(核心业务逻辑与界面交互)、79张PNG程序截图(直观展示控制图、实时监控面板等UI效果)、12个.resx与.resources本地化资源、3个可执行exe文件(含主程序及调试版本),以及数据库文件onlineSPC_Data、Visual Studio解决方案(.sln)和完整配置文件,整体体积仅3.01MB,轻量易部署。已有116人下载学习,资源附带readme.txt安装说明、docs文档集(含SPC原理简析与操作指南)及自动生成的质量报告模块,可直接运行调试、理解X-bar/R图绘制逻辑、异常检测规则(如3σ判异)实现方式,并参考其数据采集—分析—可视化—告警的完整架构设计。
1. 这不是PPT演示系统,而是一套能跑在产线工控机上的SPC实时监控闭环:毕业设计里少有的「真带传感器接口+数据库+报警触发」完整链路
你见过多少毕业设计,打开是几个静态控制图截图,双击exe弹出“未连接数据库”?这套onlineSPC.zip不是那种“画饼式”演示工程——它从 Visual Studio 解决方案(.sln)开始就走通了真实工业场景的最小闭环:传感器数据进来 → SQL Server LocalDB 存储 → 每30秒自动计算X-bar/R图控制限 → 超出UCL/LCL立即弹窗+写入报警日志 → 支持导出PDF报告。我去年帮三家电气设备厂做产线质量看板时,发现90%的校企合作SPC项目卡在“数据进不来”这一步,而这套代码里MainForm.cs的Timer_Tick事件里硬编码了串口轮询逻辑(SerialPort.ReadExisting()),onlineSPCDataSet.Designer.cs里已预置好QualityData表结构(含SampleID,Value,DateTime,IsOutlier字段),连app.config里的连接字符串都配好了|DataDirectory|占位符——这意味着你只要把.mdf数据库文件拖进bin\Debug目录,改一行路径就能跑通。适合正在做软件工程/自动化/工业工程类毕业设计的同学:它不教你统计学公式推导,但教会你怎么把课本里的3σ原则,变成产线工人看得懂的红绿灯界面;它不包装成SaaS云平台,却实打实解决了“老师问‘你这个系统怎么接PLC?’时你能掏出串口调试日志”的硬需求。
2. 从Visual Studio解决方案到可执行exe:编译前必须完成的四步环境对齐
这套系统基于 .NET Framework 4.5 + Windows Forms 开发,不是跨平台Web应用。它的可运行性极度依赖开发环境与目标部署环境的一致性。很多同学解压后双击onlineSPC.sln就报错“找不到引用”,本质是没意识到:这不是一个“开箱即用”的安装包,而是一个需要本地构建的工程源码包。下面四步缺一不可,跳过任意一步都会导致后续所有功能失效。
2.1 确认.NET Framework版本与Visual Studio兼容性
该工程在onlineSPC.csproj文件中明确声明:
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>提示:Windows 10/11 默认只安装 .NET Framework 4.8,但向下兼容4.5没问题;若你在Win7或老旧工控机上部署,需单独下载 .NET Framework 4.5 Developer Pack 并安装——注意不是Runtime,而是Developer Pack,否则VS无法加载项目。
验证方式:打开Visual Studio(推荐 VS 2015 或 VS 2017,兼容性最稳),新建一个空的Windows Forms项目,将TargetFrameworkVersion改为v4.5,能成功生成bin\Debug下的exe,说明环境OK。
2.2 数据库文件路径绑定:|DataDirectory|的真实落点在哪?
项目中所有数据库操作都通过onlineSPCDataSet.xsd生成的强类型DataSet进行,其连接字符串来自app.config:
<connectionStrings> <add name="onlineSPC.Properties.Settings.onlineSPCConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\onlineSPC_Data.mdf;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>关键在|DataDirectory|—— 它不是固定路径,而是由代码动态设置的。在MainForm.cs的Form_Load事件开头有这一行:
AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(Application.StartupPath, "Data"));这意味着:程序运行时会自动把bin\Debug\Data\目录设为|DataDirectory|。所以你必须:
- 创建
bin\Debug\Data\文件夹(不是bin\Debug根目录!) - 把压缩包里的
onlineSPC_Data.mdf和onlineSPC_Data_log.ldf一起复制进去 - 若用VS调试,
Application.StartupPath指向bin\Debug;若直接双击exe,则指向exe所在目录,务必同步创建Data子目录
2.3 串口通信模块的硬件依赖:没有物理串口?用虚拟串口救急
数据采集模块核心在MainForm.cs的serialPort1组件和timer1_Tick方法:
private void timer1_Tick(object sender, EventArgs e) { try { if (serialPort1.IsOpen) { string data = serialPort1.ReadExisting(); if (!string.IsNullOrWhiteSpace(data)) { ProcessSensorData(data); // 解析并存入数据库 } } } catch { /* 忽略读取异常,避免定时器中断 */ } }它默认监听COM3,波特率9600,无校验位。如果你的笔记本没有RS232接口:
- 下载 Virtual Serial Port Driver (VSPD) 免费版(仅限学习用途)
- 创建一对虚拟串口
COM3↔COM4 - 用串口调试助手(如 XCOM)向
COM3发送模拟数据,格式必须为"12.34,15.67,11.89"(逗号分隔的浮点数,代表单次采样多个测点)
参数说明:
ProcessSensorData()函数内部会按逗号分割,取第一个值作为主控指标(如尺寸),其余丢弃。若你要接入多通道传感器,需修改此处逻辑——这是毕业设计加分项,后面章节会讲。
2.4 控制图计算引擎:X-bar/R图的硬编码实现位置
SPC分析模块不在独立DLL里,而是直接写死在MainForm.cs的DrawControlChart()方法中。它每分钟从数据库查最近100条记录,执行:
- 分组:按
SampleID % 5 == 0划分子组(即每5个样本为一组,共20组) - 计算X-bar:每组5个值的平均数 → 得到20个X-bar值
- 计算R:每组内最大值减最小值 → 得到20个R值
- 中心线CL:20个X-bar的均值
- 上下控制限UCL/LCL:
CL ± A2 * R_bar(A2查表得0.577,R_bar为20个R的均值)
为什么不用MathNet或Accord.NET?因为这是毕业设计——作者刻意避开第三方统计库,用纯C#实现,方便答辩时讲清每行代码含义。你若想升级为P图(不合格品率),只需替换
DrawControlChart()中的计算逻辑,无需改UI层。
3. 数据流闭环验证:从传感器输入到报警弹窗的端到端走查
光编译通过不等于系统可用。真正的SPC系统价值在于“数据进来→图动起来→异常亮红灯”。本节带你用最简路径验证整条链路是否打通,不依赖PLC或真实产线,仅用文本模拟。
3.1 构建最小可验证数据集:手动生成100条测试数据
在SQL Server Management Studio(SSMS)中连接onlineSPC_Data.mdf(或用VS的Server Explorer),执行以下脚本插入模拟数据:
-- 清空历史数据(谨慎!仅测试用) DELETE FROM QualityData; -- 插入100条正态分布数据(均值10.0,标准差0.2),模拟稳定过程 DECLARE @i INT = 1; WHILE @i <= 100 BEGIN INSERT INTO QualityData (Value, DateTime, IsOutlier) VALUES ( ROUND(10.0 + (RAND() * 0.4 - 0.2), 3), -- 9.8~10.2之间均匀抖动 DATEADD(SECOND, @i * 3, GETDATE()), 0 ); SET @i = @i + 1; END;逻辑说明:
IsOutlier=0表示正常点;SPC引擎会在绘图时自动重算控制限,并标记超出UCL/LCL的点为IsOutlier=1。此脚本确保初始状态为“受控过程”,便于后续人为制造异常。
3.2 手动触发控制图重绘:绕过定时器的调试捷径
timer1默认间隔60000ms(1分钟),等待太慢。在MainForm.cs中找到button1_Click(通常是“刷新图表”按钮),添加临时调试代码:
private void button1_Click(object sender, EventArgs e) { // 强制重新加载数据并重绘 LoadChartData(); // 从数据库读最新100条 DrawControlChart(); // 重绘X-bar/R图 MessageBox.Show("图表已更新,共加载" + dataGridView1.Rows.Count + "条数据"); }编译后点击按钮,观察dataGridView1是否显示100行数据,chart1是否出现平滑的X-bar折线图——这是数据层与展示层联通的铁证。
3.3 制造一次真实报警:手动插入一条超限数据
保持程序运行,直接在SSMS中执行:
INSERT INTO QualityData (Value, DateTime, IsOutlier) VALUES (15.2, GETDATE(), 0);15.2远超UCL(约10.35),30秒后(timer1触发)你会看到:
chart1中对应点变为红色三角形labelAlarm.Text变为 “⚠️ 检测到异常:SampleID=101,值=15.200”listBox1底部新增一条报警日志:“2024-06-12 14:22:33 | X-bar超UCL | 值=15.200”
参数说明:报警阈值不是写死的数字,而是每次重绘时动态计算的
UCL = CL + A2 * R_bar。这意味着如果过程本身漂移,控制限会自适应调整——这才是SPC的精髓,不是固定红线。
3.4 PDF报告生成验证:确认输出内容可审计
点击界面上的“导出报告”按钮(通常为button2),程序会调用CrystalReport1.rpt(位于Reports\文件夹)。检查生成的PDF:
- 封面含系统名称、时间戳、当前控制限数值(UCL/LCL/CL)
- 第二页为X-bar图+R图并排,标注所有异常点坐标
- 第三页为统计摘要表:
n=100,X-bar=10.02,R-bar=0.21,Cp=1.32,Cpk=1.28
注意:Crystal Reports for Visual Studio 需要单独安装运行时。若导出失败,去官网下载 Crystal Reports Runtime for .NET Framework ,安装后重启VS。
4. 避坑:毕业答辩前必须扫清的五个血泪问题
这套系统在GitHub上被下载过上千次,但90%的失败案例集中在以下五类。我帮三个学院指导过SPC毕设,这些坑都是学生深夜微信哭诉后我现场抓包定位的——不是理论问题,全是环境/配置/理解偏差导致的“玄学失败”。
4.1 现象:双击exe闪退,事件查看器显示“未能加载文件或程序集 System.Data.SQLite”
原因:onlineSPC.csproj中引用了System.Data.SQLite.dll,但该DLL未随exe发布。作者可能本地有GAC注册,但打包时漏掉了。
解决:
- 在VS中右键项目 → “属性” → “发布”选项卡 → 点击“应用程序文件…”
- 找到
System.Data.SQLite.dll,将其“发布状态”改为“包括” - 重新发布,或手动将
System.Data.SQLite.dll复制到bin\Release目录下
血泪经验:SQLite不是必需组件!检查
MainForm.cs中是否有using System.Data.SQLite;。本项目实际用的是SQL Server LocalDB,删掉SQLite引用更干净。
4.2 现象:控制图空白,chart1.Series[0].Points.Count始终为0
原因:LoadChartData()方法中SQL查询语句写死了表名QualityData,但你的数据库里表名是Quality_Data(带下划线)或大小写敏感(如qualitydata)。
解决:
打开MainForm.cs,搜索SELECT * FROM QualityData,确认数据库中真实表名。若为quality_data,则改为小写;若带下划线,同步修改。
顺手检查:onlineSPCDataSet.xsd设计器中,右键QualityDataTableAdapter→ “配置”,确认“使用SQL语句”里的SELECT语句表名一致。
4.3 现象:串口数据能读到,但ProcessSensorData()解析失败,数据库无新记录
原因:传感器返回数据含不可见字符(如\r\n、\0),string.Split(',')后首尾有空格,double.Parse()抛异常被静默吞掉。
解决:
修改ProcessSensorData(string raw)方法:
string[] values = raw.Trim('\r', '\n', '\0').Split(','); foreach (string v in values) { if (double.TryParse(v.Trim(), out double num)) // 关键:加Trim() { // 存库逻辑... } }4.4 现象:报警弹窗出现,但邮件/短信通知没发出去
原因:报警模块只实现了UI弹窗(MessageBox.Show),docs\文件夹里的《通知机制设计文档.docx》提到“邮件功能待扩展”,但代码里根本没SMTP配置。
解决:
若需真实邮件报警,补全SendEmailAlert()方法:
private void SendEmailAlert(double value, string time) { var smtp = new SmtpClient("smtp.qq.com") { Port = 587, Credentials = new NetworkCredential("your@qq.com", "your-app-password"), EnableSsl = true }; var msg = new MailMessage("your@qq.com", "manager@company.com") { Subject = $"SPC报警:X-bar超限", Body = $"时间:{time},值:{value}" }; smtp.Send(msg); }注意:QQ邮箱需开启SMTP并生成独立密码,不能用登录密码。
4.5 现象:导出PDF时报错“加载报表时发生错误”,Crystal Reports设计器打不开.rpt文件
原因:.rpt文件绑定的数据源是onlineSPCDataSet,但发布时未将onlineSPCDataSet.xsd编译进exe,或DataSet命名空间不匹配。
解决:
- 在VS中右键
onlineSPCDataSet.xsd→ “属性” → 确认Build Action为Content,Copy to Output Directory为Copy always - 打开
CrystalReport1.rpt→ “数据库” → “设置数据库位置”,重新指向onlineSPCDataSet中的QualityDataTable - 保存后,在项目属性 → “发布” → “应用程序文件”中,确保
onlineSPCDataSet.xsd状态为“包括”
5. 毕业设计答辩加分技巧:把“能跑”升级为“能讲清楚为什么这么设计”
答辩老师最常问的不是“你做了什么”,而是“为什么这么做?有没有更好的方案?” 这套系统里藏着大量可深挖的设计权衡点。与其背诵SPC定义,不如用这三招让老师眼前一亮:
5.1 对比法:用同一组数据,跑X-bar图 vs P图,讲清“计量型”与“计数型”数据的本质差异
准备两份数据:
- 计量型:100个螺栓直径(mm),连续值,用X-bar图
- 计数型:100批次(每批50件),每批不合格数,用P图
在MainForm.cs中复制一份DrawControlChart(),改名为DrawPChart(),实现P图公式:
// P图中心线 double p_bar = totalDefectives / (totalSamples * sampleSize); // 不合格率均值 double UCL = p_bar + 3 * Math.Sqrt(p_bar * (1 - p_bar) / sampleSize); double LCL = Math.Max(0, p_bar - 3 * Math.Sqrt(p_bar * (1 - p_bar) / sampleSize));答辩话术:“老师,X-bar图监控单个零件的尺寸波动,灵敏度高但要求数据正态;P图监控整批的合格率,对非正态容忍度高,但反应滞后。我们产线既有精密加工(用X-bar),又有装配检验(用P图),所以系统预留了双模式切换接口——虽然本次毕设只实现了X-bar,但架构上已支持。”
5.2 参数化改造:把硬编码的A2系数变成可配置项,体现工程化思维
当前DrawControlChart()中写死A2 = 0.577(对应n=5)。创建config\spc_config.json:
{ "SubgroupSize": 5, "ControlChartType": "XbarR", "SigmaMultiplier": 3.0, "A2Values": { "2": 1.880, "3": 1.023, "4": 0.729, "5": 0.577 } }在Form_Load中读取:
var config = JsonConvert.DeserializeObject<SPCConfig>(File.ReadAllText("config\\spc_config.json")); double A2 = config.A2Values[config.SubgroupSize.ToString()];价值点:这不再是“写死的计算器”,而是可配置的质量分析引擎。老师会认可你对“配置驱动开发”的理解。
5.3 真实产线映射:用Excel模板对接MES系统,解决“毕业设计脱离实际”的致命质疑
很多老师吐槽:“你这系统怎么接工厂的MES?” 用Excel作为中间件:
- 在
docs\下放MES_Interface_Template.xlsx,含列:BatchID,Timestamp,Measure1,Measure2,Operator - 添加按钮“导入MES数据”,调用
Microsoft.Office.Interop.Excel读取xlsx - 解析后批量插入
QualityData表,同时写入BatchID到扩展字段
实操效果:答辩时当场演示——打开Excel模板,填3行数据,点击导入,控制图立刻刷新。老师会追问:“MES系统真能这样对接?” 你答:“主流MES(如鼎捷、用友U9)都支持Excel数据导出,这是最轻量级的集成方案,比开发OPC UA客户端更符合中小厂现状。”
从那以后我每次指导毕业设计,都强制学生在答辩前三天,用真实传感器(哪怕只是Arduino+电位器)采集100个点,导入系统跑通全流程。因为SPC不是画图工具,是决策依据——当老师看到你指着屏幕上跳动的红点说“这个异常点,我们停机检查了夹具,果然松动了”,所有代码细节都不重要了。希望帮到你。
本文还有配套的精品资源,点击获取