乐于分享
好东西不私藏

【AI PLC每日一课】FB功能块的记忆秘密:实例数据块是什么?

【AI PLC每日一课】FB功能块的记忆秘密:实例数据块是什么?

——工厂里那个”会记住你”的工具箱


📖 故事开始

小工盯着TIA Portal屏幕,眼睛里飘出一堆问号。

屏幕上赫然出现一行红色报错:

FB must be called with an instance data block!

小工:(挠头)啊?!FB和FC不是都是”功能”吗,为什么不能直接调用?!

就在这时,一只调皮的小红精灵从报错信息里跳了出来——这就是无处不在的”故障精灵”。

故障精灵:哈哈哈!以为FB跟FC一样?错了错了!你少了一样东西!

工程师推开门走进来,腰间工具包发出神秘的光芒。

工程师:小工,来,我来给你讲讲FB和FC的根本区别。


🧰 神奇道具登场:工具箱记忆测试仪

工程师从工具包里掏出一件发光的设备——

【工具箱记忆测试仪】✨

想象两个工具箱摆在你面前:


📦 FC工具箱(无状态)

┌─────────────────────────┐│       FC 工具箱          ││                         ││  取出扳手 → 用 → 还回    ││                         ││  [ 内部:空空如也 ]      ││  每次用完,一片空白      │└─────────────────────────┘

FC = 功能(Function)

  • • 每次调用都是”全新开始”
  • • 不保留任何上次的状态
  • • 像一个共享的工具台,用完就走,不留痕迹

适合用FC的场景:

  • • 数学计算(加减乘除、单位换算)
  • • 逻辑判断(比较大小、条件判断)
  • • 信号转换(4-20mA → 实际温度)

🗄️ FB工具箱(有状态)

┌─────────────────────────────────────────┐│              FB 工具箱                   ││                                         ││  ┌─────────────┐  ┌─────────────┐      ││  │  Motor1_DB  │  │  Motor2_DB  │      ││  │ 速度: 1500  │  │ 速度: 750   │ ...  ││  │ 启停: 247次 │  │ 故障: 3次   │      ││  └─────────────┘  └─────────────┘      ││                                         ││  每个调用者都有自己的专属抽屉!          │└─────────────────────────────────────────┘

FB = 功能块(Function Block)

  • • 每个调用实例都有专属的”抽屉”(实例数据块DB)
  • • 状态永久保存,断电重启也不丢
  • • 不同设备调用同一个FB,各有各的数据

适合用FB的场景:

  • • 电机控制(需要记录启停次数、运行时间)
  • • 阀门控制(需要记录当前开度、故障状态)
  • • PID调节(需要保存积分值、上次误差)

💡 小工的顿悟时刻

小工:(眼睛一亮💡)我明白了!FB就像有多个抽屉的工具柜,Motor1用Motor1的抽屉,Motor2用Motor2的抽屉,互不干扰!

助手:(拿着平板走进来)对!所以在TIA Portal里,调用FB时会弹出这个对话框——要你选择或新建一个实例数据块(DB),这就是给这次调用分配专属抽屉!


⌨️ 代码写法对比

FC 调用方式(无需DB)

// 直接调用,不需要数据块CALL FC10  InputSpeed := Motor1_Speed;  OutputStatus := Motor1_Status;

FB 调用方式(必须指定DB)

// 必须绑定实例数据块 DB20CALL FB20, DB20  InputSpeed := Motor1_Speed;  OutputStatus := Motor1_Status;

⚠️ 常见错误:忘记创建DB就调用FB,就会出现那行让小工崩溃的报错信息!


🎯 实战操作步骤(TIA Portal)

第一步:创建FB

  1. 1. 项目树 → 程序块 → 添加新块
  2. 2. 选择”功能块(FB)”,填写名称(如:FB_MotorControl)
  3. 3. 编写电机控制逻辑

第二步:在主程序中调用时,先创建实例DB

  1. 1. 拖拽FB到OB1主程序
  2. 2. 弹出对话框:选择”新建数据块”
  3. 3. 命名为 Motor1_DB(建议用设备名+_DB)
  4. 4. 确认,系统自动生成对应DB

第三步:访问实例DB中的数据

// 可以直接读取Motor1_DB中保存的数据Motor1_RunTime := Motor1_DB.RunTime;Motor1_StartCount := Motor1_DB.StartCount;

📊 FC vs FB 速查对比

特性
FC (功能)
FB (功能块)
实例数据块
❌ 不需要
✅ 必须有
记忆运行状态
❌ 不保留
✅ 永久保存
断电后数据
❌ 丢失
✅ 保留
调用语法
CALL FC10 CALL FB20, DB20
典型用途
运算/转换/判断
电机/阀门/PID
内存占用
较小
较大(每实例一个DB)

📝 工程师的金牌口诀

小工:(认真在笔记本上写下——)

📌 口诀一:无状态 → 用FC,有状态 → 用FB

📌 口诀二:调FB前,先建DB!

📌 口诀三:一个FB + N个DB = N个独立设备实例

故障精灵灰溜溜地逃跑了,工程师满意地点点头。

工程师:掌握了这个,你已经理解了西门子PLC最核心的编程架构。明天我们讲多重实例DB——让多个FB嵌套共用一个DB,效率翻倍!


🔖 今日知识点总结

  1. 1. FC(功能)= 无状态函数,每次调用独立运行,适合纯计算任务
  2. 2. FB(功能块)= 有状态功能块,每个调用实例有专属DB,适合有记忆需求的控制逻辑
  3. 3. 实例数据块(DB)= FB的”专属抽屉”,存储该实例的所有运行数据
  4. 4. 一个FB可以被多次调用,每次调用绑定不同的DB,实现设备复用
  5. 5. 调用FB前,必须在TIA Portal中预先创建对应的实例DB

🤖 AI与自动化 | 每天一个PLC小知识📍 深圳·天和双力自动化 | 工业控制系统实践


💬 你在PLC编程中有没有踩过”忘建DB”的坑?欢迎在评论区分享你的故事!