Codesys运动控制功能块的应用
Codesys 将复杂的运动控制逻辑封装为标准化的功能块(FB),遵循 PLCopen 规范。实现精准定位和速度控制的核心在于正确调用这些功能块并管理轴的状态机。本指南将指导从环境搭建到实际轴运动的完整流程。
1. 基础环境与轴配置
在编写控制逻辑前,必须先完成库的引用和轴对象的定义。
- 打开 Codesys 项目,在“设备树”中右键单击 “Library Repository”(库存储库)。
- 添加
Motion相关库。通常需要Motion或Motion_SoftMotion库,具体取决于你所使用的 PLC 硬件或 SoftMotion 软PLC。 - 创建 轴配置。双击 “设备树” 中的
Application(应用程序),在右侧工作区右键单击 空白处,选择Add Object->Axis Ref。 - 命名 该轴为
Axis_01。 - 配置 轴参数。展开
Axis_01,点击Configuration(配置)。设置 以下关键参数:Encoder:输入 编码器每转脉冲数。Drive:设置 模拟量输出映射或总线地址(如 EtherCAT 站点)。Soft Limits:勾选Enable Soft Limits,并设置Position Min和Position Max防止撞击。
2. 轴的使能与状态管理
轴的运动必须建立在“使能”成功的基础上,这是运动控制的第一步。
- 声明 功能块变量。在程序声明区(VAR 部分)输入:
fbPower : MC_Power; (* 轴使能功能块 *)
fbReset : MC_Reset; (* 轴复位功能块 *)
- 编写 使能逻辑。在代码执行区(如 POU 的 Body)调用
MC_Power:
fbPower(
Axis := Axis_01, (* 指定操作轴 *)
Enable := bPowerEnable, (* 使能信号,通常为 BOOL 变量 *)
Enable_Positive := TRUE,
Enable_Negative := TRUE,
RegOverrideValue := ,
BufferMode := MC_BUFFER_MODE_ABORT, (* 缓冲模式:中止当前任务 *)
Status => , (* 输出:轴是否已使能 *)
Busy => , (* 输出:是否正在处理中 *)
Error => , (* 输出:是否有错误 *)
ErrorID => (* 输出:错误代码 *)
);
- 监视
fbPower.Status。当该变量为TRUE时,表示轴已上电并准备好接受运动指令。如果Error为TRUE,需调用MC_Reset进行故障清除。
3. 回原点操作
位置控制系统的“原点”决定了坐标系的零点。未回原点的轴无法进行绝对定位。
- 声明 回原点功能块:
fbHome : MC_Home;
- 配置 回原点模式。常用的模式是直接设定当前值或通过限位开关寻找。以下示例使用“直接设置当前值为 0”的模式(Mode = 3)。
fbHome(
Axis := Axis_01,
Position := 0, (* 回原点后的位置值 *)
HomePosition := 0,
BufferMode := MC_BUFFER_MODE_ABORT,
Execute := bHomeCommand, (* 上升沿触发回原点 *)
Done => bHomeDone, (* 输出:回原点完成 *)
Busy => ,
Error => ,
ErrorID =>
);
- 确保
fbPower.Status为TRUE后,置位bHomeCommand一次。等待bHomeDone变为TRUE后,轴坐标系建立完毕。
4. 单轴运动控制
轴回原点后,即可使用 MC_MoveAbsolute 或 MC_MoveVelocity 进行运动。
4.1 绝对位置运动
- 声明 变量:
fbMoveAbs : MC_MoveAbsolute;
- 编写 运动指令代码。假设我们需要移动到 100.0 毫米处。
fbMoveAbs(
Axis := Axis_01,
Position := 100.0, (* 目标位置 *)
Velocity := 50.0, (* 最大速度 *)
Acceleration := 100.0, (* 加速度 *)
Deceleration := 100.0, (* 减速度 *)
Jerk := ,
BufferMode := MC_BUFFER_MODE_ABORT, (* 覆盖之前的运动 *)
Execute := bMoveCmd, (* 触发信号 *)
Done => bMoveDone,
Busy => ,
Active => ,
Error => ,
ErrorID =>
);
- 执行。当
bMoveCmd从FALSE变为TRUE时,轴开始加速运行至 100.0mm。
4.2 电子齿轮同步
让从轴按照设定的比例跟随主轴运动。
- 声明 功能块:
fbGearIn : MC_GearIn;
- 设置 齿轮比。主轴移动 1000 单位,从轴移动 500 单位(1:2)。
$$ Ratio = \frac{Numerator}{Denominator} = \frac{1}{2} = 0.5 $$
- 编写 代码:
fbGearIn(
Master := Encoder_Axis, (* 主轴位置输入 *)
Slave := Axis_01, (* 从轴 *)
Ratio := 0.5, (* 齿轮比 *)
BufferMode := MC_BUFFER_MODE_ABORT,
Execute := bGearInCmd,
Done => bGearInDone,
Busy => ,
InGear => bInGearStatus, (* 输出:是否已进入同步状态 *)
Error =>
);
5. 运动控制状态机逻辑
功能块不能随意调用,必须遵循严格的状态流转。下图描述了轴从断电到运动的完整逻辑链路及切换条件。
graph LR
A["状态: Power Disabled (断电)"] -->|fbPower.Execute = TRUE| B["状态: Powering On (正在上电)"]
B -->|fbPower.Error = TRUE| F["状态: Error (故障)"]
F -->|fbReset.Execute = TRUE| A
B -->|fbPower.Status = TRUE| C["状态: Standstill (静止)"]
C -->|fbHome.Execute = TRUE| D["状态: Homing (回原点中)"]
D -->|fbHome.Error = TRUE| F
D -->|fbHome.Done = TRUE| C
C -->|fbMoveAbs.Execute = TRUE| E["状态: Continuous Motion (运动中)"]
E -->|fbMoveAbs.Done = TRUE| C
上述状态机展示了逻辑流转顺序:
- 必须先使能(从 A 到 C)。
- 回原点(D)通常只需在首次上电后执行一次,之后可直接从静止状态(C)进入运动状态(E)。
- 任何环节出现错误都会跳转至故障状态(F),必须复位后重新开始。
6. 常用功能块参数速查
以下表格汇总了调试时最常关注的参数与引脚。
| 功能块名称 | 关键输入参数 | 功能描述 |
|---|---|---|
MC_Power |
Enable |
布尔值,TRUE 时驱动器上电。 |
MC_Power |
Status |
输出,TRUE 表示轴已使能且无错误。 |
MC_Home |
Position |
回原点动作结束后,轴被设定的坐标值。 |
MC_MoveAbsolute |
Position |
目标绝对坐标值(单位由轴配置决定)。 |
MC_MoveAbsolute |
BufferMode |
缓冲模式,决定新指令如何处理当前未完成的运动。 |
MC_MoveAbsolute |
Done |
输出,TRUE 表示轴已到达目标位置且速度降为 0。 |
MC_GearIn |
Ratio |
齿轮比,计算公式为 $Ratio = \frac{V_{slave}}{V_{master}}$。 |
MC_Stop |
Deceleration |
急停时的减速率,若设为 0 则使用轴配置中的最大减速度。 |
配置 BufferMode 时需特别注意逻辑优先级,通常 MC_BUFFER_MODE_ABORT 用于立即取消旧指令执行新指令,而 MC_BUFFER_MODE_BLENDING 用于平滑过渡。

暂无评论,快来抢沙发吧!