工业自动化软件开发中,一个成熟、可扩展的上位机系统往往比硬件本身更考验工程能力。它不仅要稳定可靠,还要支持灵活配置、流程编辑、多页面管理以及良好的用户体验。
本文推荐一个基于 WinForm 开发的模块化运动控制框架。它并非简单的按钮+轴控面板,而是一个融合了事件驱动、依赖注入、可停靠窗口和流程编排能力的轻量级 IDE 式上位机平台。
项目介绍项目是一套面向中小型自动化设备的上位机软件框架,目标是提供类似"简易版 PLC 编程环境"的操作体验。
可以在图形界面中切换自动运行、手动调试、产品管理、流程编辑等不同工作区,并通过统一的控制面板(启动、暂停、回零等)触发全局操作。
整个系统采用插件式架构,核心逻辑解耦,便于后续功能扩展或适配不同硬件平台。
项目功能1、支持多页面切换包括自动运行(FrmAuto)、手动控制(FrmManual)、产品管理、流程编辑、IO 调试、工位配置等十余个功能模块。
2、提供全局控制指令如启动、暂停、继续、停止、回零、运行选中工具、执行完整流程等,所有操作通过事件总线广播。
3、流程编辑器支持可视化流程设计可打开、新建、保存流程文件,并在可停靠窗口中编辑具体动作。
4、集成类 IDE 界面布局包含工具箱、解决方案资源管理器、属性面板、调试输出、变量/参数窗口等,支持自定义布局并持久化保存。
5、窗口状态记忆程序关闭时自动保存主窗体位置与尺寸,下次启动恢复原状。
6、安全退出机制退出前弹出确认对话框,并有序发布退出事件,确保资源释放。
项目特点事件驱动架构:通过EventMgrLib实现松耦合通信,各模块仅依赖事件,不直接调用彼此方法。
依赖注入管理:使用UnityIoc容器统一创建和管理页面实例,提升可测试性与扩展性。
可停靠窗口系统:基于WeifenLuo.WinFormsUI.Docking实现 VS 风格的多文档界面(MDI),支持拖拽、分组、浮动。
配置持久化:DockPanel 布局、主窗体位置等 UI 状态均自动保存至本地文件,提升用户体验。
模块化设计:每个功能页面独立封装,注册到页面管理器(PagesMgr)后即可按需加载,避免内存浪费。
项目技术1、开发框架C# + .NET Framework + WinForm,界面库采用 Sunny.UI提升视觉效果。
2、核心架构事件总线(EventMgrLib)实现跨模块通信;
Unity 容器(UnityIoc)管理对象生命周期;
页面管理器(PagesMgr)统一调度主区域内容切换。
3、界面布局集成 DockPanel Suite(WeifenLuo 库),支持复杂窗口停靠与布局恢复。
4、配置存储使用 Settings.Default保存窗体尺寸位置,XML 文件保存 DockPanel 布局。
5、代码组织按功能划分命名空间(如 AllPages.SysConfig、Pages.DockPages),结构清晰。
项目代码private void IniUI{ShowDragStretch = true;if (Settings.Default.width > 0) Width = Settings.Default.width;if (Settings.Default.height > 0) Height = Settings.Default.height;if (Settings.Default.top >= 0) Top = Settings.Default.top;if (Settings.Default.left >= 0) Left = Settings.Default.left;//获取单例模式_pagesMgr = PagesMgr.Ins;//注册容器_pagesMgr.RegisterPanel(panMain);//注册选项卡切换页面_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve//注册按钮切换手动调试页面_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve//注册按钮切换系统配置页面_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve//显示自动运行页面_pagesMgr.ShowPage(panMain.Name, "FrmAuto");}private void tabRibbon_Selected(object sender, System.Windows.Forms.TabControlEventArgs e){if (e.TabPage.Tag == null) return;string pageName = e.TabPage.Tag.ToString;_pagesMgr.ShowPage(panMain.Name, pageName);}private void NaviButton_Click(object sender, EventArgs e){if (!(sender is UIHeaderButton button)) return;if (button.Tag != null){_pagesMgr.ShowPage(panMain.Name, button.Tag?.ToString);}}private void FrmMain_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e){#region SaveUISetSettings.Default.width = Width;Settings.Default.height = Height;Settings.Default.top = Top;Settings.Default.left = Left;Settings.Default.Save;#endregion SaveUISet}项目效果左侧是工具箱,右侧是属性与流程管理器,底部是调试输出与参数面板。点击顶部导航按钮或标签页,主区域无缝切换不同功能页面。在流程编辑器中,双击流程项可打开专属编辑窗口,所有操作通过事件联动。
整个系统响应流畅,布局灵活,即使关闭重启,也能还原上次的工作环境。这种"所见即所得"的体验,极大降低了非专业用户的使用门槛。
运动控制

工具调试

流程编辑


系统设置

产品管理
项目源码项目采用标准 C# 工程结构,核心逻辑集中在 FrmMain主窗体与FrmFlowEdit流程编辑器中。
所有页面通过 IoC 容器解析并注册,事件订阅/取消在页面加载/关闭时自动处理。
依赖库包括 Sunny.UI、DockPanel Suite、Unity 及自定义事件管理库,均为常见开源组件。
为了防止丢失,可以在评论区留言关键字「流程编辑」,即可获取完整源码地址。
总结项目展示了如何用传统 WinForm 技术开发一个现代化、可扩展的工业上位机。它没有盲目追求 WPF 或 Electron,而是在熟悉的技术栈上,通过良好的架构设计(事件驱动 + 依赖注入 + 可停靠窗口)实现了接近专业 IDE 的交互体验。
对于需要快速交付、又要求一定灵活性的自动化项目来说,这种"小而精"的框架思路值得借鉴。未来若加入脚本引擎、OPC UA 通信或 Web 远程监控,将进一步提升其工业适用性。
关键词、、、、、、、C#、、
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠]社区,与其他热爱技术的同行一起交流心得,共同成长!
作者:小码编匠
出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!
END
方便大家交流、资源共享和共同成长纯技术交流群,需要加入的小伙伴请扫码,并备注【加群】
推荐阅读
觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力