浏览示例
把语法放回完整程序里看:边沿、定时器、状态机、缓冲站、阀门控制。
打开示例库 →FB 的单实例 DB、多重实例、数组实例怎么声明和调用;Timer/Counter 等保留字命名坑和常见编译错误。
一句话:FB 每次调用都需要实例:可以建单实例 DB,也可以在 FB 的 Static 里声明多重实例;实例名不要用 Timer/Counter 等保留字。
FB 和 FC 最大的区别是 FB 有背景数据。每次调用 FB,都要给它一块实例数据;这块数据放哪里,就是“单实例 DB”和“多重实例”的区别。
一个 FB 对应一个独立的背景 DB:
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:
1"FB_Motor_DB"(Start := "StartBtn", Stop := "StopBtn");
2"MotorLamp" := "FB_Motor_DB".Run;
适合:
在父 FB 的 VAR(Static)里声明子 FB 实例:
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。
适合:
IEC 定时器/计数器也是 FB 实例。推荐写法:
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);
Timer / Counter 作为变量名:它们是 TIA/SCL 的保留字,外部源导入会报“设定值无效”。用 MyTimer / MyCounter。TON_TIME / CTU_INT 这类类型在部分 TIA 外部源导入场景下会被拒绝;用 IEC_TIMER / IEC_COUNTER 更稳。VAR_TEMP:临时变量每次调用重建,计时/计数状态会丢。TiaLink 导入 SCL 只生成 FB/FC 块,不会自动生成所有单实例 DB。导入后在 OB/FC 里调用 FB,TIA 才会创建/选择实例 DB;页面上的示例块导入后也需要你自己在 OB 里调用并接变量。
Timer/Counter 命名:保留字,改名为 MyTimer/MyCounter。VAR_TEMP 存状态:边沿、计时、计数不能放 Temp;用 Static 或实例 DB。Motors[1..4] 的下标要检查,不要写 0/5。一个设备一个 DB、需要外部监控/掉电保持时用单实例 DB;只在父 FB 内部使用、想减少 DB 数量时用多重实例。
它们是 SCL/TIA 的保留字;把实例改名为 MyTimer/MyCounter 即可。
把语法放回完整程序里看:边沿、定时器、状态机、缓冲站、阀门控制。
打开示例库 →把示例导入你的 TIA Portal 工程,生成块、编译并读回核对。
了解 TiaLink →不装博途,用 MCP 逐扫描运行 SCL,做场景验收。
打开云仿真 →