跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL FILL_BLK — 填充数组

SCL FILL_BLK — 填充数组

把同一个值写进目标数组的 COUNT 个元素;常用于批量清零或预置。

移动 S7-1200/1500 TIA V19 别名:Fill block / 填充 / 数组填充 / FILL_BLK

在 TIA 里试一下

通过 TiaLink 把本页示例(FB_FillBlk_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。

TiaLink 设置

默认 http://localhost:8080。也可以在本页地址后加 ?tialink= 临时指定。

TiaLink 启动时若设置了 --api-token,这里要填相同的值;只保存在本机浏览器 localStorage,不会上传。

一句话

答案:用 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 / UDINTI, 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 的块接口
区块名称类型说明
输入FillBool
输入ValueInt
输入CountUInt
输出DoneBool
输出SumInt
静态DestARRAY[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;               // 为 1 时执行填充
6      Value : Int := 7;          // 填充值
7      Count : UInt := 4;         // 填充元素个数
8   END_VAR
9 
10   VAR_OUTPUT
11      Done : Bool;               // 4 个元素都等于 Value
12      Sum : Int;                 // 目标数组求和
13   END_VAR
14 
15   VAR
16      Dest : Array[0..3] of Int;
17   END_VAR
18 
19BEGIN
20   REGION 填充数组
21      // TIA 帮助的写法:OUT 用数组起始元素,COUNT 是元素个数。
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 云仿真

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真scl_validate 通过2026-11-02scl_run_scenario / scl_validate
TIA 导入编译待实测—TiaLink + TIA Portal(待实测)

“待实测”表示还没有在 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 设为数组元素总数,或者用数组上下界计算。

← 返回 SCL 指令手册