4. PLC编程实现:三大主流平台的脉冲输出方案
好,咱们进入正题。脉冲输出这块,说白了就是让PLC按照你的意愿,精确地发出一个个脉冲。你想想看,不管是控制步进电机还是伺服驱动器,最终都是靠这些脉冲来驱动。今天我就把西门子、三菱和CODESYS这三个主流平台的玩法,掰开揉碎了讲给你听。
核心要点:无论哪个平台,脉冲输出的本质都是“频率+数量+方向”。频率决定速度,数量决定位置,方向决定正反转。搞懂这个,你就抓住了灵魂。
4.1 西门子S7-1200/1500:PTO/PWM配置实战
西门子的PTO(脉冲串输出)和PWM(脉宽调制),我最早接触是在一个包装生产线上。当时客户要求每分钟60个包装袋的精准定位,用PTO配合编码器反馈,效果相当稳定。
配置步骤,我一般这么走:
- 硬件组态:在TIA Portal里选中CPU,双击“工艺对象”,新增一个“PTO/PWM”对象。
- 信号类型选择:PTO用于位置控制(步进/伺服),PWM用于速度控制(变频器/加热)。
- 参数设置:脉冲频率上限(通常100kHz)、加减速时间、参考系统单位。
- 硬件分配:把脉冲输出点(如DQ 0.0)和方向输出点(如DQ 0.1)绑定好。
- 编程调用:在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 三大平台对比总结
说了这么多,咱们来张图,把三个平台的脉络理一理:
嗯,这张图把三个平台的脉络都串起来了。你看,虽然各家叫法不同,但底层逻辑是一样的:频率决定速度,脉冲数决定位置,方向信号决定正反转。搞懂这个,换哪个平台你都能快速上手。
我个人建议,初学者先从三菱的PLSY指令入手,简单直接。等理解了脉冲输出的本质,再去看西门子的工艺对象和CODESYS的功能块,你会发现一通百通。