前言
工业自动化设备的开发中,人机交互界面不仅是操作入口,更是系统可靠性与用户体验的集中体现。一个优秀的上位机软件,既要能稳定控制硬件、记录运行状态,又要支持多语言、便于维护和扩展。
本文介绍的项目是基于 C# 与 .NET Framework 开发的一款面向产线的工业测试管理平台。它不追求炫目的视觉效果,而是聚焦于报警处理、日志追踪、多语言切换等核心工程需求,力求在真实生产环境中"稳得住、看得清、改得快"。
项目介绍
项目一个开源的工业上位机软件,主要用于自动化测试台或设备调试站的监控与控制。软件以模块化设计为基础,将主界面、调试、视觉、报警、日志等功能解耦,并通过统一的事件机制协调各模块行为。其底层依赖自研的框架,涵盖核心逻辑、UI 控件、模型定义与事件总线,形成一套轻量但完整的工业软件开发示例。
项目功能
1、提供六大功能页面:主界面、调试界面、视觉界面、报警界面、文件管理及日志查看,覆盖典型产线操作场景
2、支持设备运动控制(X/Y/Z/R 轴)、相机拍照、光源调节、电批操作等硬件交互
3、内置报警管理系统,可记录报警代码、报警信息、开始与结束时间,并支持手动清除
4、实现结构化日志记录,系统启动、关键操作均写入按日期归档的日志文件
5、支持中英文等多语言动态切换,界面文本通过 ResX 资源文件集中管理
6、具备通信配置功能,可设置 IP 地址、串口号、波特率、网卡等参数
7、运行状态下禁止意外关闭,保障测试流程安全
项目特点
1、所有界面文本均来自资源文件(如"IP地址:""报警信息""保存成功!"等),便于本地化与维护
2、采用事件驱动架构,通过 EventCenter 实现按钮按下、状态变更等跨模块通信,降低耦合度
3、注重线程安全,所有 UI 更新均通过 SafeInvoke 封装,避免跨线程异常
4、报警与日志一体化设计,从触发到结束全程可追溯,符合工业审计要求
项目技术
技术要点 | 具体说明 |
语言与平台 | C#,运行于 .NET Framework,UI 基于 Windows Forms |
日志系统 | 使用自研 Logger 框架,支持 FileLogSink 文件输出,日志按 "MMdd" 格式分目录存储 |
多语言支持 | 通过 LanguageManager 管理,结合 ResX 资源文件实现运行时动态语言切换 |
本地化资源 | ResX 文件中定义上百个本地化字符串,涵盖轴控(如 XAxis、YAxis)、操作提示(如 Msg_SaveSuccess)、状态标签(如 Lbl_Status_Connect)等,确保界面文本一致性 |
事件驱动机制 | 订阅 ButtonPressedEvent、RunStateChangedEvent 等自定义事件,实现物理按键与软件逻辑的联动 |
安全退出控制 | 在 FormClosing 事件中检测运行状态,若处于运行中则弹出确认对话框,防止误关闭 |
项目代码
取螺丝动作
//取螺丝动作public static void PickScrew(){ //Z轴回原,在移动X和Y轴 MotionModule.Instance.Home((int)AxisInfo.MAGAxis.Z, (int)HomeMode.ORG_N); var p = points?.FirstOrDefault(x => x.Name == "取螺丝位"); if (p == null) return; int xValue = int.Parse(p.XValue); int yValue = int.Parse(p.YValue); //视觉 -》 值 //坐标或者偏移值 MotionModule.Instance.AbsMove((int)AxisInfo.MAGAxis.X, xValue, 10000); MotionModule.Instance.AbsMove((int)AxisInfo.MAGAxis.Y, yValue, 10000); MotionModule.Instance.AbsMove((int)AxisInfo.MAGAxis.Z, yValue, 10000); //取螺丝开始}侧相机和下相机检测同心度
//侧相机和下相机检测同心度public static void CheckConcentricity(){ var p = points?.FirstOrDefault(x => x.Name == "检测螺丝点位"); if (p == null) return; int xValue = int.Parse(p.XValue); int yValue = int.Parse(p.YValue); int zValue = int.Parse(p.ZValue); MotionModule.Instance.AbsMove((int)AxisInfo.MAGAxis.X, xValue, 10000); MotionModule.Instance.AbsMove((int)AxisInfo.MAGAxis.Y, yValue, 10000); MotionModule.Instance.AbsMove((int)AxisInfo.MAGAxis.Z, zValue, 10000); //视觉检测 -》 PASS/NG bool result = false; if (result) { var point = points?.FirstOrDefault(n => n.Name == "抛料位"); if (point == null) return; int x = int.Parse(point.XValue); int y = int.Parse(point.YValue); int z = int.Parse(point.ZValue); MotionModule.Instance.AbsMove((int)AxisInfo.MAGAxis.X, x, 10000); MotionModule.Instance.AbsMove((int)AxisInfo.MAGAxis.Y, y, 10000); MotionModule.Instance.AbsMove((int)AxisInfo.MAGAxis.Z, z, 10000); }}项目效果
软件启动后自动初始化测试管理器,并模拟"急停按钮触发""轴停止错误"两条报警用于演示。
可通过顶部菜单自由切换功能页,所有控件文本(如"连接""刷新""点胶Z轴""光源控制")均随语言切换实时更新。
在运动控制界面,可对 X/Y/Z/R 轴进行点位调整、移动、读取角度;在报警界面,可查看历史报警并清除;日志界面则展示结构化运行记录。
软件主页
软件登录
相机控制
运动控制
IO设置
系统设置
报警管理
项目源码
项目包含完整的 ResX 多语言资源、模块化页面设计及自研框架,适合工业软件开发学习或作为企业内部上位机模板二次开发。
为了防止丢失,可以在评论区留言关键字「工业上位机」,即可获取完整源码地址。
总结
项目的价值不在于技术堆砌,而在于对工业场景真实痛点的理解与回应。从"总线:已连接"到"保存成功!",从"电批操作"到"点位调整",每一个字符串背后都是对操作习惯的尊重;从 SafeInvoke 到 EventCenter,每一行代码都体现了对稳定性的追求。在国产工业软件亟需落地的今天,这样的项目或许微小,却扎实——它不是空中楼阁,而是产线上真正能用、敢用的工具。
关键词
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
作者:小码编匠
出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!
方便大家交流、资源共享和共同成长
纯技术交流群,需要加入的小伙伴请扫码,并备注【加群】
推荐阅读
觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!