在西门子 S7-200 中,如何复位一个位变量,比如 Q0.0 ?
最常用最直接的就是用 R 指令吧
ld sm0.0
r q0.0, 1 // 占用程序空间 9 字节,执行时间3.7us
但我更喜欢用线圈输出指令
ldn sm0.0
= q0.0 // 占用程序空间 4 字节,执行时间2.1us
两种方法各有优劣,R 指令的好处是代码量少,复位多个变量时占用空间不变,但需要多个被复位的变量地址连续,且执行时间较长。线圈输出指令的好处是执行效率高,复位多个变量时不需要地址连续,但占用空间随变量增多而变大,且代码要多。
[COLOR=RED]R指令占用空间: 9
R指令执行时间: 0.8 + 2.9 * (n==1) + 14 * (n-1)
线圈指令占用空间: 2 + 2 * n
线圈指令执行时间: 0.9 + 1.3 * n 微秒 // n 为复位的变量数[/COLOR]
n 为复位的变量数,可以算出,n<=3 时,无论时间还是空间,线圈指令均占优势,n<=15 时,线圈指令时间上占优势,但花费空间更多,n>15 时,R 指令更好。
事实上,只要时间占优,我更愿意选择线圈指令。不要小看几个微秒的区别,这些指令太基础太常用了,在整个工程中用到的机会很多,对扫描周期的影响可以达到数百个微秒,甚至到毫秒级,而扫描周期跟整个系统实时性表现密切相关。作为开发者,这里应该斤斤计较。
两种复位方法,实际上代表着两类编程习惯,比如用两个按钮控制启停,可以这样:
ld i0.0
s q0.0, 1
ld i0.1
r q0.0, 1 // 注意两个网络的顺序,此顺序同时按下两个按钮时是停止优先的
或
ld i0.0
o Q0.0
an i0.1
= q0.0
两种方法在空间、时间上均有较大别区。这只是一个最简单的例子,在复杂的逻辑处理中,R/S 指令的使用可以简化编程思路,想到什么条件就置/复位一下,不用考虑逻辑互锁,这些指令可以分散在不同的网络甚至不同的子程序中(但要考虑到多条指令的顺序,因在一个扫描周期内,同一输出点的多次操作,只有最后一条是有效的,如果程序其它地方要引用Q0.0的状态,更要小心翼翼)。轻松是轻松了,但这是不利于程序结构化的,出现异常时排错较为麻烦。后一种方式在处理复杂逻辑时很麻烦,有时甚至需要在网络前加额外的辅助条件变量,但时空效率高,对同一输出的处理集中在一个网络中,异常时通过在线监控可轻易排错。
前一种方式轻松的是开发者,后一种方式轻松的是整个系统。