资讯动态

宏翔上位机:自动化产线与老化测试的7×24小时稳定数据采集方案

发布时间:2026/10/19 1:08:52 来源:尧图企业网站定制
1. 项目缘起与整体设计思路1.1 为什么会有这个项目在自动化产线和老化测试这个圈子里摸爬滚打这些年我见过太多团队在数据采集和产线控制上栽跟头。要么是PLC和上位机之间通讯不稳定要么是老化测试跑了几百个小时结果数据丢了一大半要么是产线换型时上位机软件改到崩溃。这些问题说到底核心矛盾就一个产线现场需要的是一个能扛住7×24小时运行、能灵活适配不同产品型号、能把数据管得明明白白的上位机系统。“宏翔上位机”这个项目就是在这个背景下启动的。它不是一个通用的组态软件也不是简单的串口调试助手而是一套面向自动化产线和老化测试场景的定制化上位机解决方案。说白了它要干的事就是把产线上各种设备的数据统一收上来按照工艺要求做逻辑判断和控制下发同时把老化测试过程中的关键参数完整记录下来方便后续追溯和分析。这个项目适合谁看如果你是做自动化产线集成的工程师或者负责老化测试工装开发的技术人员又或者你正在被上位机通讯稳定性问题折磨那这篇内容应该能给你一些可以直接抄作业的思路。1.2 整体架构是怎么搭的先说一下整体设计。宏翔上位机采用的是典型的分层架构从上到下大致分为四层界面展示层负责产线状态显示、参数配置、报警提示、报表查询。这一层用的是WPF框架主要考虑是产线现场需要比较流畅的动画和实时刷新WinForm在大量数据刷新时容易卡顿。业务逻辑层这是核心包含设备通讯管理、工艺逻辑处理、老化测试流程控制、数据存储调度等模块。这一层我把它做成了插件式架构不同产线的工艺差异通过配置文件和脚本来实现避免每次换产品都要改主程序。设备通讯层封装了多种通讯协议包括Modbus RTU/TCP、西门子S7协议、三菱MC协议、欧姆龙FINS协议还有TCP自由协议和串口自由协议。这一层的关键是统一接口上层业务逻辑不关心底层用的是哪种协议只调用统一的读写接口。数据持久层用了SQLite做本地缓存MySQL做集中存储。老化测试的数据量大如果直接往MySQL写网络波动时容易丢数据所以先在本地SQLite落盘再异步同步到MySQL。注意分层架构的好处是每层可以独立替换。比如后面如果要换通讯协议只需要在设备通讯层增加一个实现类上层代码完全不用动。1.3 为什么选这些技术栈技术选型这块我踩过不少坑说几个关键决策为什么用WPF而不是WinForm产线现场对界面流畅度要求其实不低特别是老化测试界面需要实时刷新几十个通道的温度、电压、电流曲线。WinForm的GDI绘制在数据量大时帧率掉得厉害WPF的硬件加速渲染在这方面优势明显。另外WPF的数据绑定机制做MVVM模式更自然界面和逻辑分离得更干净。为什么通讯层不用现成的OPC Server早期确实考虑过OPC但实际用下来发现两个问题一是OPC Server的授权费用不低产线上几十个设备节点算下来成本可观二是OPC的通讯延迟在老化测试场景下不太够用有些测试项要求100ms以内的响应OPC绕一圈有时候会超时。所以最后还是自己封装了原生协议驱动。为什么数据存储用SQLiteMySQL组合纯MySQL方案在产线网络抖动时容易丢数据而且老化测试一跑就是几百上千小时数据量很大直接写远程库对网络依赖太重。纯SQLite方案又没法做多产线数据汇总。所以采用本地SQLite做写入缓冲后台线程批量同步到MySQL兼顾了可靠性和集中管理。为什么用插件式架构这是被逼出来的。最早做第一个产线项目时所有逻辑都写死在主程序里结果第二个产线项目来了工艺完全不同改代码改到怀疑人生。后来痛定思痛把工艺逻辑抽象成配置文件和脚本主程序只负责调度不同产线通过加载不同的配置来适配。这个改动让后续项目的交付周期从两周缩短到了两三天。2. 核心功能模块拆解与实操要点2.1 设备通讯管理模块设备通讯是上位机的地基这块不稳后面全是白搭。宏翔上位机的通讯管理模块主要解决三个问题多设备并发通讯、断线自动重连、通讯状态实时监控。先说一下多设备并发的实现方式。每个设备实例运行在独立的线程上线程内部维护一个通讯状态机。状态机有四个状态空闲、发送中、等待响应、超时重试。设备之间的通讯互不阻塞某个设备断线了不影响其他设备。断线自动重连这块我的做法是分级重试策略重试级别触发条件重试间隔最大重试次数后续动作一级单次通讯超时100ms3次标记设备通讯异常二级连续3次超时1s5次尝试重新初始化连接三级重新初始化失败10s无限触发报警等待人工介入这个分级策略的好处是偶发的通讯抖动不会触发报警只有持续性的通讯故障才会通知操作人员。实际用下来产线现场因为电磁干扰导致的偶发超时大概占80%这些都被一级重试消化掉了不会干扰正常生产。通讯状态监控这块每个设备实例都会实时更新自己的状态到共享内存界面层定时读取并刷新显示。状态包括连接状态、最后通讯时间、通讯成功率、平均响应时间。这些数据对排查现场问题很有帮助。实操心得调试通讯时一定要把通讯报文记录下来。我在设备通讯层加了一个可开关的报文日志功能调试阶段打开能看到每一帧的原始数据。很多通讯问题看报文一眼就能定位比猜来猜去快得多。2.2 工艺逻辑处理模块工艺逻辑是上位机的灵魂它决定了设备什么时候动、怎么动、动多久。宏翔上位机把工艺逻辑抽象成了状态机脚本的组合模式。状态机负责管理产线的大流程比如待机→上料→定位→加工→检测→下料→待机。每个状态之间的转换条件通过配置文件定义支持时间条件、信号条件、计数条件等多种触发方式。脚本负责处理状态内部的细节逻辑。比如在“加工”状态下需要根据产品型号设置不同的加工参数这些参数通过脚本从数据库读取并下发给设备。脚本用的是Lua选它的原因是轻量、嵌入方便、语法简单现场工程师稍微培训一下就能自己改。这里举一个实际案例。某产线需要根据产品条码自动切换加工配方流程是这样的扫码枪读到条码通过串口发给上位机上位机解析条码提取产品型号信息根据型号从数据库查询对应的加工参数将参数下发给PLC和温控器等待参数生效后启动加工流程这个流程用状态机脚本实现核心配置大概长这样-- 配方切换脚本示例 function OnBarcodeReceived(barcode) local model string.sub(barcode, 1, 6) local recipe db.QueryRecipe(model) if recipe nil then alarm.Raise(配方不存在, model) return false end device.PLC.WriteRegister(100, recipe.Speed) device.TempCtrl.SetTemperature(recipe.Temp) device.PLC.WriteRegister(101, recipe.Pressure) return true end注意事项脚本里不要写死设备地址和寄存器地址这些应该通过配置文件管理。否则换个PLC型号就要改脚本维护成本太高。2.3 老化测试流程控制模块老化测试是宏翔上位机重点优化的场景。老化测试的特点是时间长、通道多、数据量大、异常处理要求高。时间长意味着程序必须足够稳定不能跑着跑着内存泄漏或者线程死锁。通道多意味着要管理大量的设备实例和数据流。数据量大意味着存储和查询都要做优化。异常处理要求高意味着任何异常都不能导致测试中断必须能自动恢复或者安全暂停。老化测试的流程控制我设计成了任务队列模式。每个老化任务包含任务编号、产品型号、测试通道列表、测试参数、测试时长、判定标准。任务启动后上位机为每个通道创建独立的测试线程线程按照预设的测试曲线控制设备输出同时采集设备的响应数据。测试曲线的实现方式我用的是分段线性插值。比如某个测试要求温度从25度升到85度用时30分钟然后保持85度2小时再降到-40度用时1小时保持-40度2小时。这些关键点配置在数据库里程序自动做线性插值每100ms更新一次设定值。数据采集这块每个通道的采样周期可以独立配置最快支持10ms一次。采集到的数据先写入本地SQLite写入时用了批量插入每100条打包一次减少IO次数。后台同步线程每隔30秒把本地数据同步到MySQL。实操心得老化测试最怕的是中途断电或者程序崩溃导致数据丢失。我的做法是每采集一批数据就立即落盘同时记录一个检查点。如果程序异常退出重启后可以从最后一个检查点继续不会丢掉全部数据。2.4 数据管理与报表模块数据管理这块核心需求是存得进、查得快、导得出。存得进前面说了SQLiteMySQL组合。查得快这块我在MySQL里对常用查询字段建了联合索引比如任务编号通道号采集时间这个组合索引基本覆盖了80%的查询场景。导得出这块支持导出Excel和CSV格式导出时用了流式写入避免大数据量时内存爆掉。报表模块支持自定义模板用户可以在界面上拖拽配置报表包含哪些字段、用什么图表展示。这个功能是用了一个开源的报表控件我在上面做了二次开发适配了老化测试的特定需求。这里重点说一下数据压缩。老化测试跑一个月单个通道的数据量大概在500万条左右如果全量存储数据库很快就撑爆了。我的做法是原始数据保留7天7天后的数据做降采样处理每10条取一条同时保留最大值、最小值、平均值。这样数据量降到原来的十分之一但关键信息不丢失。3. 完整实操流程与核心环节实现3.1 从零搭建一个老化测试项目的完整步骤假设现在要搭建一个8通道的老化测试系统测试对象是某种电源模块需要做高温老化和低温老化。我按实际操作顺序来说。第一步硬件连接与通讯测试先把上位机跟设备连起来。这个项目里上位机通过串口连接8台可编程电源通过Modbus TCP连接8台温度采集模块通过西门子S7协议连接一台PLC控制老化房的温度。连接好之后不要急着写业务逻辑先用通讯调试工具把每个设备的通讯都跑通。宏翔上位机内置了一个通讯调试面板可以手动发送指令并查看响应。这一步的目的是确认物理连接没问题、通讯参数配置正确、设备地址没冲突。注意事项串口通讯一定要确认波特率、数据位、停止位、校验位这四个参数跟设备手册一致。我遇到过好几次现场调试不通最后发现是校验位设错了。第二步设备配置在宏翔上位机的设备管理界面添加所有设备实例。每个设备需要配置设备名称、设备类型、通讯协议、连接参数、超时时间、重试次数。以可编程电源为例配置大概是这样配置项值说明设备名称PSU_01电源1号设备类型可编程电源选择对应的驱动通讯协议Modbus RTU串口通讯串口号COM3实际连接的串口波特率9600跟设备手册一致设备地址1Modbus从站地址超时时间500ms超过这个时间认为超时重试次数3超时后重试次数8台电源的配置类似只是串口号和设备地址不同。温度采集模块和PLC的配置也按类似方式添加。第三步测试任务配置在任务管理界面新建一个老化测试任务。需要填写任务名称、产品型号、测试通道数、测试阶段定义、判定标准。测试阶段定义是这个任务的核心。对于电源模块的高低温老化我定义了三个阶段阶段一高温老化。温度设定85度持续时间4小时。电源输出设定为额定电压的110%负载电流为额定电流的80%。阶段二低温老化。温度设定-40度持续时间4小时。电源输出设定为额定电压的90%负载电流为额定电流的80%。阶段三常温测试。温度设定25度持续时间1小时。电源输出在额定电压的90%到110%之间循环变化每个周期5分钟。每个阶段的判定标准包括输出电压偏差不超过±2%输出电流偏差不超过±3%温度波动不超过±2度。第四步测试脚本编写虽然大部分逻辑可以通过配置完成但有些特殊逻辑还是需要脚本。比如这个项目里需要在温度转换阶段做一个渐变控制避免温度突变对产品造成冲击。-- 温度渐变控制脚本 function OnTemperatureTransition(fromTemp, toTemp, duration) local steps duration / 100 -- 每100ms一个步进 local delta (toTemp - fromTemp) / steps for i 1, steps do local currentTemp fromTemp delta * i device.TempCtrl.SetTemperature(currentTemp) sleep(100) -- 检查温度是否跟随 local actualTemp device.TempCtrl.GetTemperature() if math.abs(actualTemp - currentTemp) 5 then alarm.Raise(温度跟随异常, actualTemp, currentTemp) end end end第五步启动测试与监控配置完成后启动测试任务。上位机会自动执行以下流程检查所有设备通讯状态确保全部在线初始化测试数据存储创建对应的数据表按照测试阶段定义依次执行各阶段实时采集数据并显示在监控界面上如果检测到异常根据异常等级决定是报警还是暂停测试监控界面上会显示每个通道的实时曲线、当前测试阶段、剩余时间、已采集数据量等信息。第六步测试完成与报告生成测试完成后上位机自动生成测试报告。报告内容包括测试基本信息、各阶段数据统计、异常记录、判定结果。报告可以导出为Excel或者PDF格式。3.2 产线集成场景的实操要点产线集成跟老化测试有些不同产线更强调实时性和节拍。一条产线可能几十秒就出一个产品上位机必须在节拍时间内完成所有数据采集和控制动作。产线集成的核心是同步。上位机需要跟PLC保持同步PLC负责产线的机械动作控制上位机负责数据采集和工艺参数管理。两者通过信号交互来协调。我通常的做法是在PLC里定义一个握手区域上位机定时读写这个区域。比如PLC把当前工位号、产品状态写入握手区上位机读取后根据工位号和产品状态决定要采集哪些数据上位机采集完成后把采集完成标志写入握手区PLC看到标志后继续下一个动作这个握手机制看起来简单但实际调试时要注意时序问题。上位机的读写周期必须跟PLC的扫描周期匹配否则可能出现数据竞争。我的经验是上位机的读写周期设为PLC扫描周期的2到3倍比较稳妥。实操心得产线调试时一定要在PLC程序里加一个“上位机心跳”检测。如果上位机超过一定时间没有读写握手区PLC就报警并暂停产线。这样可以避免上位机死机后产线还在盲目运行。3.3 数据追溯功能的实现数据追溯是现在产线的标配需求。一个产品出了问题要能查到它是什么时候生产的、用了什么参数、经过了哪些工位、当时的检测数据是什么。宏翔上位机的追溯功能是这样实现的每个产品在进入产线时生成一个唯一的产品序列号这个序列号跟条码绑定。产品经过每个工位时上位机把工位号、时间戳、工艺参数、检测数据都关联到这个序列号上。追溯查询时输入产品序列号或者条码就能看到这个产品的完整生产履历。查询用的是MySQL的关联查询因为数据量比较大我在产品序列表上建了分区按月份分区查询时先定位分区再查具体记录速度很快。数据保留策略方面追溯数据一般要求保留1到3年。我的做法是最近3个月的数据在线存储3个月到1年的数据归档到历史库1年以上的数据压缩后冷存储。4. 常见问题与排查技巧实录4.1 通讯类问题排查通讯问题是最常见的我整理了一个速查表现象可能原因排查方法解决方案完全通讯不上物理连接断开检查线缆、指示灯重新接线通讯时通时断电磁干扰观察是否跟大功率设备启停相关加磁环、换屏蔽线通讯超时超时时间设太短抓报文看响应时间适当增大超时时间数据错误校验方式不对对比设备手册修改校验方式多设备冲突设备地址重复逐个断开测试修改设备地址这里重点说一下电磁干扰导致通讯时通时断的问题。这个在产线现场特别常见尤其是变频器、伺服电机附近的通讯线。我的经验是通讯线一定要用屏蔽双绞线屏蔽层单端接地。如果干扰还是很严重可以在通讯线靠近设备的一端加一个磁环能明显改善。还有一个坑是串口被占用。有时候程序异常退出后串口没有正常释放再次打开就报错。我的做法是在程序启动时先尝试打开串口如果失败就等待几秒再试同时检查是否有其他进程占用了串口。4.2 数据存储类问题排查数据存储的问题主要集中在写入失败和查询缓慢两方面。写入失败最常见的原因是数据库文件被锁或者磁盘满了。SQLite在写入时会加锁如果同时有多个线程在写就可能出现锁等待。我的做法是所有写入操作都通过一个专门的写入线程来执行其他线程把数据放到队列里写入线程从队列取数据写入。这样避免了并发写入的锁竞争。查询缓慢的原因一般是索引没建好或者查询条件太宽泛。我遇到过一个问题查询某个时间段的所有数据因为时间字段没有索引查询花了十几秒。后来在时间字段上建了索引查询时间降到毫秒级。注意事项SQLite的索引会占用额外空间而且会降低写入速度。所以索引不是越多越好只对常用的查询字段建索引。4.3 程序稳定性问题排查上位机跑长时间运行稳定性是头等大事。我遇到过几个典型的稳定性问题内存泄漏程序跑几天后内存占用越来越高。排查方法是定期打印内存使用情况观察哪个模块的内存持续增长。常见的原因是事件订阅后没有取消订阅或者缓存没有设置过期策略。线程死锁程序突然卡死所有界面都不响应。排查方法是抓取线程堆栈看哪些线程在等待锁。常见的原因是多个线程以不同的顺序获取多个锁。解决方法是统一锁的获取顺序或者用超时机制避免无限等待。界面卡顿界面刷新越来越慢。排查方法是看UI线程是否在做耗时操作。常见的原因是在UI线程里做了数据库查询或者文件读写。解决方法是用异步操作把耗时操作放到后台线程。4.4 老化测试中的特殊问题老化测试有一些特有的问题这里单独说一下。温度过冲在温度转换阶段实际温度超过设定值。原因是温控器的PID参数没调好或者温度变化速率设得太快。解决方法是调整PID参数或者降低温度变化速率。数据断点测试过程中数据突然中断过一段时间又恢复。原因是设备通讯中断上位机在重连。解决方法是检查通讯线路或者增大重试次数。测试中断后无法恢复程序崩溃后重启测试无法从断点继续。原因是检查点数据没有正确保存。解决方法是在每个测试阶段结束时保存检查点重启后从最后一个检查点恢复。实操心得老化测试开始前一定要做一次完整的预测试跑一个短时间的循环确认所有设备、所有通道、所有逻辑都正常。预测试能发现90%的问题避免正式测试跑了几百小时后才发现问题。5. 工具选型与配置管理经验5.1 开发工具与运行环境开发工具这块我用的是Visual Studio 2022主要考虑是对WPF和C#的支持最好。版本控制用的是Git配合GitLab做代码管理。CI/CD这块因为上位机软件不像Web应用那样频繁发布所以没有做全自动的流水线但是做了自动构建和自动打包每次提交代码后自动编译并生成安装包。运行环境方面上位机要求Windows 10及以上推荐Windows 10 LTSC版本因为LTSC版本没有应用商店和Cortana这些用不到的功能系统资源占用低稳定性好。.NET Framework版本用的是4.8这个版本在Windows 10上兼容性最好。数据库方面SQLite用的是3.x版本MySQL用的是5.7版本。MySQL 5.7在产线环境用下来比较稳定8.0版本有些语法变化迁移成本高所以暂时没升级。5.2 配置文件管理配置文件管理是个容易被忽视但很重要的事。宏翔上位机的配置文件分三类系统配置数据库连接、日志级别、界面主题等。这类配置一般不变放在程序目录下的config文件夹。设备配置每个设备的通讯参数、寄存器地址映射等。这类配置在设备调试阶段会频繁修改放在单独的devices文件夹每个设备一个文件。工艺配置测试流程、判定标准、报警阈值等。这类配置跟产品型号相关放在recipes文件夹按产品型号命名。配置文件格式统一用JSON因为JSON可读性好而且C#原生支持序列化和反序列化。配置文件的修改通过界面操作不直接改文件避免格式错误。注意事项配置文件一定要做版本管理。每次修改都记录修改人、修改时间、修改内容。产线现场出问题时经常需要回退到之前的配置没有版本管理就抓瞎了。5.3 日志系统设计日志是排查问题的命根子。宏翔上位机的日志系统分了五个级别Debug、Info、Warn、Error、Fatal。不同级别输出到不同的目标Debug和Info输出到文件按天滚动保留30天。Warn和Error输出到文件的同时也输出到数据库方便统计和查询。Fatal除了输出到文件和数据库还会触发报警通知相关人员。日志内容要包含时间戳、线程ID、日志级别、模块名称、日志消息。如果日志跟某个设备或任务相关还要包含设备编号或任务编号。日志的性能也很重要。高频日志写入会影响程序性能所以日志写入用了异步方式日志消息先放到队列后台线程批量写入文件。6. 实际项目中的经验与教训6.1 需求变更的应对做产线项目需求变更是家常便饭。我的经验是在架构设计时就要为变更留好口子。具体来说设备通讯层用接口隔离换协议只需要加一个实现类。工艺逻辑层用配置和脚本换工艺只需要改配置。数据存储层用抽象工厂换数据库只需要改一个配置项。但光有架构还不够还要有变更管理流程。每次需求变更先评估影响范围然后决定是在现有框架内改还是需要调整架构。小变更直接改大变更排期做。我踩过的一个坑是为了赶进度在一个产线项目里把工艺逻辑写死了。结果三个月后客户要换产品型号工艺完全不同改代码改了两周。从那以后我再也不敢把工艺逻辑写死了。6.2 现场调试的注意事项现场调试是项目交付的关键环节。我的经验是调试前做好充分准备调试时按步骤来调试后做好记录。调试前的准备包括确认硬件连接正确、确认设备参数配置正确、准备好调试工具和文档、跟现场人员确认调试时间和安全措施。调试时的步骤先单设备调试确认每个设备都能正常通讯。再多设备调试确认设备之间没有冲突。然后空跑测试不接实际产品确认流程逻辑正确。最后带载测试接实际产品跑完整流程。调试后的记录包括调试过程中遇到的问题和解决方法、最终的配置参数、遗留问题和后续计划。实操心得现场调试一定要带一个笔记本把每一步操作和结果都记下来。好记性不如烂笔头调试时信息量很大不记下来很容易漏。6.3 客户培训与交付项目交付不是把软件装上去就完了还要做客户培训。培训内容包括日常操作、参数配置、常见问题处理、数据查询和报表导出。培训时我一般会准备一个操作手册和一个视频教程。操作手册按功能模块组织每个功能配截图和说明。视频教程录屏讲解方便客户反复观看。交付时还要提供安装包、配置文件模板、操作手册、维护手册。维护手册里要写清楚常见问题的排查方法、日志文件的位置和查看方法、联系技术支持的方式。6.4 后续扩展方向宏翔上位机目前主要用在自动化产线和老化测试场景但架构本身是通用的。后续可以扩展的方向包括接入MES系统把产线数据上传到MES实现生产过程的全面追溯。增加数据分析功能对老化测试数据做趋势分析、异常检测提前发现潜在问题。支持移动端查看通过手机或平板查看产线状态和测试进度。增加设备预测性维护根据设备运行数据预测设备寿命提前安排维护。这些扩展方向都需要在现有架构上做增量开发不会影响已有功能。这也是当初选择分层架构和插件式设计的好处。我个人在实际操作中的体会是上位机开发这件事技术本身不是最难的难的是对现场需求的理解和对稳定性的坚持。一个功能实现出来可能只要一天但要让它稳定运行一年不出问题需要付出的努力是十倍百倍。所以做这行耐心和细心比技术能力更重要。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑