4. PLC编程实现:三大主流平台的脉冲输出方案

好,咱们进入正题。脉冲输出这块,说白了就是让PLC按照你的意愿,精确地发出一个个脉冲。你想想看,不管是控制步进电机还是伺服驱动器,最终都是靠这些脉冲来驱动。今天我就把西门子、三菱和CODESYS这三个主流平台的玩法,掰开揉碎了讲给你听。

核心要点:无论哪个平台,脉冲输出的本质都是“频率+数量+方向”。频率决定速度,数量决定位置,方向决定正反转。搞懂这个,你就抓住了灵魂。

4.1 西门子S7-1200/1500:PTO/PWM配置实战

西门子的PTO(脉冲串输出)和PWM(脉宽调制),我最早接触是在一个包装生产线上。当时客户要求每分钟60个包装袋的精准定位,用PTO配合编码器反馈,效果相当稳定。

配置步骤,我一般这么走:

  1. 硬件组态:在TIA Portal里选中CPU,双击“工艺对象”,新增一个“PTO/PWM”对象。
  2. 信号类型选择:PTO用于位置控制(步进/伺服),PWM用于速度控制(变频器/加热)。
  3. 参数设置:脉冲频率上限(通常100kHz)、加减速时间、参考系统单位。
  4. 硬件分配:把脉冲输出点(如DQ 0.0)和方向输出点(如DQ 0.1)绑定好。
  5. 编程调用:在OB1里调用“MC_Power”和“MC_MoveRelative”等运动控制指令。

我的小技巧:在TIA Portal里,记得把“脉冲发生器”的硬件中断打开。我曾经遇到过一次脉冲丢步,查了半天,最后发现是中断没使能,导致高速脉冲被其他任务打断了。

来看一段典型的PTO配置代码(SCL语言):

"MC_Power_Instance"(
    Axis := "Axis_1",
    Enable := TRUE,
    StopMode := 0,
    Power => "Power_Status"
);

"MC_MoveRelative_Instance"(
    Axis := "Axis_1",
    Execute := "Start_Move",
    Distance := 1000.0,   // 脉冲数
    Velocity := 50000.0,  // 频率 Hz
    Acceleration := 1000.0,
    Deceleration := 1000.0,
    Done => "Move_Done",
    Busy => "Move_Busy"
);

这里要注意,Distance的单位取决于你在工艺对象里设的“每转脉冲数”。我习惯设成“脉冲数”直接对应,这样调试时心里有数。

警告:西门子的PTO输出,默认是“漏型输出”(源型)。如果你的驱动器是“源型输入”,必须加中间继电器或光耦转换电平。我见过有人直接接,结果烧了PLC的输出点——那叫一个心疼。

4.2 三菱FX系列:PLSY/PLSR指令的硬核玩法

三菱的FX系列,老工程师都懂,皮实耐用。PLSY和PLSR这两个指令,我用了十几年,从FX1N到FX5U,基本没变过。

PLSY(脉冲输出)指令:

  • 格式:PLSY D0 D1 Y0
  • D0:输出频率(Hz)
  • D1:输出脉冲数(0为连续输出)
  • Y0:脉冲输出点(Y0/Y1可选)

PLSR(带加减速的脉冲输出)指令:

  • 格式:PLSR D0 D1 D2 Y0
  • D0:最高频率
  • D1:总脉冲数
  • D2:加减速时间(ms)
  • Y0:脉冲输出点

我举个例子。有一次做一台自动螺丝机,需要快速启停。用PLSY的话,启动瞬间电机“哐”一下冲出去,螺丝直接打滑。换成PLSR,加上20ms的加减速时间,动作就柔顺多了。

// 梯形图示例
LD M0          // 启动信号
PLSR D100 D101 D102 Y0  // 带加减速脉冲输出

// 数据寄存器赋值
MOV K50000 D100  // 最高频率 50kHz
MOV K2000 D101   // 总脉冲数 2000
MOV K20 D102     // 加减速时间 20ms

避坑指南:三菱的PLSY/PLSR指令,在执行期间不能修改频率和脉冲数。我曾经想在线调整速度,结果指令直接报错,电机停在那不动了。正确的做法是:先停止输出(用M0复位),改完参数再重新启动。

PLSY vs PLSR 对比:

特性 PLSY PLSR
加减速 无 有(梯形加减速)
适用场景 低速、启停不频繁 高速、频繁启停
脉冲精度 高(无加减速误差) 中等(加减速段有微小误差)
指令占用时间 短 较长(需计算加减速曲线)

4.3 CODESYS平台:MC_Power功能块的优雅封装

CODESYS平台,现在越来越流行。它的MC_Power功能块,把脉冲输出的底层细节都封装好了。你只需要配置参数,调用指令,剩下的交给运行时系统。

MC_Power功能块的核心参数:

  • Axis:轴引用(在轴组态里定义)
  • Enable:使能信号(TRUE为启动)
  • StopMode:停止模式(0=急停,1=减速停)
  • Status:状态输出(是否已使能)
  • Error:错误输出

我一般在轴组态里先设好“每转脉冲数”、“最大频率”、“加减速时间”。然后在程序里这样调用:

// 使能轴
MC_Power_0(
    Axis := Axis_1,
    Enable := TRUE,
    StopMode := 0,
    Status => Power_Status,
    Error => Power_Error
);

// 绝对定位
MC_MoveAbsolute_0(
    Axis := Axis_1,
    Execute := Start_Move,
    Position := 50000,    // 目标位置(脉冲数)
    Velocity := 100000,   // 速度(脉冲/秒)
    Acceleration := 5000,
    Deceleration := 5000,
    Done => Move_Done,
    Busy => Move_Busy,
    Error => Move_Error
);

注意:CODESYS的MC_Power使能后,轴会进入“Standstill”状态。此时如果直接给Move指令,可能会报错。我习惯在使能后加一个200ms的延时,等轴状态稳定了再发运动指令。

CODESYS还有一个好处:支持电子齿轮和电子凸轮。如果你做多轴同步,比如印刷机的套色系统,用MC_GearIn和MC_CamIn功能块,比用脉冲硬同步方便太多了。

4.4 三大平台对比总结

说了这么多,咱们来张图,把三个平台的脉络理一理:

三大平台脉冲输出方案对比 西门子 S7-1200/1500 三菱 FX 系列 CODESYS 平台 PTO/PWM 工艺对象 PLSY / PLSR 指令 MC_Power 功能块 关键参数: 频率上限、加减速 参考系统、硬件分配 关键参数: 频率、脉冲数 加减速时间(PLSR) 关键参数: 轴引用、使能、停止模式 位置、速度、加减速 核心本质:频率 + 数量 + 方向 = 精准运动控制

嗯,这张图把三个平台的脉络都串起来了。你看,虽然各家叫法不同,但底层逻辑是一样的:频率决定速度,脉冲数决定位置,方向信号决定正反转。搞懂这个,换哪个平台你都能快速上手。

我个人建议,初学者先从三菱的PLSY指令入手,简单直接。等理解了脉冲输出的本质,再去看西门子的工艺对象和CODESYS的功能块,你会发现一通百通。