不用 HSC 高速计数器,只适合低速 DI 开关量信号(光电、接近、行程、干接点,频率一般<10Hz),两种主流方案:
方案 A:CTU + CTD 共用同一个 COUNTER 标签
方案 B:ONS 上升沿 + ADD / SUB 做 DINT 变量加减
5380/5580 新版还有 FBD 块 CTUD,一条功能块 CU 加、CD 减,老版本梯形图不支持 CTUD 梯形图指令
限制:普通扫描型计数,靠 PLC 程序扫描捕捉上升沿;脉冲太快、脉宽小于扫描周期 → 丢脉冲!高速脉冲必须 HSC。
方案 A:CTU+CTD 共用计数器标签
原理:同一个 Counter 标签,CTU 管【加脉冲】,CTD 管【减脉冲】,ACC 自动为净数量,支持负数。
标签类型:COUNTER,标签名例如 Part_Count
CU:进料信号(In_Sensor)上升沿 → ACC+1
CD:出料信号(Out_Sensor)上升沿 → ACC-1
RES:复位按钮(Reset_Btn)→ 清零 ACC、DN、OV、UN
梯形图 rung:
In_Sensor→CTU Part_CountOut_Sensor→CTD Part_CountReset_Btn→RES Part_Count
计数器状态位
Part_Count.ACC:当前净数量(可以负数!下限 -2147483648)Part_Count.DN:ACC ≥ PRE 时 ONPart_Count.UN:下溢(负数到头)Part_Count.OV:上溢
优点:自带边沿检测,不需要 ONS,写起来短;自带溢出 / 下溢位 , 缺点:PRE 是固定预设,不方便实时修改目标值;适合单纯个数统计,不适合工程量换算
补充:新版 Studio5000 FBD 里面直接拖 CTUD 功能块,CUEnable 加、CDEnable 减、Reset 复位,效果一样,一条块搞定
方案 B:ONS 上升沿 + ADD / SUB DINT 变量
适合:不仅单纯计数,还要乘系数、正负偏移、工程量换算
重点:ONS(One Shot)上升沿指令,保证一个脉冲只执行一次加减,不会因为 DI 一直 ON 每个扫描周期反复加
新建 DINT 标签:Net_Count(初始 0,可以为负数)
进料加 1 梯级:
In_Sensor→ONS In_Pulse→ADD Net_Count 1 Net_Count出料减 1 梯级:
Out_Sensor→ONS Out_Pulse→SUB Net_Count 1 Net_Count复位清零:
Reset_Btn→MOV 0 Net_Count
扩展:不是 ±1,而是带系数加减
ONS Pos_Pulse → ADD Pos_Value K5 Pos_Value
ONS Neg_Pulse → SUB Pos_Value K5 Pos_Value
直接支持负数、后面接 MUL 乘法做换算,完美匹配你前面问的负数乘法需求。
优点:DINT 随便参与四则运算、比较、传到 HMI、配方;逻辑透明;Micro800/Compact/ControlLogix 全系列通用 , 缺点:必须记得加 ONS,漏加 ONS 会疯狂累加
两种方案对比
表格
| 项目 | CTU+CTD(COUNTER) | ONS+ADD/SUB(DINT) |
|---|---|---|
| 边沿 | 内部自带,不用 ONS | 必须 ONS 抓上升沿 |
| 数据类型 | COUNTER 结构体,.ACC 是 DINT | DINT,直接数学运算 |
| 负数 | 支持,下溢 UN 位报警 | 原生支持负数,无专门溢出位,自己加 CMP 判断 |
| 适合场景 | 进出料计数、库存净数量 | 工程量、偏移量、和其它公式联动、需要乘除换算 |
| 溢出 | 自带 OV/UN 状态位 | 需要自己写 GRT/LES 判断上下限 |
脉冲频率上限:取决于 PLC 任务周期,比如 10ms 任务,稳妥只用到 5~8Hz;超过就丢数,此时必须 HSC 高速计数器
机械触点抖动:行程开关、继电器触点,哪怕低速,也会多次跳变重复计数 → 加定时器防抖(TON 10~20ms)再送给 ONS/CTU
不要用下降沿随便计数,现场干扰容易误触发;优先上升沿
ONS 是每个梯级独立,一个信号两个梯级计数,要分开两个 ONS 标签,不能共用同一个 ONS
示例:带防抖的完整 ONS+ADD 逻辑
In_Raw:原始 DI 触点信号
In_Debounce:TON 防抖,15ms
In_Pulse:ONS 上升沿 Rung1:
In_Raw→TON In_Debounce Timer:=15Rung2:In_Debounce.DN→ONS In_Pulse→ADD Net_Count 1 Net_Count


