SCL CTU — 加计数器
CU 每个上升沿 CV 加 1,CV≥PV 时 Q=1;R=1 清零。
计数器
S7-1200/1500
TIA V19
别名:Count up / 加计数器 / CTU_INT / IEC_COUNTER
在 TIA 里试一下
通过 TiaLink 把本页示例(FB_CTU_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:用 #Counter(CU := #Count, R := #Reset, PV := #Preset) 调用(多重实例);CU 每个上升沿 CV 加 1,CV≥PV 时 Q=1,R=1 清零。
CTU 是加计数器:CU 每个上升沿让 CV 加 1;CV ≥ PV 时 Q=1;R=1 时 CV 清 0、Q 回 0。CU 保持为 1 不会每个扫描都加。
参数
| 参数 | 方向 | 类型 | 存储区 | 说明 |
CU | 输入 | BOOL | I, Q, M, D, L, P | 加计数输入。每个上升沿 CV 加 1;保持为 1 不会重复计数。 |
R | 输入 | BOOL | I, Q, M, D, L, P | 复位。R=1 时 CV 清 0、Q 回 0;R 优先于 CU。 |
PV | 输入 | 整数 | I, Q, M, D, L, P | 预设值。CV ≥ PV 时 Q=1;类型要与 CV 一致。 |
Q | 输出 | BOOL | I, Q, M, D, L, P | 计数到达输出。CV ≥ PV 时为 1。 |
CV | 输出 | 整数 | I, Q, M, D, L, P | 当前计数值。类型由实例类型决定(CTU_INT、CTU_DINT 等)。 |
参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。
FB_CTU_Demo FB
最小示例 · 24 行 · 源文件 blocks/FB_CTU_Demo.scl
查看 FB_CTU_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Count | Bool | |
| 输入 | Reset | Bool | |
| 输入 | Preset | Int | |
| 输出 | Q | Bool | |
| 输出 | CV | Int | |
| 静态 | Counter | "CTU_INT" | |
blocks/FB_CTU_Demo.scl
1FUNCTION_BLOCK "FB_CTU_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 Count : Bool;
6 Reset : Bool;
7 Preset : Int := 3;
8 END_VAR
9
10 VAR_OUTPUT
11 Q : Bool;
12 CV : Int;
13 END_VAR
14
15 VAR
16 Counter : CTU_INT;
17 END_VAR
18
19BEGIN
20 REGION 加计数
21 #Counter(CU := #Count, R := #Reset, PV := #Preset, Q => #Q, CV => #CV);
22 END_REGION
23END_FUNCTION_BLOCK
24
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1VAR
2 Counter : CTU_INT;
3END_VAR
4
5#Counter(CU := #Count, R := #Reset, PV := #Preset, Q => #Q, CV => #CV);
全局实例 DB 写法:
SCL
1"IEC_COUNTER_DB".CTU(CU := "Start", R := "Reset", PV := "PresetValue", Q => "Status", CV => "CountValue");
注意:CTU_INT 等多重实例直接调用 #Counter(...);全局实例 DB(IEC_COUNTER)用 "IEC_COUNTER_DB".CTU(...)。
怎么工作
| 事件 |
CV |
Q |
CU 上升沿 |
+1 |
CV ≥ PV 时为 1 |
CU 保持 1 |
不变 |
不变 |
R=1 |
0 |
0 |
CU 是边沿计数:信号一直为 1 只算一次;再次计数需要先回 0 再上升。
PV 是预设值,CV 是当前值;两者数据类型要一致。
R 复位优先:R=1 时计数清零、Q=0。
- 需要实例(
CTU_INT、CTU_DINT 或 IEC_COUNTER)。
常用场景
1. 产量计数
每个零件到位产生一个上升沿,CU 接传感器,PV 设批次数量;到数后 Q 触发包装或换箱。
2. 批次完成
PV=100,到 100 时 Q 置位;操作员按复位按钮清 0,开始下一批。
3. 报警次数统计
统计某类报警发生次数;到阈值后 Q 触发维护提示。注意 CU 要用边沿信号,不要接持续电平。
常见坑
- 用电平计数:
CU 一直为 1 不会每个扫描都加;必须检测上升沿。
PV 类型不匹配:PV/CV 要使用同一种数据类型(Int/DInt 等)。
R 一直为 1:计数器永远清零,看起来“不计数”。
- 实例冲突:同一个计数器实例在多处调用会互相覆盖。
- 溢出:
CV 到类型上限会停止增加;大批量计数用 DInt 或更大类型。
- 忘记调用:CTU 必须每个扫描周期执行,否则边沿会丢失。
和 LAD 的区别
LAD 的 CTU 是带 CU/R/PV/Q/CV 引脚的盒;SCL 里显式调用 #Counter(...)(多重实例;全局实例 DB 用 "IEC_COUNTER_DB".CTU(...)),用 Q =>/CV => 接输出。逻辑一样,SCL 更容易把计数器放进数组或 FOR 循环。梯形图版本见 Learn-LAD 的 CTU 页。
云仿真验证
PLC 云仿真:PASS(8 次扫描)。场景:三次上升沿到 3。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。
查看云仿真回归输出
云仿真回归输出
PASS 三次上升沿到 3 (8 step(s), 8 scan(s))
RESULT: ALL PASS (8 scan(s))
云仿真验证语法、结构和逐扫描行为,不等同于 TIA 编译;TIA 状态见下方“验证状态”。
验证状态
“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。
来源与说明
参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Counter_operations/CTU__Count_up.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
参数和边沿计数语义以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
CTU 的 CU 一直为 1 会每个扫描都加吗?
不会。CTU 只认 CU 的上升沿;CU 保持为 1 只算一次,要再次计数必须让 CU 回 0 再上升。
CTU 的 CV 和 PV 类型必须一致吗?
要一致。实例类型决定 CV 的类型(如 CTU_INT、CTU_DINT),PV 要使用同一数据类型,否则可能编译报错或比较结果不符合预期。
计数器到上限会怎样?
CV 到达数据类型上限后不再增加,不会自动回绕;需要更大范围时用 DInt 或 UDInt 类型的计数器。