在西门子S7 PLC上配置PWM

脉宽调制是具备固态输出功能PLC(如图1所示的西门子_Siemens 第二代CPU 1214C)的可选功能。本工程流程简报将展示如何配置PLC的PWM输出,并提供数值缩放技巧及西门子S7模拟量格式的使用建议(该格式下模拟量值以-27,648至27,648之间的整数表示)。

概览(测试配置)

  • CPU:采用TIA Portal v20的S7-1200 CPU 1214C(第二代)
  • 直接脉冲发生器控制未使用西门子技术对象(TO)
  • 脉冲发生器名称:Pulse_1
  • 时基:100毫秒周期(10赫兹)
  • 输出引脚:位于Q0.0的本地DC/DC/DC输出引脚(向负载提供24V直流电)
  • 占空比写入地址:采用S7模拟量格式的%QW1016(单极性0…27648)
  • 占空比例:变量0至100%,但需添加合理性校验块
  • 更新任务:循环中断OB30(例如1秒)

本文属于DigiKey工业自动化现场指南系列

位置 :编程→PID与模拟量
难度:gear: 工程师级——难度等级说明
最后更新 :2026年3月6日


1 :安装在Phase Dock实训台上的西门子第二代S7-1200 CPU 1214C

技术提示 :PWM输出仅适用于DC/DC/DC型PLC本案例中使用的PLC需24V直流电源供电,配备直流输入和固态输出

DC/DC/继电器型PLC不支持PWM功能可通过插件模块、扩展模块或ET 200SP系列分布式I/O为PLC扩展PWM功能

激活 S7-1200 PWM 的步骤

设置S7-1200 PWM需分步操作

硬件配置

第一步是配置S7-1200硬件脉冲发生器如图2所示,在硬件配置部分完成此操作

  • 启用脉冲发生器(Enable the pulse generator)

  • 为其命名:Pulse_1。

  • 设置为PWM模式,包括所需时基、周期及输入格式。我们采用下一技术要点中描述的S7 模拟格式 (S7 analog format)

  • 选择运行时修改占空比以实现动态PWM调节。

  • 将PWM输出至目标引脚:Q0.0。

  • 记住PWM的起始地址,该地址将用于设置占空比。本例中地址为%QW1016。

2 :PWM硬件配置示意图。

技术要点 :西门子程序员常用"S7模拟格式(S7 analog format)"。根据定义,数值范围为-27,648至27,648。例如,0至20mA电流输入对应0至27,648,而-10至10VDC输入则映射为-27,648至27,648。点击此处获取数据标准化与缩放的更多信息。

编译并下载硬件变更

如图3所示,先编译以更新硬件配置。随后选择"下载到设备( download to device "将变更应用至PLC。

3 :TIA Portal中PLC硬件编译指令位置示意图。

分配标签名

为PWM内存地址分配易记的标签名。例如,我创建了PWM标签表,并将 intDutyCycle标签映射至内存地址%QW1016。

在代码中激活 PWM

需使用图4所示的CTRL_PWM功能块来激活硬件脉冲发生器。本示例通过选择开关启用PWM。注意CTRL_PWM属于西门子功能库(V20版本已验证)。

4 :控制PWM模块将激活脉冲发生器。

缩放并写入目标占空比

PWM占空比可通过实时写入先前定义为 intDutyCycle(%QW1016)的内存位置进行修改,如图5所示。

  • 顶部梯级 :除非选择开关(SW1)激活,否则强制占空比归零。
  • 映射梯级 :使用浮点映射功能块(称为fMap)将百分比占空比转换为西门子S7模拟量格式。本例中将0.0至100.0映射为0到27,648。您可以将代码复制到TIA Portal中。

映射代码详见清单1。该代码可直接粘贴使用,前提是您需先在新功能块中添加I/O和内存接口。生成的功能块通常包含在循环中断OB中。例如,温度PID可能每秒更新一次PWM(相关文章即将发布)。

5 :向PWM脉冲发生器写入新占空比。注意此处使用隐式转换将实数转为整数。

(*
 * FUNCTION_BLOCK fMap (Floating-Point Mapping)
 * DESCRIPTION:
 *   Scales an input value linearly from [rInMin, rInMax] to [rOutMin, rOutMax].
 *   Supports reversed ranges (negative slope) and allows extrapolation
 *   beyond input limits. When xEnable = FALSE or spans are invalid 
 *   (|span| ≤ rEpsilon), the block holds the last valid output.
 *
 * NOTE:
 *   Siemens ADC full-scale values:
 *      - Current inputs (0 to 20mA):  0 to 27,648
 *      - Voltage inputs (-10 to 10 VDC): -27,648 to +27,648
 *   Ref: https://support.industry.siemens.com/cs/mdm/109741593
 *
 * TODO:
 *   1) Add complementary alarm unit for min/max warnings and limits.
 *   2) Implement a saturation (clamp) block to constrain I/O values.
 *   3) Replace "magic numbers" (e.g., 5530 for 4–20 mA lower bound) 
 *      with named constants.
 *
 * INPUTS:
 *   #xEnable      : BOOL   → FALSE holds last valid output
 *   #rEpsilon     : REAL   → Small span guard, recommended 1e-5
 *   #rIn          : REAL   → Input value (raw or normalized)
 *   #rInMin       : REAL   → Lower input limit
 *   #rInMax       : REAL   → Upper input limit
 *   #rOutMin      : REAL   → Lower output limit
 *   #rOutMax      : REAL   → Upper output limit
 *
 * OUTPUTS:
 *   #rOut         : REAL   → Scaled output or last valid value
 *   #xScalingError: BOOL   → TRUE when spans invalid (|span| ≤ rEpsilon)
 *
 * INTERNAL VARIABLES:
 *   (Retained between scans)
 *   #rInSpan   : REAL  // Input span
 *   #rOutSpan  : REAL  // Output span
 *   #rGain     : REAL  // Calculated slope
 *   #rLastOut  : REAL  // Retained last valid output
 *
 * Header written with assistance from GPT 5o
*)

IF NOT #xEnable THEN
    #rOut := #rLastOut;
    RETURN;
END_IF;

#rInSpan := (#rInMax - #rInMin);
#rOutSpan := (#rOutMax - #rOutMin);

IF (ABS(#rInSpan) > #rEpsilon)   // Only scale if the in and out spans are meaningful.
    AND (ABS(#rOutSpan) > #rEpsilon) THEN
    
    #rGain := #rOutSpan / #rInSpan;
    #rOut := ((#rIn - #rInMin) * #rGain) + #rOutMin;
    #rLastOut := #rOut;
    #xScalingError := FALSE;
    
ELSE
    #rOut := #rLastOut;
    #xScalingError := TRUE;
END_IF;

清单 1 :使用浮点映射缩放块将百分比占空比转换为S7模拟量格式。

技术提示 :清单1的fMap函数灵感源自Arduino的map函数。参阅此页面了解线性缩放过程的更多信息。注意代码已针对PLC进行适配,新增功能包括未启用时保持最后数值。还包含通过ε锁定防止接近零的小数值。

结果

通过Digilent ADP2230测量到的PLC输出信号如图6所示。

  • PLC驱动着1kΩ电阻(图中未显示,配置为源型输出)。
  • 输出电平在0V和约24VDC之间切换。
  • 波形周期为100毫秒(10Hz)。请注意这是图2所示的可调字段。
  • 占空比(导通时间)约为24%。

6 :PLC的PWM输出波形(驱动1kΩ电阻)。

技术提示 :当心感应反冲!西门子PLC的固态输出端具有保护功能。然而,依赖内部保护来钳制高压感应尖峰通常是不良实践。本文展示了工业继电器中如何内置极性保护,而另一篇文章则阐述了在控制较大电机启动器时使用中间继电器的必要性。

结语

  • 敬请关注,PWM将应用于PID控制热力系统的案例。

  • 以防御性编程之名打破常规代码。缺少了什么?

  • 别让您的 PLC 吞下感应尖峰!

:books: 继续探索工业控制系统

若本文对您有所启发,您可能还对以下内容感兴趣:

:world_map: DigiKey 导航

:japanese_symbol_for_beginner: 相关基础文章