跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL CTD — 减计数器

SCL CTD — 减计数器

CD 每个上升沿 CV 减 1,CV≤0 时 Q=1;LD=1 装载 PV。

计数器 S7-1200/1500 TIA V19 别名:Count down / 减计数器 / CTD_INT / IEC_COUNTER

在 TIA 里试一下

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

TiaLink 设置

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

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

一句话

答案:用 #Counter(CD := #CountDown, LD := #Load, PV := #Preset) 调用(多重实例);CD 每个上升沿 CV 减 1,CV≤0 时 Q=1,LD=1 装载 PV。

CTD 是减计数器:CD 每个上升沿让 CV 减 1;CV ≤ 0 时 Q=1;LD=1 时把 PV 装入 CV。它适合“还剩多少个”的倒计数。

参数

参数方向类型存储区说明
CD输入BOOLI, Q, M, D, L, P减计数输入。每个上升沿 CV 减 1;保持为 1 不会重复减。
LD输入BOOLI, Q, M, D, L, P装载。LD=1 时 CV := PV;LD 优先于 CD。
PV输入整数I, Q, M, D, L, P装载值。LD=1 时写入 CV;类型要与 CV 一致。
Q输出BOOLI, Q, M, D, L, P计数到 0 输出。CV ≤ 0 时为 1。
CV输出整数I, Q, M, D, L, P当前计数值。类型由实例类型决定(CTD_INT、CTD_DINT 等)。

参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。

最小示例

下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。

FB_CTD_Demo FB

最小示例 · 24 行 · 源文件 blocks/FB_CTD_Demo.scl

查看 FB_CTD_Demo 的块接口
区块名称类型说明
输入CountDownBool
输入LoadBool
输入PresetInt
输出QBool
输出CVInt
静态Counter"CTD_INT"
blocks/FB_CTD_Demo.scl
1FUNCTION_BLOCK "FB_CTD_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4   VAR_INPUT
5      CountDown : Bool;          // 每个上升沿减 1
6      Load : Bool;               // 装载 PV
7      Preset : Int := 3;         // 装载值
8   END_VAR
9 
10   VAR_OUTPUT
11      Q : Bool;                  // CV <= 0
12      CV : Int;                  // 当前计数
13   END_VAR
14 
15   VAR
16      Counter : CTD_INT;         // 减计数器实例
17   END_VAR
18 
19BEGIN
20   REGION 减计数
21      #Counter(CD := #CountDown, LD := #Load, PV := #Preset, Q => #Q, CV => #CV);
22   END_REGION
23END_FUNCTION_BLOCK
24 

块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。

SCL 写法

SCL
1VAR
2   Counter : CTD_INT;
3END_VAR
4 
5#Counter(CD := #CountDown, LD := #Load, PV := #Preset, Q => #Q, CV => #CV);

全局实例 DB 写法:

SCL
1"IEC_COUNTER_DB".CTD(CD := "CountDown", LD := "Load", PV := "PresetValue", Q => "Status", CV => "CountValue");

注意:CTD_INT 等多重实例直接调用 #Counter(...);全局实例 DB(IEC_COUNTER)用 "IEC_COUNTER_DB".CTD(...)。

怎么工作

事件 CV Q
LD=1 PV CV ≤ 0 时为 1
CD 上升沿 -1 CV ≤ 0 时为 1
CD 保持 1 不变 不变
LD 和 CD 同时 装载优先 按装载后的 CV
  • CD 是边沿计数:保持为 1 只减一次。
  • LD 优先于 CD;装载期间不计数。
  • Q 在 CV ≤ 0 时为 1;CV 到数据类型下限后不再减(无符号类型下限是 0,有符号类型下限是负值)。
  • 需要实例;类型决定 CV 的范围。

常用场景

1. 倒计数批次

一箱装 100 个,LD 装载 100,每取走一个 CD 减 1;到 0 时 Q 提示换箱。

2. 剩余步数

配方或顺序控制里,剩余步骤数用 CTD;到 0 表示流程结束。

3. 倒计时式脉冲

配合固定周期的时钟脉冲,CD 每个脉冲减 1,PV 是总脉冲数;适合粗略的倒计时。

常见坑

  • 把 LD 当复位:LD 是装载 PV,不是清零;清零要把 PV 设为 0 再 LD=1,或者用 CTU 的 R。
  • CD 用电平:CD 一直为 1 只减一次;要连续减必须给脉冲或边沿。
  • PV/CV 类型不一致:编译可能报错;用同一种整数类型。
  • LD 一直为 1:CV 被反复装载,看起来“不计数”。
  • 到下限后继续减:CV 到数据类型下限后不再减;如果只想停在 0,在程序里判断 CV > 0 再给 CD。
  • 实例冲突:同一个 CTD 实例多处调用会互相覆盖。

和 LAD 的区别

LAD 的 CTD 是带 CD/LD/PV/Q/CV 引脚的盒;SCL 里显式调用 #Counter(...)(多重实例;全局实例 DB 用 "IEC_COUNTER_DB".CTD(...))。逻辑一样,但 SCL 更容易把倒计数放进状态机或数组。梯形图版本见 Learn-LAD 的 CTD 页。

云仿真验证

PLC 云仿真:PASS(6 次扫描)。场景:装载 3,三次下降沿到 0。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。

查看云仿真回归输出
云仿真回归输出
PASS  装载 3,三次下降沿到 0 (6 step(s), 6 scan(s))
RESULT: ALL PASS (6 scan(s))

云仿真验证语法、结构和逐扫描行为,不等同于 TIA 编译;TIA 状态见下方“验证状态”。

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真PASS(6 scans)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/Counter_operations/CTD__Count_down.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。

参数和减计数语义以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。

Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。

常见问题

CTD 的 LD 是干什么的?

LD=1 时把 PV 装入 CV,相当于“预置一个倒计数初值”。LD 优先于 CD,装载期间不计数。

CTD 的 Q 什么时候为 1?

CV ≤ 0 时为 1;CV 到数据类型下限后不再减(无符号类型下限是 0,有符号类型下限是负值)。

CTD 和 CTU 怎么选?

正计数(来了几个)用 CTU;倒计数(还剩几个)用 CTD;既要加又要减用 CTUD。

← 返回 SCL 指令手册