-
知识分享
-
PLC标准化
-
工业机器人
-
工控软件
多轴项目CPU跑不动?西门子S7-1500高性能运动控制编程指南要点
Profiling定位耗时、FB按需调用、OB合理分层,不换CPU也能降负载缩周期
先说什么时候需要这份指南
做过十几轴、几十轴项目的工程师,大概率碰到过这两类问题:一是控制器因为程序执行超时直接停机,CPU 负载高、OB 周期长;二是运动控制和逻辑控制混在一起,代码执行效率低,整机节拍始终达不到设计值。
西门子工业在线支持条目 109975690《SIMATIC S7-1500 高性能运动控制编程指南》,专门回答一个问题:在不更换更快控制器的前提下,怎么把 CPU 负载压下来、把循环周期缩回去。 这份文档适用于 S7-1500 硬件控制器和软件控制器(软 PLC),是对通用《S7-1200/1500 编程指南》(Entry 90885040)在运动控制场景下的专项补充。
当然手册也提醒:优化手段要结合自身工艺特点,如果算下来确实不够,该换 CPU、加 CPU 还是要换,优化不能替代容量规划。
第一步:用 Profiling 摸清时间花在哪
优化之前先测量,不要凭感觉改代码。Profiling 是西门子提供的程序深度诊断工具,可以清楚看到 CPU 的任务分配,以及每个 OB、FB、FC 各占多少执行时间——哪条运动指令耗时高、哪个工艺对象 DB 读写频繁,一目了然。标准用法见官方应用示例 SIMATIC Controller Profiling(Entry 109750245)。
几个实操要点:
• 导出时 Export Range 选 OB1 作为周期,范围建议取 1~5,不要超过 10 个周期,范围太大打开和缩放视图会明显卡顿;
• 软件控制器如 CPU 1508S TF V30.1 出厂没有集成 Profiling,需要向西门子获取带 Profiling 功能的专用 CPU.elf 文件,替换路径在 C:\Boot\Siemens\SWCPU,替换前务必备份原文件、替换后重启 IPC,原来建过桥接网口的要重新建桥;
• 激活 Profiling 本身会增加 CPU 负荷,诊断结束后记得关闭功能、把原 elf 文件归位。
编程优化一:运动控制 FB 不要无条件调用
轴一多,MC_Power、MC_Reset、MC_Stop 这类指令就一大堆。很多人习惯把 EN 引脚一直接 TRUE,在 SCL 里就是无条件调用——哪怕轴早已使能、没有任何故障,这些块每个扫描周期照样执行一遍,全是重复劳动。
手册给出的改法是"按状态调用":
• MC_Power:先判断轴的当前状态与命令是否一致,只有状态不符(需要上使能或撤使能)时才调用;
• MC_Reset:只有"轴有错误"且"复位按钮按下"两个条件同时成立才调用。建议用 CASE 管理时序:第一个周期先复位 Execute 并清掉上次的状态信号,第二个周期执行复位,等功能块执行完毕就停止调用;
• MC_Stop:停止命令触发时立即调用,用 busy 输出保持调用,Done 或 Error 后撤销 Execute——Execute 变 FALSE 后 Done/Error 也跟着变 FALSE,块自然停止。
编程优化二:减少对工艺对象的直接读写
Profiling 里经常能看到,对工艺对象 DB 的读写意外地耗时。工艺对象状态参数成百上千,频繁访问的代价不小。手册给了四条原则:
• 轴的位置、速度每个周期只读一次,存进静态变量或临时变量,后续逻辑全部用这个副本,不要反复读工艺对象的 Position、Velocity 两个变量;
• 只有工艺对象真的报错时,才进一步读取详细报警编号;
• StatusWord 一次性读到静态变量里再拆位使用,避免直接读取状态字的某一位;
• 避免对工艺对象重复写入相同的值,典型的是 override(倍率)。
还有一个和响应速度相关的知识点:PIP OB Servo(过程映像分区)在每个 MC-Servo 应用周期更新一次,而 OB1 的循环时间大多数情况下会超过一个 PROFINET 更新周期。所以如果某段程序要求快速逻辑响应,要把它挪到 MC-PreServo(OB67)或 MC-PostServo(OB95)里,保证每个应用周期都有命令和状态更新。但要注意:同步周期 OB 里程序量过大,会显著抬高 CPU 停机风险,只放真正需要实时响应的部分。
编程优化三:CASE 提速与沿指令替代
一个周期跑多个 CASE 步序。 CASE 语句天然一个周期只走一个分支。如果工艺要求一个周期内连续推进多个步序,有两种写法:用 FOR 循环包裹 CASE 再次调用(缺点是 FOR 内部代码无法在线实时监控);或者把一个步序拆成多个不重复的 CASE 编号(可以监控,但要人为保证编号不冲突,避免错误执行)。无论哪种,都要检查程序本身的时序依赖。
少用 R_TRIG / F_TRIG。 手册在 CPU 1508S TF V30.1 上实测:处理一个上升/下降沿功能块需要 40~70ns,加上调用 FB 的固定开销,一个沿将近 100ns;而 CPU 直接处理一个位只需要约 1ns,相差两个数量级。轴多、沿指令成百上千时,这笔账很可观。建议用变量记录信号上一周期状态、自行比较的方式产生边沿,官方 LAxisCtrl 库中就是这种写法。
设置优化一:发送时钟不是越小越好
发送时钟以 0.125ms 为一个档位:未激活高性能选项时最小只能设 1ms;激活高性能后可以设到 1ms 以下,但 IRT 节点数量必须满足:节点数小于(发送时钟 ÷ 0.125)× 8。
手册明确指出:从运动控制角度看,IRT 网络中 2ms 伺服周期和 4ms 伺服周期,在改善轴跟随误差方面差别并不明显。所以盲目追求小周期没有意义。判断方法是:
• 当前 OB1 周期明显小于发送时钟,说明 PLC 性能有余量,可以往下调发送时钟;
• 一旦 OB1 周期明显升高、甚至超过发送时钟,立刻停止下调;
• 带安全功能的 CPU,执行 Safety OB 时会打断 OB1,评估周期时要把这个因素算进去。
设置优化二:合理分配 OB 与优先级
西门子 PLC 的执行机制决定了:必须把不同实时性要求的程序放进不同优先级的 OB。用 RT_INFO 或 runtime 功能块可以抓取 OB 的净执行时间(扣除被高优先级 OB 打断的部分)和循环时间,作为分配依据。
OB | 名称/角色 | 放什么程序 | 注意事项 |
OB1 | 主循环 | 常规工艺逻辑、运动控制主体 | 通讯负载会计入 OB1 周期 |
OB67 | MC-PreServo | 需要每个应用周期更新的快速命令逻辑 | 程序过大会抬高峰值负荷 |
OB95 | MC-PostServo | 伺服后的高优先级处理 | 程序过多可能 OB95 溢出导致停机 |
OB92 | MC-Interpolator(插补器) | 系统运动学插补,勿塞用户程序 | 主值递归会造成其执行时间阶跃 |
OB91 | MC-Servo | 伺服控制相关 | 多轴同时上使能可能溢出 |
OB30 等 | 循环中断 | OB95 装不下时接替一部分;HMI 程序放慢速档(如 500ms) | 优先级建议大于 15 |
优先级有个关键数字:15。系统非实时通讯(S7 通讯、TCP/UDP、Modbus TCP、HTTP 等开放式通讯)的优先级就是 15。循环中断 OB 的优先级建议设为大于 15,避免通讯负载过大时把安全程序的看门狗拖超时。
两个隐蔽大坑:通讯负载与主值递归
通讯负载。 博途在线监控、Web 访问、用 PRONETA 扫描网络,都可能引起通讯负载突增,进而导致 OB1 看门狗超时——很多"怎么一监控就停机"的怪现象根源在这。而且通讯负载实际占 OB1 周期的比例,可能比 CPU 属性里设定的百分比更大,在 OB1 被高优先级 OB 频繁打断的场景尤其明显。建议用 RT_INFO 实测当前通讯负载率,在满足使用要求的前提下把设定值尽量调低。
主值互联"递归"。 做电子齿轮、电子凸轮时,如果两个轴互为主值——轴 1 的主值互联到轴 2 的设定值或实际值,轴 2 又互联回轴 1——即使逻辑上不会真的互相跟随,也会让 OB92 执行时间出现不规则阶跃,执行 MC_GearIn、MC_CamIn 同步指令时尤其明显,严重时 CPU 停机。排查方法:打开工艺对象的主值互联概览,图形化地找出闭环,删掉递归关系后阶跃立刻消失。这个坑非常隐蔽,建议多轴同步项目投运前统一检查一遍。
软 PLC 专项:让 Windows 靠边站
对 CPU 150xS 这类软件控制器,后台 Windows 本身会影响实时性。确认能成功在线连接和下载程序之后,可以禁用 Windows 让软 PLC 独立运行:进入 C:\Program Files (x86)\Siemens\Automation\CPU 150xS\ResourceConfigurator,把硬件组态文件中的 plc_priority 从 4 改为 10,执行一次资源组态器后生效。需要恢复 Windows 时,重启 IPC 在 boot 界面选择 "Windows and 1500 software",若要长期保持 Windows 开启,再把配置改回 4 并重新执行资源组态器。
防止 CPU STOP:三件事做到位
• 多轴分组上下使能:轴数很多时,如果所有轴同一时刻触发 MC_Power 或 MC_Reset,可能造成 OB91 溢出停机。把轴分成几组,每组间隔 10~30ms 错峰执行。注意急停通道例外——不要在 MC_Stop 前加延时,除非工艺明确要求;急停触发安全功能停机时,应检查安全程序看门狗,必要时加大看门狗时间。
• 数组超限是高频编程错误:典型例子是建了 1..9 的数组,FOR 循环索引却从 0 开始或多跑一次。实在临时定位不了时,可以先建一个 Program error OB 兜底,让数组越限时 CPU 保持 RUN,再回头根治;长期带病运行不可取。
• 看门狗要按实测设置:用 RT_INFO 测 OB1 周期;安全 FB 内部不能直接调用 runtime,需要建两个 FC 作为 Pre processing 和 Post processing,在安全 OB 前后各调用一次,夹出安全 OB 的真实执行时间,再据此设置看门狗。
一张表汇总关键数字
项目 | 数值 / 结论 |
沿指令 vs 位处理耗时(1508S TF 实测) | 一个沿约 100ns;处理一个位约 1ns |
发送时钟档位 | 0.125ms 一档;未激活高性能最小 1ms |
IRT 节点限制 | 节点数小于(发送时钟 ÷ 0.125)× 8 |
伺服周期经验 | 2ms 与 4ms 对跟随误差改善差别不明显 |
多轴分组错峰间隔 | 每组 10~30ms |
非实时通讯优先级 | 15(S7、TCP/UDP、Modbus TCP、HTTP) |
HMI 类程序推荐 OB 周期 | 慢速循环中断,如 500ms |
Profiling 导出周期 | 建议不超过 10 个 OB1 周期 |
软 PLC 提优先级 | plc_priority 由 4 改到 10 |
写在最后
这份指南的价值不在某一条奇技淫巧,而在它建立了一套方法论:先测量(Profiling/RT_INFO)→ 再分类(编程、组态、网络、系统)→ 按收益动手 → 留出安全余量。 多轴项目的性能问题,十有八九不是 CPU 真的不够用,而是无条件调用的 FB、反复读写的工艺对象、塞太满的同步 OB、缺乏检查的主值递归一点点累积出来的。养成先看数据再改代码的习惯,比换更高档的 CPU 更能解决问题。
蒙科技课程推荐
屯蒙科技专属工控/西门子技术课程上线啦!专业讲师授课,覆盖PLC、WinCC、运动控制等核心内容,助力提升技术能力,详情可咨询社群管理员或关注公众号后续推送。
开班课程介绍1PLC标准化(PackML)
PackML框架,起源于西门子官方框架案例,现在已经横推到汇川iFA,Inproshop,Codesys。
PackML框架开课!从西门子博途到汇川iFA/Inproshop/Codesys,一套框架通吃四大平台
2西门子OPENNESS
PLC标准化的高阶课程,实现PLC代码自动生成,组态自动生成
西门子TIA Portal OPENNESS从"手活"到"代码活"的全套实战课程
3西门子运动控制
聚焦西门子1500T,同步,凸轮,追剪,收放卷
4西门子Wincc Unified
西门子最新HMI系列
