# motion-pulse **Repository Path**: dazuo0312/motion-pulse ## Basic Information - **Project Name**: motion-pulse - **Description**: No description available - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-04 - **Last Updated**: 2026-09-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SmartMotion 一个基于 **C# WinForms** 的**工业自动化设备控制软件框架**。 > 简单说:它是一套「帮你把自动化设备(机械手、贴装机、流水线等)的软件"拼"出来」的工具。不需要死记硬背控制卡厂商的 API,只要像搭积木一样拖拖拽拽、连线,就能写出设备的运行流程(自动运行、IO 判断、气缸动作、轴运动……)。 --- ## 1. 它是做什么的? 在工厂里,一台自动化设备通常要干这些事: - 读取传感器 / 按钮 / 光栅(**输入 IO**) - 控制气缸、电磁阀、指示灯(**输出 IO**) - 控制电机运动(**运动控制卡**),比如机械手走直线、走圆弧 - 按一定顺序循环干活(**流程/工艺**),比如"取料 → 放料 → 检测 → 完成" 传统写法:每个人用厂商给的 SDK 写一大堆底层代码,换一台设备就要重写一遍。 **SmartMotion 的思路:把"硬件控制"和"业务流程"分开。** | 层次 | 干什么 | 谁来改 | |------|--------|--------| | 硬件层(Device) | 封装运动控制卡、IO 卡的底层 API | 程序员(写一次) | | 中间层(Core) | 工站、轴、IO、变量、流程引擎等通用框架 | 程序员 | | 应用层(页面) | 自动运行界面、手动调试界面、配置界面 | 程序员 / 调试人员 | | 流程层(Flow) | 用"工具"拖拽连线拼出设备运行逻辑 | 调试人员也能上手 | 也就是说,**调试设备的人可以通过可视化的流程编辑器改逻辑,而不需要改代码、重新编译**。 --- ## 2. 核心特性 - 🧩 **可视化流程编辑**:像画流程图一样编写设备动作,支持顺序执行、`if / else if / else` 判断、`while` 循环、脚本块。 - 🔌 **运行时反射调用 DLL**:流程里的每个"工具"都可以调用任意 DLL 里的方法(静态或非静态),无需改框架代码就能扩展新动作。 - 📦 **脚本工具**:流程里可以直接写一段 C# 代码(运行时动态编译执行),逻辑灵活度高。 - 🧮 **全局变量系统**:按分组管理变量(流程变量、IO、运动、工站、点位、产品参数、系统参数),流程之间共享数据。 - 🤖 **工站抽象**:把"一台设备"抽象成一个工站(`StationBase`),统一提供回零、复位、点位示教、多轴运动(绝对/相对、插补)等接口。 - 🎛️ **IO 管理**:统一管理输入/输出点,自动/手动界面实时显示状态。 - 🏭 **设备驱动**:内置雷赛 E5032 运动控制卡、IOC0640 IO 卡的驱动封装,可继续扩展其他厂商。 - 🎨 **UI 基于 SunnyUI**:现代风格的 WinForms 界面,含自动运行、手动调试、参数配置、IO 调试等多个页面。 - 🧭 **状态机支持**:提供自动化设备通用状态机(初始化 → 回零 → Ready → Running → 报警 → 停机),保证设备状态转换安全可靠。 --- ## 3. 项目结构 ``` SmartMotion/ ├── SmartMotion/ # 主程序(WinForms 启动项目) │ ├── FrmMain.cs # 主窗口:页面导航 + 全局控制(启动/回零/暂停/停止) │ ├── Pages/ │ │ ├── FrmAuto.cs # 自动运行页面 │ │ ├── FrmManual.cs # 手动调试页面 │ │ ├── FrmFlowEdit.cs # 流程可视化编辑器 │ │ ├── FrmProductMgr.cs # 产品参数管理 │ │ ├── ConfigPages/ # 配置页:设备/IO/运动/工站 │ │ ├── DebugPages/ # 调试页:IO 调试/手动调试/工站调试 │ │ └── DockPages/ # 停靠窗口:工具箱/资源管理器/属性/输出/变量/参数 │ └── Program.cs # 程序入口:异常处理 + Unity 容器注册 + 加载配置 │ ├── SmartMotion.Core/ # 核心框架(最重要) │ ├── Mgrs/ # 各种单例管理器 │ │ ├── FlowsMgr.cs # 流程管理(加载/保存 .xml 流程) │ │ ├── ToolMgr.cs # 工具箱管理(工具 = 半成品动作) │ │ ├── VarMgr.cs # 全局变量管理 │ │ ├── IOMgr.cs # IO 管理 │ │ ├── MotionMgr.cs # 运动控制管理 │ │ ├── StationsMgr.cs # 工站管理 │ │ └── ProductMgr.cs # 产品参数管理 │ ├── Models/ │ │ ├── Flow.cs # 流程模型(一串动作节点) │ │ └── VarInfo.cs # 变量信息 │ ├── Tools/ # 流程里的"工具"(动作节点) │ │ ├── ActionItem.cs # 工具基类:反射调用 DLL 方法 │ │ ├── IfItem.cs / WhileItem.cs # 判断 / 循环 │ │ ├── Script.cs # C# 脚本工具(运行时编译) │ │ ├── GetProperty / SetProperty / GetField / SetField.cs │ │ └── Constructor.cs / DllFunction.cs │ ├── MotionIOStation/ # 硬件抽象基类 │ │ ├── StationBase.cs # 工站基类(轴运动 + IO + 气缸) │ │ ├── MotionControlBase.cs # 运动控制卡基类 │ │ ├── AxisBase.cs # 轴基类 │ │ ├── IIOCtrl.cs / IoCtrlBase.cs / IOIn.cs / IOOut.cs │ │ └── Speed.cs # 速度配置 │ ├── Reflection/ # 反射与依赖注入 │ │ ├── DllTypeInfo.cs # 从 DLL 读取类型/方法信息 │ │ └── UnityIoc.cs # Unity IoC 容器封装 │ └── Helpers/Log.cs # log4net 日志封装 │ ├── Devices/ # 设备驱动(硬件层) │ ├── E5032Lib/ # 雷赛 E5032 运动控制卡驱动(调用 LTDMC.dll) │ └── IOC0640Lib/ # IOC0640 IO 卡驱动(P/Invoke) │ ├── Controls/IOCtrls/ # IO 输入/输出控件(界面组件) ├── Project1/ Project2/ # 示例项目(自动/手动页面示例) ├── ClassLibrary1/ # 示例类库(供流程调用测试) ├── 自动化设备状态机/ # 状态机示例(基于 Stateless 库) ├── Bin/ # 程序输出目录(含打包好的运行文件) └── packages/ dlls/ # 第三方依赖 ``` --- ## 4. 技术栈 | 类别 | 技术 | |------|------| | 语言 / 框架 | C#,.NET Framework 4.7.2,WinForms | | UI | SunnyUI、DockPanelSuite(可停靠窗口) | | 依赖注入 | Unity(UnityIoc) | | 序列化 | Newtonsoft.Json、SharpSerializer(流程保存为 .xml) | | 表达式 | DynamicExpresso(条件表达式求值) | | 日志 | log4net | | 状态机 | Stateless | | 深拷贝 | DeepCloner | --- ## 5. 快速开始 ### 运行已编译版本 直接运行 [Bin/SmartMotion.exe](Bin/SmartMotion.exe) 即可(需要 Windows 系统)。 ### 从源码编译 1. 使用 **Visual Studio 2022** 打开 `SmartMotion_zlr.sln`。 2. 还原 NuGet 包(`packages/` 目录已有本地包)。 3. 将 `SmartMotion` 设为启动项目,编译运行。 4. 程序启动后会自动加载 `Flows/` 目录下的流程、`Tools/` 目录下的工具。 > 注意:运动控制卡 / IO 卡的真实硬件需要对应板卡和厂商 DLL 才能驱动;没有硬件时请勿点击"初始化板卡"等操作,否则会报错。 --- ## 6. 核心概念(通俗版) ### 流程(Flow) 设备干活的"剧本"。一个流程里有一串按顺序执行的**动作节点**,保存为 `.xml` 文件放在 `Bin/Flows/` 下。 ### 工具 / 动作节点(ActionItem / Tool) 流程里的最小执行单元。一个工具对应一次"方法调用": - 调用哪个 DLL 里的哪个类、哪个方法 - 参数可以填固定值,也可以填**变量** - 返回值可以存回某个**变量** - 支持静态方法,也支持先 `new` 对象再调用(构造器工具) - 还有判断、循环、脚本等特殊工具 > 打个比方:工具就像"积木块",流程就是把积木块拼起来。工具箱(`Bin/Tools/*.tool`)里存的是"半成品积木",拖到流程里再配参数就能用。 ### 变量(Var) 全局共享的数据容器,按分组存放(流程变量、IO、运动、工站、点位、产品参数、系统参数)。工具的参数和返回值都通过变量互通。 ### 工站(Station) 一台设备 = 一个工站。比如"四轴机械手工站""六轴机械手工站""流水线工站"。工站提供统一接口:**回零、复位、取点、点位示教、单/多轴运动(绝对/相对/插补)、气缸动作**。换硬件时只需换工站的实现,上层流程不用改。 ### IO(输入 / 输出) - **DI(数字输入)**:传感器、按钮、光栅等信号。 - **DO(数字输出)**:气缸、指示灯、电磁阀等控制。 自动 / 手动界面和调试界面都能实时监控。 ### 状态机 设备不是"想干嘛就干嘛",必须按安全状态流转,例如: ``` 等待初始化 → 等待回零 → 回零中 → Ready(就绪)→ Running(运行中) ↓ Pausing → Alarming(报警)→ 停机 ``` 这样能避免"机器还没回零就直接启动"之类的危险操作。 --- ## 7. 常见开发任务 | 想做什么 | 改哪里 | |----------|--------| | 给设备加一个新动作 | 写一个类库方法,用流程编辑器把它做成工具并拖进流程 | | 换一块运动控制卡 | 在 `Devices/` 下新增驱动,继承 `MotionControlBase` | | 换一种 IO 卡 | 实现 `IIOCtrl` 接口,在 `IOMgr` 中注册 | | 新增一个 UI 页面 | 继承 SunnyUI 的 `UIPage`,在 `Program.RegisterType()` 中注册 | | 改设备运行逻辑 | 打开流程编辑器,拖拽/连线/改参数,保存即可(无需重新编译) | --- ## 8. 常见问题 - **流程加载失败?** 检查 `Bin/Flows/*.xml` 是否损坏,删除损坏文件后重新加载。 - **找不到工具?** 工具文件放在 `Bin/Tools/*.tool`,检查是否存在及是否损坏。 - **调用方法报错?** 确认 DLL 已放在程序目录下、方法名和参数类型匹配、参数引用的变量存在。 - **脚本工具编译失败?** 输出窗口会打印编译错误,检查脚本里的引用 DLL 是否齐全、返回值是否为 `bool`。 --- ## 9. 许可证 本项目使用 [GPL v2](LICENSE) 开源许可证。