You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CoDeSys树莓派PLC:Main()中FB每次扫描是否会被重实例化?

关于CoDeSys树莓派PLC中Main块扫描与FB实例化的问题解答

问题1:TON定时器FB为何能持续运行而不被重实例化

  • 首先明确:VAR/END_VAR块内的FB实例属于静态存储,程序启动时仅完成一次内存分配与初始化,生命周期和整个PLC程序一致,并非每次扫描都重新创建。
  • TON内部维护了自身的状态变量(比如当前累计时间、输入触发状态、输出Q的激活状态),这些变量都存储在你定义的TON实例(比如tonMyTimer: TON;)的内存空间中。
  • 每次Main块扫描调用TON时,只是更新该实例的状态:比如检查输入IN的电平变化,对比当前系统时间与上次记录的时间差,累计到内部的时间变量中,当累计值达到PT设定值时触发Q输出。整个过程复用的是已存在的实例内存,不会重新初始化,所以能持续计时。
  • 注意区分VAR和VAR_TEMP:TEMP变量才是每次扫描都会重新初始化,而VAR(包括全局变量、实例变量)都是静态保留状态的。

问题2:单核心PLC中调用FB时Main执行不暂停的线程逻辑

  • 单核心PLC采用循环扫描机制,不存在传统意义上的多线程并行,整个程序执行是串行的:
    1. 输入采样阶段:读取所有输入模块的状态,存入输入映像区;
    2. 程序执行阶段:按顺序执行Main块及所有调用的FB、FC代码,执行FB时只是跑完FB内部的逻辑代码段,执行完成后立即回到Main块继续往下执行,不会因为FB的延时功能(比如TON的1000ms)而暂停整个扫描周期;
    3. 输出刷新阶段:将程序计算后的输出状态写入输出映像区,驱动外部设备。
  • 以TON为例,它的延时功能是靠每次扫描时累计时间差实现的,并非让程序暂停等待。比如每次扫描时,TON会读取当前系统的毫秒数,和上次扫描时记录的毫秒数做差,把差值加到内部的累计时间变量中,当累计值达到PT设定的1000ms时,就触发Q输出。整个过程完全在一个扫描周期的程序执行阶段内完成,不会阻塞Main块的执行。

内容的提问来源于stack exchange,提问作者PoGaMi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:55:58