Files
LinuxMotion/docs/design/Axis-Attributes.md
T
chen 0587f7ac6c feat: 实现 Axis 核心属性与 MC_Power 功能块
- Axis: 新增运动学/功率/错误管理属性(_position 等 10+ 项)
- Axis: 新增 doPower()/readState()/cycle() 接口骨架
- MC_Power: 实现功率使能功能块(边沿检测 + 状态输出)
- GlobalResource: 新增 CreateAxis/GetAxisRefById 全局轴管理
- App/CMakeLists.txt: 添加 GlobalResource.cpp 源文件
- docs: 更新 Axis 属性清单与 MC_Power 设计文档
2026-07-03 10:01:06 +00:00

165 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Axis 类必须属性
`Axis` 是 PLCopen 运动控制库的核心仿真类,实现 IEC 61131-3 单轴状态机与运动学。
## 设计决策
### 可见性:运动学属性为 `private`
功能块不直接读写轴内部状态,而是通过 `AXIS_REF` 调用公开接口。这是 IEC 61131-3 的标准模式——轴是功能块黑盒:
```
功能块 (MC_MoveAbsolute) Axis
───────────────────── ─────────────
AXIS_REF → axis private: position_, velocity_, ...
axis.acceptCommand(cmd) ──────→ 只有 cycle() 能写运动学数据
axis.readActualPosition() ←─── public: getter 只读
```
> 运动控制线程定时调用 `cycle()` 独占写权限,避免数据竞争。
### 数值类型:浮点 `REAL` (double)
遵循 IEC 61131-3 / PLCopen 规范,使用 `double` 表示物理量(mm、°/s 等)。`double` 有 52 位尾数(约 15 位十进制有效数字),以 10ms 周期运行 1 小时,累积的浮点舍入误差在 $10^{-10}$ 量级,工程上可完全忽略。若未来对接真实驱动器,在数据交换层做脉冲数换算即可。
---
## 1. 当前已实现
### 1.1 轴标识与自引用 — `AXIS_REF _ref` (private)
| 字段 | 类型 | 说明 |
|------|------|------|
| `axisNo` | `UINT` | 轴编号,由用户在构造时指定,默认 1 |
| `axisName` | `std::string` | 轴名称,默认 `"Axis1"` |
| `axis` | `Axis*` | 指向自身实例的指针,供功能块间接访问轴对象 |
### 1.2 轴状态 — `MC_AXIS_STATE _state` (private)
当前状态,初始值 `Disabled`。新增辅助状态 `_resultingState` 用于记录指令完成后的目标状态。
状态转换由 `cycle()` 方法驱动(逻辑待实现)。
### 1.3 运动学属性 (private) ✅
`cycle()` 独占写入;外部通过 `readXxx()` 只读访问。
| 属性 | 类型 | 说明 |
|------|------|------|
| `_position` | `REAL` | 当前指令位置 |
| `_actualPosition` | `REAL` | 当前实际位置(含跟随误差仿真) |
| `_velocity` | `REAL` | 当前指令速度 |
| `_actualVelocity` | `REAL` | 当前实际速度 |
| `_acceleration` | `REAL` | 当前指令加速度 |
| `_actualAcceleration` | `REAL` | 当前实际加速度 |
| `_deceleration` | `REAL` | 减速度(尚未添加) |
### 1.4 功率与使能 (private) ✅
| 属性 | 类型 | 说明 |
|------|------|------|
| `_powerEnabled` | `BOOL` | 功率级是否使能 |
| `_homed` | `BOOL` | 是否已完成回零 |
### 1.5 错误管理 (private) ✅
| 属性 | 类型 | 说明 |
|------|------|------|
| `_errorId` | `MC_ERROR_ID` | 当前错误码,`mcNoError` 表示正常 |
| `_errorStop` | `BOOL` | 是否触发错误停止 |
### 1.6 构造函数 & cycle() (public)
```cpp
explicit Axis(UINT axisNo = 1, std::string name = "Axis1");
void cycle(); // 骨架已生成,逻辑待实现
```
初始化 `_ref` 并自绑定 `axis` 指针,`_state` 默认 `Disabled`
---
## 2. 待实现的属性与方法
### 2.1 活动指令 — `MotionCommand _activeCommand` (private)
当前正在执行的运动指令参数快照,类型为 `MotionCommand`
| 字段 | 类型 | 说明 |
|------|------|------|
| `type` | `MotionCommandType` | 指令类型(点到点 / 速度 / 停止 / 暂停 / 回零) |
| `targetPosition` | `REAL` | 目标位置 |
| `targetVelocity` | `REAL` | 目标速度 |
| `maxVelocity` | `REAL` | 最大速度 |
| `acceleration` | `REAL` | 加速度 |
| `deceleration` | `REAL` | 减速度 |
| `homePosition` | `REAL` | 回零位置 |
| `resultingState` | `MC_AXIS_STATE` | 指令完成后要进入的状态 |
### 2.2 待补充的运动学属性
| 属性 | 说明 |
|------|------|
| `_deceleration` | 减速度(已有 `_acceleration`,缺独立减速参数) |
### 2.3 轴状态机方法 — `cycle()` (public, 实现待完成)
```cpp
void cycle();
```
每周期由运动控制线程调用,待实现逻辑:
1. 根据 `_activeCommand` 计算运动学输出
2. 更新 `_position` / `_velocity`
3. 评估状态转换条件
4. 在离散运动到达目标时自动切换到 `Standstill`
### 2.4 功能块交互接口 (public, 全部待实现)
| 方法 | 可见性 | 说明 |
|------|--------|------|
| `acceptCommand(const MotionCommand&)` | public | 接收功能块下发的运动指令 |
| `doPower(BOOL enable)` | public | 功率使能/去使能 |
| `doStop()` / `doHalt()` | public | 停止 / 暂停 |
| `doReset()` | public | 从 ErrorStop 恢复 |
| `doHome(REAL homePos)` | public | 发起回零 |
| `readStatus()` | public | 读取当前状态快照 |
| `readActualPosition()` | public | 读取实际位置 |
| `readActualVelocity()` | public | 读取实际速度 |
| `readError()` | public | 读取当前错误码 |
---
## 3. 完整属性清单
```
private
───────
Axis
├── _ref (AXIS_REF) ✅
├── _state (MC_AXIS_STATE) ✅
├── _resultingState (MC_AXIS_STATE) ✅ 指令完成目标状态
├── _position (REAL) ✅
├── _actualPosition (REAL) ✅
├── _velocity (REAL) ✅
├── _actualVelocity (REAL) ✅
├── _acceleration (REAL) ✅
├── _actualAcceleration (REAL) ✅
├── _deceleration (REAL) ⬜ 待添加
├── _powerEnabled (BOOL) ✅
├── _homed (BOOL) ✅
├── _errorId (MC_ERROR_ID) ✅
├── _errorStop (BOOL) ✅
└── _activeCommand (MotionCommand) ⬜ 活动指令
public
──────
Axis(axisNo, name) ✅
cycle() 🟡 骨架已就绪
acceptCommand(cmd) ⬜
doPower / doStop / doHalt ⬜
doReset / doHome ⬜
readStatus / readActualPosition ⬜
readActualVelocity / readError ⬜
```