Files
LinuxMotion/docs/design/MC_Power.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

186 lines
5.2 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.
# MC_Power 功能块设计
`MC_Power` 是 PLCopen 运动控制库的基础功能块,控制轴的功率级使能与去使能。
---
## 1. IEC 61131-3 接口定义
```
FUNCTION_BLOCK MC_Power
VAR_IN_OUT
Axis : AXIS_REF; (* 轴引用 *)
END_VAR
VAR_INPUT
Enable : BOOL; (* TRUE=使能, FALSE=去使能 *)
Enable_Positive : BOOL; (* 允许正向运动,本库保留 *)
Enable_Negative : BOOL; (* 允许负向运动,本库保留 *)
END_VAR
VAR_OUTPUT
Status : BOOL; (* 轴已使能且就绪 *)
Busy : BOOL; (* 功能块正在处理中 *)
Error : BOOL; (* 错误标志 *)
ErrorID : MC_ERROR_ID;(* 错误码 *)
END_VAR
```
## 2. C++ 类实现
### 2.1 类声明 — `MotionLib/Inc/MC_Power.h`
```cpp
#pragma once
#include "Types.h"
namespace plcopen {
class MC_Power {
public:
/**
* \brief 构造 MC_Power 实例
* \param axisRef 轴引用 (VAR_IN_OUT)
*/
explicit MC_Power(AXIS_REF& axisRef);
/**
* \brief 周期调用,执行功率控制逻辑
*
* 上位机每个运动控制周期调用一次。
*/
void cycle();
// --- 输入参数 (VAR_INPUT) ---
BOOL Enable = false;
BOOL Enable_Positive = true; // 本库默认允许
BOOL Enable_Negative = true; // 本库默认允许
// --- 输出参数 (VAR_OUTPUT) ---
BOOL Status = false;
BOOL Busy = false;
BOOL Error = false;
MC_ERROR_ID ErrorID = MC_ERROR_ID::mcNoError;
private:
AXIS_REF& _axisRef; // 轴引用,不持有所有权
bool _prevEnable = false; // 上一周期的 Enable 值(边沿检测)
};
} // namespace plcopen
```
### 2.2 实现 — `MotionLib/Src/MC_Power.cpp`
```cpp
#include "MC_Power.h"
#include "Axis.h"
namespace plcopen {
MC_Power::MC_Power(AXIS_REF& axisRef)
: _axisRef(axisRef) {}
void MC_Power::cycle() {
// ① 有效性检查
if (_axisRef.axis == nullptr) {
Error = true;
ErrorID = MC_ERROR_ID::mcInvalidParameter;
Status = false;
Busy = false;
return;
}
Axis* axis = _axisRef.axis;
Error = false;
ErrorID = MC_ERROR_ID::mcNoError;
// ② Enable 上升沿 — 使能
if (Enable && !_prevEnable) {
axis->doPower(true);
Busy = true;
}
// ③ Enable 下降沿 — 去使能
if (!Enable && _prevEnable) {
axis->doPower(false);
Busy = false;
}
// ④ 持续使能状态 — 等待轴进入 Standstill
if (Enable) {
MC_AXIS_STATE state = axis->readState();
if (state == MC_AXIS_STATE::Standstill) {
Busy = false;
Status = true; // 使能成功
} else if (state == MC_AXIS_STATE::ErrorStop) {
Busy = false;
Status = false;
Error = true;
ErrorID = MC_ERROR_ID::mcPowerFailure;
}
} else {
// 去使能后
Status = false;
Busy = false;
}
// ⑤ 保存前置状态
_prevEnable = Enable;
}
} // namespace plcopen
```
## 3. 行为时序
```
周期 | Enable | axis 状态 | Status | Busy | 说明
─────┼────────┼───────────────┼────────┼──────┼────────────────
0 | FALSE | Disabled | FALSE | FALSE| 初始状态
1 | TRUE ↑ | Disabled | FALSE | TRUE | 上升沿,doPower(true)
2 | TRUE | Disabled | FALSE | TRUE | cycle() 待处理
3 | TRUE | Standstill | TRUE | FALSE| 使能完成 ✅
4 | FALSE ↓| Standstill | FALSE | FALSE| 下降沿,doPower(false)
5 | FALSE | Disabled | FALSE | FALSE| 去使能完成
```
## 4. 与 Axis 的交互
```
MC_Power Axis
──────── ────
cycle()
├── Enable↑ → axis->doPower(true) ──→ _powerEnabled = true
│ _state 将在 cycle() 中切换
├── Enable↓ → axis->doPower(false) ──→ _powerEnabled = false
│ _state → Disabled
└── axis->readState() ←────────────── 读取 _state
axis->readError() ←───────────── 读取 _errorId
```
## 5. Axis 侧需要的新方法
```cpp
// Axis.h — 新增方法
class Axis {
public:
void doPower(BOOL enable); // 功率使能控制
MC_AXIS_STATE readState() const; // 读当前状态
MC_ERROR_ID readError() const; // 读当前错误码
};
```
## 6. 设计要点
| 要点 | 说明 |
|------|------|
| 不持有 Axis | `_axisRef` 是引用,MC_Power 不负责轴的生命周期 |
| 上升/下降沿检测 | `_prevEnable` 确保 doPower() 只在边沿调用一次 |
| Busy 的语义 | 从 Enable↑ 到 Status=TRUE 之间为 Busy |
| Error 路径 | 轴进入 ErrorStop 时,Status→FALSEError→TRUE |
| Enable_Positive/Negative | IEC 完整规范字段,本库保留输入但暂不实现逻辑 |