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