Codesys基础与运动控制概述
在进入轴组控制与电子凸轮开发之前,必须先建立两个基础支柱:一是对IEC 61131-3编程语言的熟练运用,二是对运动控制库(MC)与轴对象模型的深刻理解。Codesys作为目前工业自动化领域应用最广泛的软PLC开发环境,其核心优势在于将传统的PLC编程范式与面向对象的运动控制抽象完美结合。本章将系统梳理PLC编程基础、IEC 61131-3五种语言的特点与适用场景、运动控制库的架构,以及轴对象这一核心抽象概念。理解这些内容,是后续开发多轴同步、电子凸轮、飞剪等复杂运动控制应用的前提。
上图展示了本章的核心知识框架:Codesys开发环境作为统一平台,向下支撑IEC 61131-3语言编程,向外提供运动控制库(MC)接口,而轴对象则是连接程序逻辑与物理/虚拟执行机构的桥梁。三者相互依存,共同构成运动控制应用开发的技术底座。下面我们逐一深入剖析。
2.1 PLC编程基础与IEC 61131-3语言
核心原理:从继电器逻辑到软件化控制
PLC(可编程逻辑控制器)的编程本质是将硬件继电器电路逻辑转化为软件程序。IEC 61131-3是国际电工委员会制定的PLC编程语言标准,它统一了各大厂商的编程规范,使得程序在不同平台间具有可移植性。该标准定义了五种编程语言:梯形图(LD)、功能块图(FBD)、结构化文本(ST)、指令表(IL)和顺序功能图(SFC)。在Codesys中,这五种语言可以混合使用,同一个程序组织单元(POU)内可以调用不同语言编写的子程序。
| 语言 | 缩写 | 特点 | 适用场景 |
|---|---|---|---|
| 梯形图 | LD | 图形化,直观反映电气回路 | 开关逻辑、互锁、继电器控制 |
| 功能块图 | FBD | 模块化,信号流清晰 | 模拟量处理、PID、逻辑组合 |
| 结构化文本 | ST | 高级语言,类似Pascal | 复杂算法、数据处理、数组操作 |
| 指令表 | IL | 低级汇编风格 | 简单逻辑、资源受限场合 |
| 顺序功能图 | SFC | 状态机驱动,步骤+转换 | 流程控制、步进动作、状态机 |
判断方法:如何选择编程语言
在实际项目中,选择哪种语言取决于任务类型。对于运动控制应用,ST语言是首选,因为它能高效处理数学运算、数组索引和复杂条件判断,例如电子凸轮表的计算、轴组位置插补等。而SFC适合描述设备的工作流程,例如“回零→启动→运行→停止”的状态切换。对于简单的使能信号和急停逻辑,LD或FBD更直观。一个典型的做法是:用SFC搭建主流程框架,用ST编写运动控制算法,用LD处理安全回路。
实战经验:在Codesys中,建议将运动控制相关的POU统一使用ST语言编写,因为MC库的函数块(如MC_MoveAbsolute)的输入输出参数较多,ST语言可以清晰地进行变量赋值和状态读取。例如:
// 使用ST语言调用运动控制功能块
MC_MoveAbsolute_0.Execute := TRUE;
MC_MoveAbsolute_0.Position := 1000.0; // 目标位置,单位mm
MC_MoveAbsolute_0.Velocity := 200.0; // 速度,单位mm/s
MC_MoveAbsolute_0.Acceleration := 500.0;
MC_MoveAbsolute_0.Deceleration := 500.0;
MC_MoveAbsolute_0(); // 调用功能块
案例拆解:一个简单的电机启停控制
假设我们需要控制一台伺服电机实现“启动-运行-停止”功能。使用Codesys,我们创建一个程序组织单元(PRG),采用ST语言编写逻辑。首先定义变量:Start_Btn(启动按钮)、Stop_Btn(停止按钮)、Motor_Enable(使能输出)。逻辑如下:
IF Start_Btn AND NOT Stop_Btn THEN
Motor_Enable := TRUE;
ELSIF Stop_Btn THEN
Motor_Enable := FALSE;
END_IF;
这个简单案例展示了ST语言的条件判断能力。但在实际运动控制中,我们不会直接控制电机通断,而是通过MC库的轴对象来控制。这引出了下一节的内容。
常见误区:初学者容易将PLC编程等同于梯形图编程,忽视ST语言的重要性。在运动控制项目中,如果只用梯形图,处理浮点运算、数组索引(如凸轮表)会非常痛苦。务必掌握ST语言作为主要开发工具。
2.2 运动控制库(MC)简介
核心原理:PLCopen运动控制规范
运动控制库(Motion Control Library)是基于PLCopen标准实现的函数块集合。PLCopen是一个独立于硬件厂商的组织,定义了运动控制的功能块接口规范。Codesys内置的MC库遵循此规范,提供了从单轴控制到多轴插补的完整功能。MC库的核心思想是状态机驱动:每个功能块内部都有状态机(如空闲、运行、完成、错误),通过输入参数(Execute、Enable等)和输出状态(Busy、Done、Error等)来管理运动过程。
MC库功能块分类
- 轴控制:MC_Power(使能)、MC_Reset(复位)、MC_Stop(停止)、MC_Halt(暂停)
- 运动指令:MC_MoveAbsolute(定位)、MC_MoveRelative(相对定位)、MC_MoveVelocity(速度模式)、MC_MoveContinuous(连续运动)
- 回零与测量:MC_Home(回零)、MC_ReadActualPosition(读取实际位置)、MC_SetPosition(设定位置)
- 多轴协调:MC_MoveDirectAbsolute(直接运动)、MC_GearIn(电子齿轮)、MC_CamIn(电子凸轮)、MC_Phasing(相位调整)
操作流程:MC功能块的调用模式
在Codesys中调用MC功能块遵循固定模式:声明实例 → 设置输入参数 → 调用功能块 → 读取输出状态。例如,使用MC_Power使能轴:
// 声明功能块实例
MC_Power_0 : MC_Power;
// 在程序中调用
MC_Power_0.Enable := TRUE; // 使能轴
MC_Power_0.bRegulatorOn := TRUE; // 开启调节器
MC_Power_0.bDriveStart := TRUE; // 启动驱动器
MC_Power_0(); // 执行功能块
// 检查状态
IF MC_Power_0.Status THEN
// 轴已使能,可以执行运动指令
END_IF;
经验提醒:MC功能块是非阻塞的。调用后立即返回,运动在后台执行。必须通过监控输出变量(如Busy、Done)来判断运动是否完成。切勿使用延时等待,否则会阻塞PLC扫描周期。
案例拆解:使用MC_MoveAbsolute实现定位
假设轴已使能,我们需要将轴移动到位置500mm处。关键参数包括位置、速度、加减速度。注意,MC_MoveAbsolute的Execute输入是上升沿触发,即从FALSE变为TRUE时启动运动。因此,我们需要一个触发变量:
// 触发变量
bStartMove : BOOL;
// 功能块调用
MC_MoveAbsolute_0.Execute := bStartMove;
MC_MoveAbsolute_0.Position := 500.0;
MC_MoveAbsolute_0.Velocity := 100.0;
MC_MoveAbsolute_0.Acceleration := 200.0;
MC_MoveAbsolute_0.Deceleration := 200.0;
MC_MoveAbsolute_0();
// 运动完成后复位触发
IF MC_MoveAbsolute_0.Done THEN
bStartMove := FALSE;
END_IF;
这个案例展示了运动控制的基本流程。在实际项目中,还需要处理限位、急停、跟随误差等异常情况,这些将在后续章节详细展开。
2.3 轴对象概念
核心原理:轴作为软件抽象
在Codesys中,轴(Axis)是一个软件对象,它封装了物理伺服轴或虚拟轴的所有属性和行为。轴对象包含位置、速度、加速度、方向、限位、回零状态等数据,并提供使能、运动、停止等方法。轴对象是MC库功能块的操作目标。通过轴对象,我们可以统一地控制不同厂商、不同协议的驱动器(如EtherCAT、CANopen、PROFINET)。
轴的类型与配置
| 轴类型 | 说明 | 典型应用 |
|---|---|---|
| 实轴(Physical Axis) | 映射到实际驱动器/电机 | 伺服电机、步进电机、变频器 |
| 虚拟轴(Virtual Axis) | 仅存在于软件中,无物理输出 | 电子凸轮主轴、计算轴、模拟轴 |
| 轴组(Axis Group) | 多个轴的集合,用于插补 | 笛卡尔机器人、龙门同步 |
轴对象的生命周期管理
轴对象的使用遵循明确的生命周期:创建/配置 → 使能(MC_Power)→ 回零(MC_Home)→ 运动控制 → 停止/禁用。在Codesys的轴配置界面中,需要设置驱动器类型、单位换算(脉冲数/毫米)、最大速度、加速度、软限位等参数。这些参数直接影响MC功能块的执行效果。
关键参数说明:轴的位置单位通常设为mm或度,速度单位为mm/s或°/s。在配置时,必须正确设置编码器分辨率(如每转脉冲数)和机械传动比(如减速比、丝杠导程),否则位置控制会出现严重偏差。
案例拆解:虚拟主轴在电子凸轮中的应用
在电子凸轮应用中,通常需要一个虚拟主轴作为凸轮的主轴,从轴跟随主轴运动。虚拟轴不连接物理电机,而是由程序设定其速度或位置。例如,在飞剪应用中,虚拟主轴以恒定速度旋转,从轴(剪切刀)通过电子凸轮表跟随主轴位置。这样,即使主轴速度变化,从轴也能保持同步。虚拟轴的配置与实轴类似,但无需映射驱动器。
// 设置虚拟主轴速度
MC_MoveVelocity_0.Axis := VirtualAxis; // 虚拟轴引用
MC_MoveVelocity_0.Execute := TRUE;
MC_MoveVelocity_0.Velocity := 360.0; // 360度/秒
MC_MoveVelocity_0();
常见误区:初学者容易混淆轴对象与功能块实例。轴对象是数据实体,功能块是操作工具。一个轴可以被多个功能块操作,但同一时刻只能有一个运动指令有效。例如,不能同时执行MC_MoveAbsolute和MC_MoveVelocity,否则会报错。
2.4 总结复盘与常见误区
知识结构回顾
本章建立了三个核心概念:IEC 61131-3语言提供了编程手段,MC库提供了运动控制的标准功能块,轴对象是被控制的目标实体。三者关系紧密:用ST语言编写逻辑,调用MC功能块,作用于轴对象。理解这个模型,后续学习轴组同步和电子凸轮将水到渠成。
常见误区清单
- 误区一:忽视ST语言,只用梯形图。运动控制算法复杂,ST是必备技能。
- 误区二:忘记功能块是异步执行的。必须通过状态变量同步,不能依赖扫描周期。
- 误区三:轴配置错误。单位换算、编码器分辨率、传动比设置错误会导致运动距离不符。
- 误区四:多个运动指令同时触发。同一轴同一时刻只能有一个运动指令有效。
- 误区五:忽略回零操作。定位前必须回零,否则位置基准错误。
实战复盘:一个完整的单轴调试流程
假设我们调试一台伺服电机驱动的丝杠滑台。步骤如下:
- 硬件连接:伺服驱动器通过EtherCAT连接至PLC,编码器反馈接入。
- 轴配置:在Codesys中添加轴,选择EtherCAT驱动器,设置每转脉冲数(如10000),丝杠导程10mm,则位置单位mm,速度单位mm/s。
- 使能测试:编写简单程序调用MC_Power,观察轴状态变为Standstill。
- 回零测试:调用MC_Home,设置回零方式(如限位开关回零),确认位置归零。
- 点动测试:使用MC_MoveVelocity以低速(如10mm/s)运行,检查方向是否正确。
- 定位测试:调用MC_MoveAbsolute移动到100mm处,用千分表验证实际位置。
这个流程是后续所有运动控制开发的基础。每一步都需要验证,避免问题累积。在调试过程中,如果出现位置偏差,优先检查单位换算和编码器方向。
经验总结:运动控制开发的核心是状态管理。建议在程序中建立轴状态监控逻辑,实时读取轴错误代码,并在界面上显示。这样能快速定位问题,减少调试时间。