13 KiB
Motion 安全检查设计稿
1. 目标
围绕 MainShell/Motion/SafeAxisMotion.cs 、 MainShell/Motion/MotionController.cs 与 MainShell/Motion/StagePlatformMotionService.cs 建立一套统一的运动前安全检查方案,在不破坏现有分层的前提下,为后续代码实现提供明确设计依据。
本设计稿目标如下:
- 所有真实运动入口具备统一前置安全检查能力
- 单轴底线检查 设备级互锁检查 机构专属检查边界清晰
- 多轴联动在下发前完成组合安全判定
- 失败处理方式统一,包括阻断 联停 告警 日志
- 为后续切换到
code模式提供实现蓝图
2. 当前代码结构观察
2.1 现有职责
当前主要调用链如下:
StagePlatformMotionService.MovePlaneAsync()SafeAxisMotion.SafeMoveAsync()SafeAxisMotion.MoveAbsInternalAsync()MotionController.MoveAbsAsync()
当前各层职责已经基本成形:
| 层级 | 当前职责 | 对应文件 |
|---|---|---|
| 机构动作层 | 组织业务动作 组装联动请求 | MainShell/Motion/StagePlatformMotionService.cs |
| 安全运动调度层 | 统一封装单轴 多轴运动 失败联停 告警上报 | MainShell/Motion/SafeAxisMotion.cs |
| 轴控制层 | 下发运动命令 轴状态校验 软限位检查 超时控制 | MainShell/Motion/MotionController.cs |
| 参数速度层 | 速度参数应用 | MainShell/Motion/AxisSpeedManager.cs |
2.2 当前已有安全基础
现有代码中已经具备一些底层安全能力:
MotionController.ValidateMotionState()MotionController.EnsureWithinSoftLimit()MotionController.ValidateTimeout()SafeAxisMotion.CancelAndStopRelatedAxes()
说明当前系统并不是没有安全设计,而是还缺少统一的运动前安全检查编排层。
3. 设计原则
3.1 分层原则
- 只依赖单轴自身状态的规则,放在
MotionController - 依赖整机状态或多个硬件对象的规则,放在
SafeAxisMotion - 只对某个业务动作成立的规则,放在机构服务层,例如
StagePlatformMotionService
3.2 收口原则
所有真实发运动命令的入口,后续应尽可能统一经过:
SafeAxisMotion.MoveAbsAsync()SafeAxisMotion.MoveRelAsync()SafeAxisMotion.SafeMoveAsync()SafeAxisMotion.HomeAsync()
3.3 组合判定优先原则
多轴动作必须先整体检查,再启动任意一根轴,避免出现部分轴已开始移动、剩余轴检查失败的情况。
3.4 检查结果结构化原则
后续检查结果不应只返回 true 或 false,而应具备规则名、层级、失败原因、影响轴、是否报警、恢复建议等结构化信息。
4. 安全检查分层方案
4.1 第一层 轴级底线检查
定位
用于保证单轴命令发出前的最低安全边界,不承载设备业务语义。
放置位置
检查项
| 检查项 | 说明 | 当前状态 |
|---|---|---|
| 轴对象存在 | 防止空引用和未初始化轴 | 已部分具备 |
| Axis.State 可用 | 保证状态读取有效 | 已具备 |
| Servo 已上电 | 禁止断使能运动 | 已具备 |
| 无 ALM ServoFault EMG | 禁止故障状态运动 | 已具备 |
| CanMove 为 true | 禁止当前状态不允许运动 | 已具备 |
| 目标在软限位内 | 防止目标超行程 | 已具备 |
| 超时参数合法 | 防止非法等待参数 | 已具备 |
| 驱动返回码正常 | 命令下发失败立即阻断 | 已具备 |
不建议放入的规则
- 安全门
- 总急停整机状态
- 气缸或相机回避
- 多轴组合碰撞
- 流程阶段判断
- 自动手动模式权限
这些都超出了单轴控制器边界。
4.2 第二层 设备级互锁检查
定位
这是后续“每次运动前统一安全检查”的核心层。
放置位置
建议以后仍然由 SafeAxisMotion 作为总入口,但将检查逻辑进一步抽象为专门组件,例如:
MotionSafetyCheckerIMotionSafetyPolicyIMotionPrecheckMotionInterlockService
典型检查项
| 检查项 | 说明 | 建议失败处理 |
|---|---|---|
| 总急停已释放 | 整机急停未复位时禁止运动 | 阻断 + 可报警 |
| 安全门状态允许 | 门打开时禁止危险动作 | 阻断 + 可报警 |
| 当前模式允许该动作 | 自动 手动 调试权限控制 | 阻断 |
| 当前流程状态允许运动 | 防止流程中非法插入动作 | 阻断 |
| 关键气缸在安全位 | 防止机构干涉 | 阻断 + 可报警 |
| 真空 夹持 吸附状态满足要求 | 防止掉料 空跑 | 阻断 |
| 危险机构已退出 | 防止碰撞 | 阻断 + 可报警 |
| 同组互斥对象未占用 | 防止并发冲突 | 阻断 |
| 当前速度模式满足安全约束 | 危险段使用安全速度 | 阻断或降级 |
设计要求
- 必须在真正调用
MotionController.MoveAbsAsync()前完成 - 应支持单轴与多轴动作共用
- 应支持和报警系统集成
- 应支持基于模式和场景动态组合规则
4.3 第三层 多轴组合检查
定位
用于解决单轴单独都合法,但组合动作整体不安全的问题。
放置位置
优先放在 SafeAxisMotion.SafeMoveAsync() 所在层。
对于明显属于某机构专属姿态约束的规则,也可先由机构服务层做第一轮检查。
典型检查项
| 检查项 | 说明 | 建议归属 |
|---|---|---|
| 多轴请求中无重复轴 | 防止一个批次对同一轴下多个目标 | 安全运动层 |
| 多轴组合目标整体可达 | 防止单轴都合法但整体姿态不合法 | 安全运动层 |
| 多轴目标不引发机械碰撞 | 防止联动过程干涉 | 安全运动层 |
| 联动姿态变化量不超限 | 防止平台受力异常或姿态突变 | 机构层或安全运动层 |
| 是否需要先中转位再联动 | 防止直接走位不安全 | 机构层 |
重点建议
StagePlatformMotionService.MovePlaneAsync() 这类三轴联动动作,后续一定要先做整体姿态检查,再交给 SafeAxisMotion.SafeMoveAsync() 发命令。
4.4 第四层 机构工艺检查
定位
只对某类业务动作成立的前置条件,不应做成全局通用规则。
放置位置
典型检查项
| 检查项 | 说明 |
|---|---|
| 平台三点高度差不超限 | 防止平台姿态异常 |
| 平移前已抬安全高度 | 防止横移干涉 |
| 对位前光学条件准备完成 | 防止动作无效 |
| BondHead 或相机已回避 | 防止机构碰撞 |
| 顶针 吸嘴 工装在安全位 | 防止治具干涉 |
| 当前工艺阶段允许该动作 | 保证流程一致性 |
| 工件状态正确 | 防止空跑 掉料 误动作 |
5. 推荐调用链方案
flowchart TD
A[业务动作入口] --> B[机构服务前置检查]
B --> C[统一安全运动入口]
C --> D[构建运动检查上下文]
D --> E[设备级互锁检查]
E --> F[多轴组合检查]
F --> G[单轴底线检查]
G --> H[下发运动命令]
H --> I[等待完成 取消 超时]
I --> J[失败联停 告警 日志]
5.1 业务动作入口
例如:
职责:
- 表达动作意图
- 先做机构专属前置条件判断
- 组装单轴或多轴请求
- 调用统一安全运动入口
5.2 统一安全运动入口
例如:
SafeAxisMotion.SafeMoveAsync()SafeAxisMotion.MoveAbsAsync()SafeAxisMotion.MoveRelAsync()SafeAxisMotion.HomeAsync()
职责:
- 解析请求
- 构建上下文
- 执行设备级与组合级前置检查
- 通过后调用
MotionController - 失败时统一联停 告警 日志
5.3 单轴命令执行入口
例如:
职责:
- 轴底线校验
- 下发命令
- 超时与取消控制
- 返回结构化结果
6. 推荐检查执行顺序
建议后续严格固定顺序,避免规则散落。
步骤 1 机构动作前置检查
适用于业务动作服务,例如平台动作先检查:
- 是否需要先走安全高度
- 目标姿态是否合法
- 当前流程状态是否允许
步骤 2 设备级互锁检查
统一检查:
- 总急停
- 安全门
- 关键气缸
- 回避状态
- 模式权限
- 关键资源占用
步骤 3 多轴组合检查
统一检查:
- 多轴目标是否冲突
- 联动是否越界
- 是否需要分步走位
- 是否存在组合干涉
步骤 4 单轴底线检查
由 MotionController 执行:
- Servo
- Alarm
- CanMove
- 软限位
- 超时与驱动返回码
步骤 5 发命令与结果收敛
调用底层轴执行,并在失败时统一:
- 联停
- 告警
- 日志记录
7. 建议的数据模型
本节不是要求立刻编码,而是后续实现时建议统一抽象。
7.1 运动检查上下文
建议未来形成类似 MotionCheckContext 的概念,字段建议包括:
| 字段 | 说明 |
|---|---|
| Operation | MoveAbs MoveRel Home Jog |
| Axis | 当前目标轴 |
| AxisName | 轴名称 |
| CurrentPosition | 当前位 |
| TargetPosition | 目标位 |
| Distance | 相对位移 |
| RelatedAxes | 关联轴集合 |
| Requests | 当前批量请求 |
| Mode | 自动 手动 调试 |
| Source | 调用来源或动作名 |
| NeedAlarm | 是否需要报警 |
| TimeoutMilliseconds | 超时配置 |
7.2 检查结果模型
建议未来形成类似 MotionCheckResult 的概念。
| 字段 | 说明 |
|---|---|
| IsPassed | 是否通过 |
| RuleName | 规则名称 |
| Layer | 规则所属层级 |
| Severity | Block 或 Warning |
| Message | 失败描述 |
| AxisNames | 影响轴 |
| AlarmId | 可选报警编号 |
| RecoveryHint | 建议恢复方式 |
7.3 检查规则接口方向
建议未来每条规则抽象成统一接口,例如:
IMotionPrecheckIMotionSafetyRule
每条规则只负责一件事,统一输入上下文,统一输出结果。
8. 失败处理策略
后续所有安全检查与运动失败,建议统一为三类处理级别。
| 级别 | 说明 | 典型场景 |
|---|---|---|
| Block | 阻断但不联停 | 发命令前检查失败 |
| StopAndBlock | 先停止相关轴再阻断 | 多轴动作中途失败 |
| AlarmAndBlock | 报警并阻断 | 急停 门禁 危险机构未回避 |
结合现有能力:
- 联停可复用
SafeAxisMotion.CancelAndStopRelatedAxes() - 报警可复用
SafeAxisMotion.ReportAlarmAsync() - 日志可复用
HandleMotionStarted()与HandleMotionFinished()
9. 对当前各文件的未来职责建议
9.1 MainShell/Motion/MotionController.cs
保持职责
- 单轴命令执行
- 底线安全检查
- 超时控制
- 结果封装
不建议新增
- 安全门判断
- 气缸互锁判断
- 工艺流程阶段判断
- 平台姿态判断
- 多轴组合碰撞判断
9.2 MainShell/Motion/SafeAxisMotion.cs
强化为统一前置安全入口
未来建议增加:
- 前置检查编排
- 单轴与多轴统一安全上下文构建
- 设备级互锁检查
- 多轴组合检查
- 失败等级处理策略
保持现有优势
- 单轴与多轴入口已经集中
- 已具备联停能力
- 已具备报警对接能力
- 已具备日志挂接点
9.3 MainShell/Motion/StagePlatformMotionService.cs
保留机构业务语义
未来建议这里承担:
- 平台类动作专属规则
- 姿态约束
- 安全中转位策略
- 业务前置条件
而不是直接下沉到轴控制层。
9.4 MainShell/Motion/AxisSpeedManager.cs
可扩展为安全速度策略辅助层
例如未来用于:
- 危险区动作自动切安全速度
- 根据模式切换速度模板
- 高风险动作限制加速度和 jerk
但它不应承担互锁判断主责。
10. 分阶段实施计划
阶段 A 规则清单固化
先在设计层确认:
- 哪些规则为全局必检
- 哪些规则为机构专属
- 哪些规则为阻断型
- 哪些规则为报警型
- 哪些规则仅提示
阶段 B 入口收口检查
确认项目内是否存在绕过 SafeAxisMotion 直接调用轴对象的路径。
如果有,后续应逐步迁移,避免统一检查失效。
阶段 C 上下文模型抽象
统一后续所有检查的输入对象,避免每条规则自行拼接所需数据。
阶段 D 先实现高价值规则
优先顺序建议:
- 总急停
- 安全门
- Servo 和 Alarm
- 软限位
- 危险机构回避
- 多轴组合越界
阶段 E 再补机构专属规则
例如:
- 平台三点姿态约束
- 安全高度
- 中转位策略
- 工装占位状态
11. 需要优先确认的规则清单
后续若进入详细实现设计,建议优先由业务方或设备调试方确认以下问题:
| 主题 | 需要确认的问题 |
|---|---|
| 急停 | 是否整机任何运动都必须检查总急停 |
| 安全门 | 手动模式是否允许门开点动 |
| 模式权限 | 自动 手动 调试的运动权限边界 |
| 危险区 | 哪些机构组合构成机械干涉 |
| 平台联动 | Z7 Z8 Z9 姿态变化允许范围 |
| 中转位 | 哪些动作必须先走安全位再到目标位 |
| 报警策略 | 哪些检查失败必须报警 哪些只阻断 |
| 速度策略 | 哪些动作需要强制安全速度 |
这些内容越早明确,后续实现越稳定。
12. 最终设计结论
本设计稿的结论如下:
MotionController继续承担单轴底线检查与命令执行职责SafeAxisMotion应演进为统一的运动前安全检查编排入口- 多轴联动必须先做组合安全检查,再统一下发命令
StagePlatformMotionService这类机构服务负责工艺专属前置条件AxisSpeedManager可作为安全速度策略辅助组件,但不承载主互锁逻辑- 后续实现宜采用 规则接口 + 上下文对象 + 分层编排 的方式推进,而不是在各处零散追加 if 判断
该方案兼顾了现有代码结构、现场可维护性与后续扩展性,适合作为下一阶段实现设计的基础文档。