在 TIA 里试一下
通过 TiaLink 把本页示例(FB_FillBlk_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:用 FILL_BLK(IN := #Value, COUNT := 4, OUT => #Dest[0]) 把同一个值写进目标数组的 4 个元素;OUT 是数组起始元素。
FILL_BLK 把同一个值写进目标数组的 COUNT 个元素:OUT 指向目标数组的起始元素,COUNT 是元素个数。批量清零、预置、初始化参数区都用它。
参数
| 参数 | 方向 | 类型 | 存储区 | 说明 |
IN | 输入 | 元素类型(Int/Real/Word/...) | I, Q, M, D, L, P | 要写入的值;可以是常量或变量。会转换成目标数组的元素类型。 |
COUNT | 输入 | USINT / UINT / UDINT | I, Q, M, D, L, P | 要填充的元素个数,不是字节数。S7-1500 还支持 ULINT。 |
OUT | 输出 | 元素类型(与 IN 兼容) | D, L | 目标数组的起始元素,例如 #Dest[0]。从该元素开始写 COUNT 个元素。 |
参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面代码已通过构建期语法/结构校验;云仿真状态见下方。
FB_FillBlk_Demo FB
最小示例 · 32 行 · 源文件 blocks/FB_FillBlk_Demo.scl
查看 FB_FillBlk_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Fill | Bool | |
| 输入 | Value | Int | |
| 输入 | Count | UInt | |
| 输出 | Done | Bool | |
| 输出 | Sum | Int | |
| 静态 | Dest | ARRAY[0..3] OF Int | |
blocks/FB_FillBlk_Demo.scl
1FUNCTION_BLOCK "FB_FillBlk_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 Fill : Bool;
6 Value : Int := 7;
7 Count : UInt := 4;
8 END_VAR
9
10 VAR_OUTPUT
11 Done : Bool;
12 Sum : Int;
13 END_VAR
14
15 VAR
16 Dest : Array[0..3] of Int;
17 END_VAR
18
19BEGIN
20 REGION 填充数组
21
22 IF #Fill THEN
23 FILL_BLK(IN := #Value, COUNT := #Count, OUT => #Dest[0]);
24 END_IF;
25 END_REGION
26
27 REGION 结果检查
28 #Done := #Dest[0] = #Value AND #Dest[1] = #Value AND #Dest[2] = #Value AND #Dest[3] = #Value;
29 #Sum := #Dest[0] + #Dest[1] + #Dest[2] + #Dest[3];
30 END_REGION
31END_FUNCTION_BLOCK
32
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1FILL_BLK(IN := #FillValue, COUNT := #Count, OUT => #Dest[0]);
全局 DB 数组:
SCL
1FILL_BLK(IN := 0, COUNT := 100, OUT => "DB_Data".Values[1]);
怎么工作
| 参数 |
作用 |
IN |
要写入的值;会转换成目标元素类型 |
COUNT |
写多少个元素,不是字节数 |
OUT |
目标数组的起始元素,例如 #Dest[0] |
- 只写
COUNT 个元素,目标数组后面的元素保持不变。
IN 的值会按目标元素类型转换;例如 Int 数组写 0、7。
COUNT 超过目标剩余元素数时结果无效;TIA 可能报错。
- 目标数组可以是局部数组、DB 数组或结构体数组成员。
常用场景
1. 批量清零
批次结束时把统计数组清零:FILL_BLK(IN := 0, COUNT := 8, OUT => #Counters[1]);。
2. 参数预置
把一组参数全部预置成同一个安全值(例如 0 或默认速度),再逐项修改需要不同的项。
3. 初始化结构体数组
结构体数组不能直接用常量填,但可以把某个元素的值填到其他元素;更常见的做法是逐个字段赋值或用 MOVE_BLK 复制模板元素。
常见坑
- 把 COUNT 当字节数:
COUNT=4 是 4 个元素;元素宽度由数组类型决定。
- OUT 写整个数组名:按 TIA 帮助写起始元素
#Dest[0];整个数组名可能被拒绝。
- COUNT 超过数组长度:目标剩余元素不够时结果无效;先用上下界算上限。
- IN 类型不兼容:
Real 值写到 Int 数组会转换/截断;需要明确舍入规则。
- 只填充一部分:后面的旧值还在;如果要求整个数组都是新值,
COUNT 要等于元素总数。
- 结构体数组:
FILL_BLK 按元素类型填充,结构体元素需要同类型;不要用它改不同字段。
和 LAD 的区别
LAD 里对应 FillBlockI/FillBlockU 盒,引脚是 IN/COUNT/OUT;SCL 里直接写函数调用。逻辑一样,SCL 更容易把 COUNT 做成变量,按配方或批次动态填充。梯形图版本见 Learn-LAD 的 FillBlockI 页。
云仿真验证
本页代码已通过构建期语法/结构校验。该示例使用 TIA 的数组起始元素写法,云仿真只做 scl_validate,未跑场景(数组切片)。 云仿真校验日期:2026-11-02。
打开 PLC 云仿真
验证状态
“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。
来源与说明
参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Move_operations/FILL_BLK__Fill_block.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
参数、元素类型和数组起始元素规则以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
FILL_BLK 和 MOVE_BLK 有什么区别?
MOVE_BLK 从源数组复制一段元素;FILL_BLK 把同一个值重复写进目标数组。批量清零/预置用 FILL_BLK,数组之间复制用 MOVE_BLK。
FILL_BLK 的 COUNT 是字节数吗?
不是,是元素个数。COUNT=4 表示从 OUT 起始元素开始写 4 个元素;元素宽度由数组元素类型决定。
FILL_BLK 会清零整个数组吗?
只写 COUNT 个元素。要清零整个数组,COUNT 设为数组元素总数,或者用数组上下界计算。