点击慧通工控关注我,设为星标不错过每一篇深度好文
有的同学还一直分不清FB和FC在实际使用过程中的区别,两者看着像双胞胎,用起来却处处是坑?别急,这篇文章就是为你准备的!今天咱们掰开了揉碎了,把这对“兄弟”的核心区别彻底讲清楚,让你的编程从此明明白白!
1. 名字背后的玄机:
FB (Function Block - 功能块): 名字带“Block”,暗示它像一个独立的“功能单元”或“设备模板”。想象成一个自带“小仓库”的工具箱。
FC (Function - 功能): 名字就是“Function”,强调它执行一个特定的、通常无状态的“计算或操作”。想象成一个纯粹的计算器。
2. 最核心的区别:有没有“记忆”(背景数据块 - Instance DB)
这是区分FB和FC的黄金法则!
FB (有“记忆”的伙计):
必带“小仓库” (Instance DB): 每次你调用(使用)一个FB,系统都会自动(或你手动指定)为它分配一个专属的背景数据块 (Instance Data Block)。
“记忆”存什么? 这个DB专门用来存储这个FB实例的静态数据 (STAT):
<ul>内部状态(比如:上次的计时器值、计数器的当前值、设备运行模式标志位)。
输入/输出/输入输出参数 (IN, OUT, IN_OUT) 的实际值。
内部使用的变量值。
意义重大: 正因为有这个私有的“小仓库”,同一个FB可以被多次调用(例如控制多个相同的电机),每个实例都有自己的独立状态和数据,互不干扰! 想想控制5台相同的泵,用1个FB模板创建5个实例,每个实例有自己的启停状态、运行时间、故障记录(存在各自的DB里)。
</ul>FC (健忘的“计算器”):
没有“小仓库”! FC没有属于自己的背景数据块 (Instance DB)。
数据哪里来? 它处理数据主要靠:
<ul>输入参数 (IN): 调用时“喂”给它。
输出参数 (OUT) / 输入输出参数 (IN_OUT): 处理完“吐”出来,或者修改传入的变量。
临时变量 (TEMP): 只在本次FC执行期间存在,执行完就清零/丢弃!没有记忆功能。
访问全局数据 (Global DBs, M区等): 但这不是FC的“私有财产”。
关键特性: FC本身不保存任何状态。每次调用都是全新的开始,只基于本次传入的参数进行计算或操作。上次调用干了啥?它完全不记得!适合做纯计算、逻辑转换、标准化操作(比如单位换算、限幅处理)。
</ul>3. 使用场景大不同:
FB 的舞台 (需要状态记忆 & 多实例):
设备控制模板: 电机控制、阀门控制、驱动器控制(需要记录状态、模式、故障、运行时间等)。
复杂逻辑模块: 包含定时器、计数器且状态需要保持的逻辑(如顺序控制步骤)。
需要多次复用的功能单元: 同一程序里要控制多个相同类型的设备时,FB是首选!每个设备一个FB实例+一个专属DB,清晰隔离。
FC 的战场 (无状态 & 通用操作):
纯计算/转换: 数学运算(求和、平均值、PID计算的一部分)、数据类型转换、单位换算。
标准化逻辑片段: 重复使用的简单逻辑组合(如互锁检查、报警信号生成、通用的位操作)。
组织程序结构: 将大程序分解成更小、更易管理的功能单元(虽然FB也能做,但FC更轻量)。
需要直接操作全局数据或外部IO: 当操作不依赖于内部状态,且结果直接反映到全局或外部时。
4. 形象比喻:
FB 像一台 “咖啡机”:
它有内部状态(水箱水位、豆仓余量、当前温度)。
你设定参数(咖啡浓度、杯数)并按下启动(输入)。
它开始工作(执行),过程中记录状态(加热中... 萃取中...)。
完成后给你咖啡(输出)。
工厂里有10台一样的咖啡机(10个FB实例),每台都有自己的状态(各自的DB),互不影响。
FC 像一个 “计算器”:
你输入两个数字和运算符(IN参数)。
它瞬间算出结果(OUT参数)。
计算结束,它就“忘了”这次计算(TEMP变量清零)。下次计算又是全新的开始。
全公司就一个计算器(FC代码块),谁需要谁来用(调用),用完它不记得谁用过、算过啥(无状态)。
上图示例中表示在一些大型项目中经常用到在FC中可以嵌套FB功能。
5. 重要提醒 & 避坑指南:
FC 的临时变量 (TEMP) 是大坑! 它们只在FC执行期间有效,执行完就被系统回收(值不确定,通常是0或随机值)。千万不要指望TEMP变量在两次调用之间保存数据! 需要保持状态?请用FB!
FB 的 IN_OUT 参数: 传入的是变量的地址引用。在FB内部修改它,会直接影响外部传入的那个变量本身。FC的IN_OUT也是引用传递。
FB 的 OUT 参数: 通常也指向背景DB里的存储位置。FC的OUT参数直接指向调用时指定的地址。
初始化: FB可以在首次扫描时初始化其静态变量。FC没有静态变量需要初始化(TEMP每次执行都重新分配)。
总结一句话:
FB = 功能块 + 专属记忆库 (Instance DB) = 有状态,可多实例化 (设备模板)FC = 纯功能 / 计算 = 无状态,调用即忘 (通用工具) 理解了这个核心区别,选择用FB还是FC就不再是难题!下次编程时,问问自己:这个功能需要记住自己的状态吗?需要控制多个相同的对象吗?如果需要——果断FB!如果只是做一次性的计算或操作——FC足矣!
您的赞助、在看、转发、分享我都喜欢! 请关注我们,不要错过更多分享。
相关精选文章分享: