『7x24小时有问必答』

前言

工业自动化设备的开发中,人机交互界面不仅是操作入口,更是系统可靠性与用户体验的集中体现。一个优秀的上位机软件,既要能稳定控制硬件、记录运行状态,又要支持多语言、便于维护和扩展。
本文介绍的项目是基于 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 轴进行点位调整、移动、读取角度;在报警界面,可查看历史报警并清除;日志界面则展示结构化运行记录。
软件主页
1.png
软件登录
2.png
相机控制
3.png
运动控制
4.png
IO设置
5.png
系统设置
6.png
报警管理
7.png

项目源码

项目包含完整的 ResX 多语言资源、模块化页面设计及自研框架,适合工业软件开发学习或作为企业内部上位机模板二次开发。
为了防止丢失,可以在评论区留言关键字工业上位机,即可获取完整源码地址。
8.png

总结

项目的价值不在于技术堆砌,而在于对工业场景真实痛点的理解与回应。从"总线:已连接"到"保存成功!",从"电批操作"到"点位调整",每一个字符串背后都是对操作习惯的尊重;从 SafeInvoke 到 EventCenter,每一行代码都体现了对稳定性的追求。在国产工业软件亟需落地的今天,这样的项目或许微小,却扎实——它不是空中楼阁,而是产线上真正能用、敢用的工具。

关键词

最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠]  社区,与其他热爱技术的同行一起交流心得,共同成长!
作者:小码编匠
出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

END

方便大家交流、资源共享和共同成长
纯技术交流群,需要加入的小伙伴请扫码,并备注加群

推荐阅读

觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力

收藏
点赞
分享
在看

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码