跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL CTUD — 双向计数器

SCL CTUD — 双向计数器

CU/CD 分别加/减,QU/QD 两路输出;R 复位、LD 装载 PV。

计数器 S7-1200/1500 TIA V19 别名:Count up and down / 双向计数器 / CTUD_INT / IEC_COUNTER

在 TIA 里试一下

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

TiaLink 设置

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

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

一句话

答案:用 #Counter(CU := ..., CD := ..., R := ..., LD := ..., PV := ...) 调用(多重实例);CU/CD 边沿加/减,QU 表示 CV≥PV,QD 表示 CV≤0。

CTUD 同时支持加计数和减计数:CU 上升沿 CV 加 1,CD 上升沿 CV 减 1;QU 表示 CV ≥ PV,QD 表示 CV ≤ 0;R=1 清零,LD=1 装载 PV。

参数

参数方向类型存储区说明
CU输入BOOLI, Q, M, D, L, P加计数输入。上升沿 CV 加 1。
CD输入BOOLI, Q, M, D, L, P减计数输入。上升沿 CV 减 1;CU 和 CD 同时上升沿时 CV 不变。
R输入BOOLI, Q, M, D, L, P复位。R=1 时 CV=0;R 优先于 LD 和边沿。
LD输入BOOLI, Q, M, D, L, P装载。LD=1 时 CV=PV;LD 优先于 CU/CD 边沿。
PV输入整数I, Q, M, D, L, P装载值;类型要与 CV 一致。
QU输出BOOLI, Q, M, D, L, P加计数到达:CV ≥ PV 时为 1。
QD输出BOOLI, Q, M, D, L, P减计数到达:CV ≤ 0 时为 1。
CV输出整数I, Q, M, D, L, P当前计数值。

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

最小示例

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

FB_CTUD_Demo FB

最小示例 · 27 行 · 源文件 blocks/FB_CTUD_Demo.scl

查看 FB_CTUD_Demo 的块接口
区块名称类型说明
输入UpBool
输入DownBool
输入ResetBool
输入LoadBool
输入PresetInt
输出QUBool
输出QDBool
输出CVInt
静态Counter"CTUD_INT"
blocks/FB_CTUD_Demo.scl
1FUNCTION_BLOCK "FB_CTUD_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4   VAR_INPUT
5      Up : Bool;                 // 加计数
6      Down : Bool;               // 减计数
7      Reset : Bool;              // 清零
8      Load : Bool;               // 装载 PV
9      Preset : Int := 3;         // 装载值
10   END_VAR
11 
12   VAR_OUTPUT
13      QU : Bool;                 // CV >= PV
14      QD : Bool;                 // CV <= 0
15      CV : Int;                  // 当前计数
16   END_VAR
17 
18   VAR
19      Counter : CTUD_INT;        // 双向计数器实例
20   END_VAR
21 
22BEGIN
23   REGION 双向计数
24      #Counter(CU := #Up, CD := #Down, R := #Reset, LD := #Load, PV := #Preset, QU => #QU, QD => #QD, CV => #CV);
25   END_REGION
26END_FUNCTION_BLOCK
27 

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

SCL 写法

SCL
1VAR
2   Counter : CTUD_INT;
3END_VAR
4 
5#Counter(
6   CU := #Up,
7   CD := #Down,
8   R := #Reset,
9   LD := #Load,
10   PV := #Preset,
11   QU => #QU,
12   QD => #QD,
13   CV => #CV);

全局实例 DB 写法同理,把 #Counter 换成 "IEC_COUNTER_DB" 即可。

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

怎么工作

事件 CV QU QD
CU 上升沿 +1 CV ≥ PV CV ≤ 0
CD 上升沿 -1 同上 同上
CU 和 CD 同时上升沿 不变 同上 同上
R=1 0 0 1
LD=1 PV PV ≥ PV 为 1 PV ≤ 0 为 1
  • 优先级:R > LD > CU/CD 边沿。
  • CU/CD 都是边沿计数;保持为 1 不会重复加/减。
  • QU 和 QD 可以单独使用;正常 PV > 0 时不会同时为 1。

常用场景

1. 进出料平衡

进料一个 CU 加 1,出料一个 CD 减 1;CV 就是当前在库数量,QD 提示空,QU 提示满。

2. 位置计数

正转脉冲接 CU,反转脉冲接 CD;CV 作为相对位置,R/LD 做回零和预置。

3. 双向流量累计

正向流量脉冲加、反向流量脉冲减;CV 是净流量。注意数据类型要够大,避免溢出。

常见坑

  • CU/CD 同时为 1:如果两个信号在同一扫描都从 0 变 1,CV 不变;不要用它做“必须加两次”的逻辑。
  • 用电平计数:CU/CD 保持为 1 只算一次;要连续计数必须给脉冲。
  • R 和 LD 同时为 1:R 优先,CV 清零而不是装载 PV。
  • PV 类型不匹配:PV/CV 要同一类型;实例类型决定范围。
  • 溢出:CV 到类型上限/下限会停止;流量计数用 DInt 或 UDInt。
  • 实例冲突:同一个 CTUD 实例多处调用会互相覆盖。

和 LAD 的区别

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

云仿真验证

PLC 云仿真:PASS(6 次扫描)。场景:加两次、减一次,QU/QD 跟随。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。

查看云仿真回归输出
云仿真回归输出
PASS  加两次、减一次,QU/QD 跟随 (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/CTUD__Count_up_and_down.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。

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

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

常见问题

CTUD 的 CU 和 CD 同时来上升沿会怎样?

CV 保持不变。指令把加减当作一个净步骤处理,同时边沿不会互相抵消成两次操作。

R 和 LD 哪个优先?

R 优先于 LD,LD 优先于 CU/CD 边沿。R=1 时清零;R=0、LD=1 时装载 PV。

QU 和 QD 分别是什么意思?

QU 是加计数到达:CV ≥ PV;QD 是减计数到达:CV ≤ 0。两个输出可以同时为 0,但在正常 PV>0 时不会同时为 1。

← 返回 SCL 指令手册