前言
工业自动化软件开发中,一个成熟、可扩展的上位机系统往往比硬件本身更考验工程能力。它不仅要稳定可靠,还要支持灵活配置、流程编辑、多页面管理以及良好的用户体验。
本文推荐一个基于 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<UIPage>("FrmAuto"));
_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve<UIPage>("FrmManual"));
_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve<FrmProductMgr>());
_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve<FrmFlowEdit>());
//注册按钮切换手动调试页面
_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve<FrmStationDebug>());
_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve<FrmIODebug>());
//注册按钮切换系统配置页面
_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve<FrmMotionConfig>());
_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve<FrmIOConfig>());
_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve<FrmStationConfig>());
_pagesMgr.RegisterPageToPanel(panMain.Name, _ioc.Resolve<FrmDeviceConfig>());
//显示自动运行页面
_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 SaveUISet
Settings.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 远程监控,将进一步提升其工业适用性。