跳到正文
Learn-SCL
SCL 示例库/SCL 指南/SCL 实例 DB 与多重实例:FB 的背景数据怎么放

SCL 实例 DB 与多重实例:FB 的背景数据怎么放

FB 的单实例 DB、多重实例、数组实例怎么声明和调用;Timer/Counter 等保留字命名坑和常见编译错误。

FB

一句话:FB 每次调用都需要实例:可以建单实例 DB,也可以在 FB 的 Static 里声明多重实例;实例名不要用 Timer/Counter 等保留字。

FB 和 FC 最大的区别是 FB 有背景数据。每次调用 FB,都要给它一块实例数据;这块数据放哪里,就是“单实例 DB”和“多重实例”的区别。

单实例 DB

一个 FB 对应一个独立的背景 DB:

SCL
1FUNCTION_BLOCK "FB_Motor"
2   VAR_INPUT
3      Start : Bool;
4      Stop  : Bool;
5   END_VAR
6   VAR_OUTPUT
7      Run : Bool;
8   END_VAR
9BEGIN
10   IF #Start AND NOT #Stop THEN
11      #Run := TRUE;
12   END_IF;
13   IF #Stop THEN
14      #Run := FALSE;
15   END_IF;
16END_FUNCTION_BLOCK

在 OB 里调用时,TIA 会生成/使用一个实例 DB:

SCL
1"FB_Motor_DB"(Start := "StartBtn", Stop := "StopBtn");
2"MotorLamp" := "FB_Motor_DB".Run;

适合:

多重实例

在父 FB 的 VAR(Static)里声明子 FB 实例:

SCL
1FUNCTION_BLOCK "FB_Machine"
2   VAR_INPUT
3      Start1 : Bool;
4      Stop1  : Bool;
5   END_VAR
6   VAR
7      Motor1 : FB_Motor;
8      Motors : Array[1..4] of FB_Motor;
9   END_VAR
10BEGIN
11   #Motor1(Start := #Start1, Stop := #Stop1);
12   #Motors[1](Start := #Start1, Stop := #Stop1);
13END_FUNCTION_BLOCK

子实例的数据存放在父 FB 的背景 DB 里,不额外生成 DB。

适合:

Timer / Counter 实例

IEC 定时器/计数器也是 FB 实例。推荐写法:

SCL
1VAR
2   MyTimer : IEC_TIMER;
3   MyCounter : IEC_COUNTER;
4END_VAR
5 
6#MyTimer.TON(IN := #Start, PT := T#5S, Q => #Q, ET => #ET);
7#MyCounter.CTU(CU := #Pulse, R := #Reset, PV := 10, Q => #Done, CV => #Count);

保持性与优化

TIA 导入时注意

TiaLink 导入 SCL 只生成 FB/FC 块,不会自动生成所有单实例 DB。导入后在 OB/FC 里调用 FB,TIA 才会创建/选择实例 DB;页面上的示例块导入后也需要你自己在 OB 里调用并接变量。

常见坑

下一步

常见问题

单实例 DB 和多重实例怎么选?

一个设备一个 DB、需要外部监控/掉电保持时用单实例 DB;只在父 FB 内部使用、想减少 DB 数量时用多重实例。

为什么 Timer/Counter 作为变量名编译报错?

它们是 SCL/TIA 的保留字;把实例改名为 MyTimer/MyCounter 即可。

下一步

浏览示例

把语法放回完整程序里看:边沿、定时器、状态机、缓冲站、阀门控制。

打开示例库 →

TiaLink

把示例导入你的 TIA Portal 工程,生成块、编译并读回核对。

了解 TiaLink →

PLC 云仿真

不装博途,用 MCP 逐扫描运行 SCL,做场景验收。

打开云仿真 →