- Axis: 新增运动学/功率/错误管理属性(_position 等 10+ 项) - Axis: 新增 doPower()/readState()/cycle() 接口骨架 - MC_Power: 实现功率使能功能块(边沿检测 + 状态输出) - GlobalResource: 新增 CreateAxis/GetAxisRefById 全局轴管理 - App/CMakeLists.txt: 添加 GlobalResource.cpp 源文件 - docs: 更新 Axis 属性清单与 MC_Power 设计文档
5.2 KiB
5.2 KiB
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
#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
#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 侧需要的新方法
// 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→FALSE,Error→TRUE |
| Enable_Positive/Negative | IEC 完整规范字段,本库保留输入但暂不实现逻辑 |