plc扫描周期典型值是多少(浅谈PLC的扫描周期)

扫描周期大家应该都知道,是PLC完整扫描一遍程序的时间,PLC就像一个读报纸的人,而报纸上的内容就是程序,读完一次报纸的时间就是一个扫描周期。

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(1)

这个扫描周期可以是指定一个时间,也可以不指定,指定时间时无论程序有多长,PLC都在设定的时间内全部读完,如果实在读不完,PLC就会报警,说明PLC的性能不够需要更换。时间不指定时PLC按照一个固定的速度去读程序,程序多时间长些,程序少时间就短。

但这并不是今天我们要说的重点,重点是如何从一个扫描周期的角度去看程序。

一个扫描周期下的IF指令

习惯于梯形图编程的人可能不太会去关注一个扫描周期下的程序与连续运行的程序有何区别,因为梯形图最开始就是用来代替继电器的,采用的也是硬件的逻辑思维,但如果想要学习ST,你一定要知道程序在微观下与宏观下的区别,以及不同指令如何运行。

举个例子,判断下面这两段程序有没有区别:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(2)

程序1

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(3)

程序2

从宏观上来看,这两段程序的效果都是iNumber变量 1后持续 10,iNumber的值一直在增长。

但是从一个扫描周期上来看,结果就完全不一样了,为了看到一个扫描周期下程序的运行结果,我们给两段程序加上限制条件,保证程序执行一个扫描周期:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(4)

程序1的运行结果

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(5)

程序2的运行结果

注:iNumber的初始值=0。

可以看到,执行一个扫描周期以后,两段程序给出两个不同的结果,导致这个结果的原因是IF指令的运行特性导致的,一个IF语句在一个扫描周期内最多只执行其中的一个条件

在程序1中,两个判断条件是由两个IF语句写出,条件1(iNumber=0)判断并执行后还会继续判断条件2(iNumber>0),所以最后的结果是iNumber=0 1 10=11。

而在程序2中,两个判断条件写入一个IF语句中,在程序读到IF语句时会依次判断IF下面的所有条件哪个成立,去执行条件成立下的程序。发现条件1(iNumber=0)成立,执行iNumber 1后跳出IF判断,后面的所有条件不再过问了。条件1下的程序执行后,iNumber=1,即便后面的条件2(iNumber>0)这时也成立了PLC也不会去管他了。

这个例子中IF的两个条件同时只有一个条件成立,那如果是在一个扫描周期下,有多个条件成立时PLC如何选择呢?我们稍微改下程序:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(6)

我们把条件2改为iNumber>-1,PLC复位后iNumber=0,同时满足两个判断条件,执行一个扫描周期后iNumber仍然=1,这里说明IF有多个条件同时成立时,执行第一个成立的条件。

不知道有没有人对我加的限制条件有点疑惑,bTrig触发后,程序立即复位了bTrig,也就是最外层的IF语句条件不成立了,为什么后面的程序还会执行呢?这里体现出IF语句的第三个特性,只要判断时条件成立,条件下的程序会全部执行,无论在这个过程中条件有没有变化。

当然,如果想要终止某个条件下程序的运行也是有方法的,可以使用RETURN指令。比如程序1,在条件1执行后我们不希望在执行条件2了的话,可以在条件1后面加一句return;PLC会跳出当前正在执行的指令。

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(7)

RETURN指令

可以看到,在条件1执行后iNumber=1,满足了return的执行条件,返回上一层的IF语句,下面的条件不会再判断了。

总结:

一个IF语句在一个扫描周期内最多只执行其中的一个条件

在一个扫描周期内IF语句有多个条件同时成立时,执行第一个成立的条件。

在一个扫描周期内IF语句只要判断时条件成立,条件下的程序会全部执行,无论在这个过程中条件有没有变化

IF与CASE的区别

上面刚刚总结的3个特性,case语句是同样具有的,那case与if有什么区别呢?

1.PLC的占用不同

PLC在解析IF语句时,在一个扫描周期内要依次判断所有条件是否成立,找到第一个成立的条件后去执行,而解析case语句时,直接根据判断变量的值跳转至相应的程序中,举个例子:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(8)

IF判断

在这段程序中,iStep的值=8;在bTrig触发后PLC先判断第1个条件iStep=0,发现不成立后判断第2个条件iStep=1,发现不成立后判断第3个条件。。。最后判断第9个条件iStep=8,发现条件成立,开始执行,共判断了9步。

我们再看看case如何编写:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(9)

在bTrig触发后,PLC判断iStep的值=8,直接去执行“8”后面的程序,只判断了一步。在复杂程序中多使用case去判断数字变量,可以非常有效的减少PLC的运行负荷。(由于三菱软件编译的原因,实际的步数不一定谁多谁少,不用过于关注。)

2.判断的变量类型不同。

IF指令能够判断数字变量,开关变量等多种类型的变量,甚至可以在判断条件中编写复杂数学公式和逻辑计算。例如:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(10)

如图,直接在判断的数组变量的角标中写入数学公式,且多个变量使用and 、or 、not 等逻辑符号进行计算。

而case语句只能判断数字类型的变量,或者枚举变量(三菱不支持),例如:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(11)

理解循环的意义

ST的循环可以指定循环次数(FOR循环),可以不指定循环次数(while循环),而这里所说的循环次数都是一个扫描周期下的执行次数。举个例子:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(12)

这句话的意思是在一个扫描周期内,执行100次iNumber 1,而且每次执行后,ii的值增加1。我们如果想看到一个周期内的结果扔然要增加限制条件:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(13)

可以看到执行一个扫描周期后,iNumber增加了100次1,最后等于100。

那它有什么作用呢?我用if语句也能实现iNumber增加100次1啊,比如:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(14)

bTrig触发后,iNumber满足<100 的条件,执行iNumber 1的程序,100扫描周期后,条件不再满足。他们虽然实现了同样的功能(iNumber增加了100次1),区别是IF用了100个扫描周期,而for只用了一个。在我举的例子当中区别确实不大,但是在正常程序中,PLC的扫描周期一般要在2-5ms左右,一千次的扫描周期就达到了2-5秒的时间,假设要实现从一个容量为1万的数组里面找出一个特定数值,如果用IF的方法,大约要耗费20-50秒才能完成,这个时间成本是有点高的,而for循环只需要几毫秒,可以说一瞬间完成。

例如:假设容量为1万的数组iNumber[0..9999],从中找出第一个数值为888的变量,记录他的角标:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(15)

大家可以试着理解一下这个程序。

上升沿/下降沿

字面理解上升沿和下降沿,是一个变量变化的一瞬间,是一个无穷小的时间。但是在plc的程序里最小的时间单位就是扫描周期,所以所谓的沿就是一个扫描周期。

上面举的例子中用到的bTrig变量都是为了让下面的程序执行一个扫描周期,也可以理解为执行bTrig的一个上升沿,与下面的编程效果一样:

plc扫描周期典型值是多少(浅谈PLC的扫描周期)(16)

上升沿功能块R_TRIG的功能,实际上就是检测输入变量,在输入变量由低电平变为高电平的第一个扫描周期内输出高电平,然后输出低电平。也就是输出一个扫描周期。

下降沿与上升沿同理,检测的是输入变量由高到低变化的第一个扫描周期。

理解的上升沿与下降沿的含义,我们可以非常灵活的应用在程序中,像让程序执行一个扫描周期,可以检测一个变量的上升/下降沿,可以用我们上面的例子中在IF语句置位复位一个变量,也可以在case中执行一个条件后立刻改变判断变量的数值等等。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页