返回
SCL PLC 编程教程第六篇 定时器、计数器、边沿信号在 SCL 里怎么写,为什么它们和梯形图思路不完全一样
前面几篇,我们已经把结构化编程的基础框架搭起来了。
你已经开始逐渐从“画逻辑”过渡到“写逻辑”。但只会写 IF、CASE、FOR 还不够,因为 PLC 之所以是 PLC,关键就在于它总是在和“时间”“动作次数”“状态变化瞬间”打交道。
比如现场最常见的这些需求:
按下启动按钮后,延时 3 秒再启动电机
气缸伸出后,如果 2 秒内没有到位,就报警
某个传感器连续触发 5 次后,判定堵料
启动按钮只在“按下那一刻”触发一次,而不是一直触发
模式切换时,只在状态从 0 变成 1 的那一瞬间执行初始化
某个故障信号要持续 500ms 才认定为有效,防止抖动误报
某个脉冲信号来一次就加一,不允许长按时重复计数
这些逻辑,全都离不开:
定时器
计数器
边沿检测
所以这一篇你学到的,不只是几个指令怎么写,而是 PLC 里非常核心的一种控制思维:
不是只看“现在是什么状态”,还要看“它持续了多久”“它变化了几次”“它是不是刚刚发生变化”。
这就是 PLC 控制比普通条件判断更贴近现场的地方。
一、先建立一个总概念:定时器、计数器、边沿,本质上是在处理“时间、次数、变化瞬间”
这一点你先记住,后面就不会乱。
定时器处理的是时间维度
它关心的是:
某个条件持续了多久
什么时候该开始计时
什么时候计时完成
条件消失后计时是否清除
是否只输出一个固定宽度脉冲
计数器处理的是次数维度
它关心的是:
某件事发生了几次
到没到设定次数
是否该清零
是加计数还是减计数
边沿处理的是变化瞬间
它关心的是:
这个信号是不是刚从 0 变成 1
或者刚从 1 变成 0
不是看它现在一直为真,而是看“变化的那一瞬间”
你如果把这三个东西放在一起看,就会突然明白:
PLC 程序并不只是“当前状态判断”,它还必须处理“动态过程”。
这就是为什么这些内容如此重要。
二、为什么梯形图里你觉得定时器、计数器很自然,到了 SCL 里却容易有点别扭
这个感觉非常正常。
因为在梯形图里,定时器、计数器、上升沿、下降沿这些东西,往往以图形块的形式出现。
你看到它们时,会有一种很直观的感觉:
输入条件进来了
这个块开始工作
到时间了,输出成立
来一个脉冲,计数加一
信号刚跳变,边沿块给一次脉冲
也就是说,梯形图把这些对象呈现成了“功能器件”。
但在 SCL 里,你面对的更多是:
调用
参数
状态变量
当前值
上一次状态
触发条件
扫描周期中的执行关系
于是原本在梯形图里“看着就明白”的东西,到了 SCL 里开始需要你多想一步:
这个功能到底是怎样在程序里被调用、被保持、被判断的。
所以你会觉得 SCL 里这些内容稍微更“抽象”一点。
但一旦理解后,你反而会觉得它们更灵活、更清楚。
三、先说定时器:它到底在 PLC 里做什么
定时器最常见的用途,不是“让程序等一下”,而是:
让某个逻辑在满足条件一段时间后再成立,或者在条件消失后延迟消失,或者输出一个固定宽度的时间脉冲。
最常见的思路大概有三类:
1. 延时接通
输入条件成立后,不是立刻输出,而是等一段时间再输出。
这类逻辑很常见,比如:
电机启动前预吹扫 5 秒
故障持续 1 秒后才确认
传感器保持遮挡 300ms 后判定有料
2. 延时断开
输入条件消失后,不是立刻撤销输出,而是延迟一段时间再撤销。
例如:
风机停机后继续延时运转 10 秒散热
某个保持信号断开后,延时复位
3. 脉冲定时
某条件触发时,输出一个固定宽度的脉冲。
例如:
每次启动命令来时,给一个 200ms 的脉冲信号
某动作触发时,给蜂鸣器鸣叫 1 秒
这三类思路,在 PLC 里非常典型。
四、SCL 中定时器最重要的一个理解:它不是“写一行就过去了”,而是一个随扫描周期不断更新状态的对象
这是很多初学者最容易没真正理解的一点。
很多人刚学 SCL,会把定时器想成:
“我调用一次,它就自己计时。”
这个理解太粗了。
更准确地说,定时器在 PLC 中,通常需要在程序扫描过程中持续被执行和更新。
也就是说,它不是一个“按下按钮就单独跑出去的独立小人”,而是会随着每次扫描不断根据输入条件更新自己的状态。
这就是为什么你在 SCL 里用定时器时,不能只看“这一行代码长什么样”,还要理解:
输入条件什么时候给它
预置时间是多少
输出什么时候为真
当前已计时间是多少
输入断开后它如何恢复
这段逻辑是否每扫都在执行
所以,定时器在 SCL 里比在梯形图里更容易暴露出它“状态型”的本质。
五、最常见的延时接通定时器:TON
在很多 PLC 平台和工程习惯里,TON 都是最常见、最重要的一类定时器。
它的思路很简单:
输入条件成立后开始计时;
时间到了,输出才为真。
你可以这样理解:
不是“有条件就立刻动作”,而是“条件连续成立够久了,才承认它有效”。
这类逻辑在现场特别实用。
因为现场信号经常会抖、会闪、会短暂成立。
如果什么都立刻认定,误动作和误报警就会很多。
例如:
某个液位高位信号持续 500ms 才算高液位报警
某个堵料检测持续 2 秒才确认堵料
某个启动条件保持 1 秒后,才允许后续动作
六、TON 最重要的几个概念
虽然不同平台界面会略有差异,但从编程思路上,TON 一般你要关注这些内容:
1. 输入条件
也就是定时器什么时候开始计时。
2. 预置时间
也就是要持续多久才算“到时”。
3. 输出完成标志
到时间后,输出变为 TRUE。
4. 当前计时时间
也就是已经累计了多久。
这四个概念你理解了,TON 基本就不迷糊了。
七、一个最典型的 TON 场景:信号防抖动确认
现场传感器有时会瞬间抖动。
比如光电偶尔闪一下,液位开关偶尔跳一下,如果程序一有信号就立刻报警,现场会很烦。
这时候 TON 很合适。
思路上可以理解成:
如果故障信号持续 1 秒都还在,那才真正置故障。
示意逻辑可以理解为:
IF FaultSignal 持续成立达到 1 秒 THEN
FaultAlarm := TRUE;
END_IF;
这就是延时确认。
你会发现,这类逻辑和“立刻判断”最大的区别就在于:
它引入了时间维度。
这也是定时器在 PLC 里的核心价值。
八、延时断开定时器:TOF 的核心意义是什么
如果说 TON 是“条件成立后延迟输出”,
那么 TOF 的思路就是:
条件消失后,延迟一段时间再撤销输出。
这类逻辑虽然没有 TON 那么常见,但在很多控制场景中也非常有用。
例如:
排风机在主设备停机后继续跑 10 秒
某个保持信号断开后,延迟释放
某个检测信号消失后,不马上认为物料离开,而是保留一小段时间
你可以把 TOF 理解成“慢一点再放掉”。
它适合那些不希望输出随着输入一断就立刻消失的场景。
九、脉冲定时器:TP 的核心意义
TP 的思路是:
某个触发来时,输出一个固定时间宽度的脉冲。
例如:
按一下按钮,蜂鸣器鸣叫 1 秒
启动命令来时,给下级设备一个 200ms 脉冲
某动作开始时,输出一个固定宽度触发信号
TP 特别适合做这种“触发一下,给固定时长输出”的逻辑。
它和 TON 的区别很明显:
TON 更像“条件保持够久才承认”
TP 更像“只要触发,就给你一个固定时间脉冲”
十、在 SCL 中使用定时器时,一个特别重要的思维变化:你开始更频繁地面对“定时器实例”和“输出状态”
这就是它和梯形图不完全一样的地方。
在梯形图里,你经常看到的是一个现成的定时器块,条件接进去就感觉很自然。
在 SCL 里,你通常会更清楚地意识到:
这个定时器本身需要一个实例或状态容器
你要给它输入条件
你要指定预置时间
你要取它的输出
有时候还要看它当前计时值
也就是说,SCL 让你更直接地面对“定时器不是魔法,而是一个有状态的功能对象”。
这其实是好事。
因为一旦你把这个底层理解透了,以后不管写定时器、计数器还是功能块,思路都会更成熟。
十一、定时器在 SCL 中最容易犯的几个错误
错误一:把定时器当成“阻塞等待”
很多人会潜意识觉得:
“我这里启动一个定时器,程序就先等 3 秒,再往下走。”
这不是 PLC 程序的正常扫描思维。
正确理解应该是:
程序每扫都继续执行,只是定时器的完成条件还没满足,所以某些后续逻辑暂时不成立。
这两种理解差别非常大。
PLC 不是写成“停在这里等时间过完”。
而是写成“只要没到时间,后续条件就还不成立”。
这点非常关键。
错误二:条件没理顺,导致定时器反复被清掉
比如某个 TON 的输入条件时有时无,结果它一直计不上去。
表面上看你明明写了 3 秒延时,但实际永远到不了完成。
这通常不是定时器坏了,而是你的触发条件本身没稳定。
所以一旦定时器表现不对,要先看:
它的输入条件到底有没有持续成立
是不是某个地方每扫都在把条件打断
是否存在条件互相覆盖
错误三:只看输出,不看当前计时过程
很多人调试时只盯着定时器输出是否为真。
但有时更有价值的是看:
定时器当前是否已经开始计时
已计时间有没有增长
是不是输入刚成立又断掉
是不是根本没触发进去
工程调试时,这一点很实用。
十二、再说计数器:它和定时器有什么不同
如果说定时器关心的是“持续了多久”,
那么计数器关心的就是:
发生了几次。
比如:
传感器触发了几次
产品通过了多少个
故障连续出现多少次
某个动作尝试了几次
某个脉冲来了多少个
所以计数器的核心不是时间,而是事件次数。
PLC 里很多控制逻辑其实都离不开计数。
只是有时候你在梯形图里用现成计数块用习惯了,到了 SCL 后容易忘记:
计数的本质并不是“有一个块”,而是“事件发生一次,数值变化一次”。
十三、计数器最关键的一点:不能用“电平”直接当“次数”
这句话非常重要。
很多初学者一上来会写出这种逻辑:
IF SensorOn THEN
CountValue := CountValue + 1;
END_IF;
表面看没问题。
但实际上一旦 SensorOn 持续为 TRUE,这段代码会在每个扫描周期都加 1。
也就是说,你本来想要“来一次加一次”,结果变成了“只要一直有信号,就疯狂累加”。
这就是为什么计数器和边沿信号往往要配合使用。
正确的计数思路通常不是:
“信号现在为真就加一”
而是:
“信号刚刚从假变真那一瞬间,加一。”
这就是边沿检测的重要性。
十四、PLC 计数最常见的两个场景
1. 对脉冲或事件进行累计
例如:
光电传感器每检测到一个产品,计数加一
编码器脉冲累计
某个动作完成一次,工件数量加一
2. 达到次数后触发某个逻辑
例如:
连续 3 次抓取失败后报警
连续 5 次堵料后停机
产量达到 100 后切换箱号
也就是说,计数器不只是记录数量,还经常参与控制逻辑。
十五、SCL 中计数器的实用理解:有时是调用专用计数器,有时是自己用变量加逻辑实现
在工程实践里,计数未必只有一种写法。
有的平台支持现成计数器功能块;
有时工程师也会结合边沿检测,直接用一个数值变量自己做累计。
例如思路上:
检测到上升沿
就让 PartCount := PartCount + 1
只要逻辑清楚,这也是非常常见、非常实用的方式。
所以你不要把“计数器”理解得太死。
它的本质是:事件到来一次,数值按规则变化一次。
十六、边沿信号是什么,为什么它在 SCL 里比你想象得还重要
边沿处理,是很多 PLC 工程师从梯形图转到 SCL 时最容易忽视、也最容易突然顿悟的内容。
因为在梯形图里,你往往习惯了:
放一个上升沿触发块
放一个下降沿触发块
接上去就能用
但在 SCL 里,你会更直接地理解到边沿的本质:
边沿不是“某个信号为真”,而是“某个信号刚发生变化”。
这句话非常关键。
上升沿
表示信号刚从 FALSE 变成 TRUE 的那一瞬间。
下降沿
表示信号刚从 TRUE 变成 FALSE 的那一瞬间。
所以边沿信号不是持续状态,而是一个“变化事件”。
你可以把它理解成:
普通信号是在说“现在亮不亮”
边沿信号是在说“刚刚点亮那一下”或者“刚刚熄灭那一下”
这就是为什么它特别适合:
按钮触发一次性动作
计数
模式切换初始化
状态变化时记录事件
防止长按重复触发
十七、为什么边沿检测在 PLC 里如此重要
因为 PLC 是循环扫描的。
假设某个按钮被按下保持 1 秒,而 PLC 每 10ms 扫描一次。
那这一秒里,程序可能会看到这个按钮为 TRUE 大约 100 次。
如果你写的是:
IF StartPB THEN
StartCount := StartCount + 1;
END_IF;
那一秒里它可能就加了很多次,而不是你想要的一次。
可如果你检测的是“上升沿”,那么只有按钮从未按下变成按下的那一瞬间,才会触发一次。
这就是边沿的价值。
所以你以后只要遇到下面这些需求,就要立刻想到边沿:
只触发一次
只计一次
只在变化那一刻做动作
不允许长按连续执行
十八、边沿检测最本质的思路:拿“当前状态”和“上一周期状态”做比较
这点非常值得你真正吃透。
边沿不是神秘魔法,它最本质的实现思路其实就是:
上升沿
当前为 TRUE,上一周期为 FALSE。
下降沿
当前为 FALSE,上一周期为 TRUE。
例如,上升沿的思路本质上就是:
当前为真 并且 上一次为假
下降沿则是:
当前为假 并且 上一次为真
所以边沿处理为什么离不开“状态保持”你现在就明白了。
因为你必须记住上一次是什么,才能知道这一次是不是刚刚发生变化。
这也说明了一个很重要的事:
边沿检测从根上就不是单纯的组合逻辑,它带有时序和记忆性质。
十九、一个最典型的上升沿应用:按钮只触发一次启动动作
假设你希望:
按下启动按钮那一瞬间,系统进入启动流程。
但按钮如果一直按着,不要每个扫描周期都重新触发启动。
这时候上升沿就特别合适。
逻辑本质上是:
只有按钮刚刚从 0 变 1 时,才给一次启动脉冲。
这类思路非常适合:
启动命令置位
复位命令触发
参数确认
菜单切换
事件记录
二十、一个最典型的边沿应用:计数
前面已经提过,计数不能直接看电平,而要看事件。
例如产品经过一个光电时,你想每过一个加一。
那通常就应该是在光电上升沿时加一,或者根据现场结构在下降沿时加一。
比如:
物体进入检测区,用上升沿计数
物体离开检测区,用下降沿计数
这取决于你实际想统计的是“进入瞬间”还是“离开瞬间”。
这在包装线、输送线、分拣线里非常常见。
二十一、边沿检测在 SCL 里和梯形图最大的思维差异
这点必须明确说出来。
在梯形图里,你往往把边沿块当成一个现成元件。
你把信号接进去,它吐出一个脉冲,事情就结束了。
但在 SCL 里,你会更容易意识到:
为什么会有这个脉冲
它其实是当前值和上次值比较出来的
为什么必须保存上一次状态
为什么某些变量不能是临时的
为什么边沿结果往往只持续一个扫描周期
这其实是个很大的进步。
因为一旦你真正理解边沿是怎么来的,后面你在写:
状态机
一次性触发逻辑
计数
翻转控制
初始化逻辑
都会更稳。
二十二、定时器、计数器、边沿这三者之间,经常是配合出现的
这点特别重要,不要把它们当成三个完全独立的知识点。
在实际项目里,它们常常是连在一起用的。
例如:
场景一:按钮上升沿触发一个脉冲定时器
按下按钮那一下,只触发一次 500ms 输出。
这里就有:
上升沿
定时器
场景二:某故障信号持续 1 秒才确认,并且确认 3 次后报警停机
这里就可能有:
TON 做延时确认
计数器记录故障发生次数
某些地方可能还会配合边沿防止重复计数
场景三:每次产品通过光电上升沿计一次,累计到 20 个后启动打包动作
这里就有:
边沿检测
计数
条件判断
可能还有动作延时
所以实际工程里,这三者往往不是分开孤立使用,而是共同组成时序控制逻辑。
二十三、SCL 中处理这些功能时,一个特别重要的习惯:先分清“状态”和“事件”
很多程序之所以写乱,是因为把状态和事件混在一起了。
状态
是可以持续存在的东西。
例如:
AutoMode
Fault
MotorRun
CylinderOutFB
事件
是变化瞬间。
例如:
StartPB 的上升沿
Fault 从无到有
模式切换刚刚发生
计数脉冲来了一次
定时器常常服务于状态持续时间。
计数器常常记录事件次数。
边沿则专门用来提取事件。
你把这层关系理顺,程序思路会清楚很多。
二十四、初学者在这部分最容易踩的几个坑
坑一:把定时器当阻塞等待
前面已经讲过,这是最典型的大坑。
PLC 程序不是“停在这里等”。
坑二:按钮长按导致重复触发
本来想启动一次,结果一直触发。
根源通常是忘了用边沿。
坑三:计数按电平累加,导致一秒钟加几十次
这也是非常典型的错误。
计数应该围绕事件,而不是简单围绕持续为真的状态。
坑四:边沿所依赖的“上一状态”没保存好
如果上一状态变量没用对、没更新好,边沿结果就会乱。
坑五:定时器输入条件不稳定,结果一直不到时
这在故障确认、防抖动逻辑里特别常见。
坑六:把所有时间逻辑都想写成循环等待
这不仅不推荐,而且容易把扫描周期搞坏。
二十五、从工程角度讲,什么时候你应该本能地想到这三类工具
下面这些场景,你以后最好一遇到就能联想到对应思路。
遇到“持续多久才成立”
优先想到定时器。
遇到“发生几次后再动作”
优先想到计数器。
遇到“只在变化那一瞬间触发一次”
优先想到边沿检测。
这三个判断习惯,会让你在现场写逻辑时快很多。
二十六、这一篇最后,给你一个非常实用的理解框架
以后你看到一个控制需求时,可以先用下面这个方式拆解:
第一步:这是状态问题,还是事件问题
如果是“现在有没有成立”,那更偏状态。
如果是“刚刚变化那一下”,那更偏事件。
第二步:这个需求关心的是时间、次数,还是变化瞬间
时间:定时器
次数:计数器
瞬间:边沿
第三步:它需不需要和条件判断配合
绝大多数都需要。
因为这些工具本身不是全部逻辑,只是逻辑的一部分。
第四步:它会不会因为扫描周期被重复执行
如果会,就要特别考虑边沿、防抖、锁存、状态保持。
只要你养成这个拆解习惯,后面遇到现场需求时,不会一上来就乱写。
小结
这一篇你最应该记住这些核心点:
定时器处理的是时间维度,计数器处理的是次数维度,边沿信号处理的是变化瞬间。
梯形图里这些功能常常表现为直观的功能块,而在 SCL 里你会更直接地面对它们的状态和调用本质。
TON 适合延时接通,TOF 适合延时断开,TP 适合输出固定宽度脉冲。
定时器不是阻塞等待工具,而是在扫描周期中不断更新状态的时序逻辑。
计数不能简单按电平累加,很多情况下应结合边沿检测,否则一个持续信号会在多个扫描周期里重复计数。
边沿检测的本质是比较当前状态与上一周期状态,因此它天然依赖状态保持。
在实际工程中,定时器、计数器和边沿往往配合使用,而不是孤立存在。
写这类逻辑时,一定要先分清状态和事件,否则程序很容易重复触发或判断失真。
下载资料前请先绑定手机号码