调用子例程指令JSR是使用最为广泛的指令,几乎所有的主例程都要使用JSR指令来启动例程或安排执行顺序。如图11-1所示的梯级逻辑就是最常见的根据条件执行的简单调用。
如果是调用初始化的例程,则采用的梯级条件是S∶FS,梯级逻辑编写如图11-2所示。S∶FS是关键字,只有在控制器进入运行第一次例程扫描时为1,其余时候均为0,只有在例程运行的第一次才会执行,一般用来完成初始化的设置操作。
子例程也可以是无条件调用,那就意味着每次扫描都有调用,这样的调用通常被编写在主例程中,如图11-3所示的梯级逻辑。
图11-1 有条件的例程调用
图11—2 初始化例程的调用
图11-3 无条件的例程调用
JSR指令使用简单,但仍有人对在被调用的子例程中是否要使用SBR和RET感到困惑。子例程的调用分两种情况,一种是简单地调用执行,不带入任何参数,也不带出任何参数,如前面所示的三种情形,此时在被调用的子例程中不需要编写任何SBR和RET的指令,只需编写与执行有关的梯级逻辑便可。(www.xing528.com)
另外一种情况是要带入参数、带出参数或带入带出参数,如图11-4所示是调用例程的JSR指令,指令中要指定带入带出的参数的数据标签,带入的数据标签将与被调用例程SBR指令中指定的参数数据标签交换数据;带出的数据标签在被调用例程执行完毕后,将与最后一级梯级的RET指令中指定的数据标签交换数据。
图11-4 带入带出参数调用例程的JSR指令
在被调用的子例程中,需要带入参数的要编写SBR指令,且要放置在被调用子例程第一个梯级的最前面;需要带出参数的要编写RET指令,且要放置在被调用子例程的最后一个梯级;需要带入带出参数的则SBR指令和RET指令都要编写,如图11-5所示的梯级逻辑。
一般来说,无条件调用的子例程总是连续不断地执行的,不会有数据残留的问题需要关注。有条件调用子例程的执行则需要考虑数据的状态,当子例程停止调用时,梯级逻辑运行结果修改的数据会保留不动,尤其是非保持性指令值得探讨,例如输出位逻辑指令OTE会保留它被修改的原样,只要例程没有再次被调用,这个位状态就会一直保持,这和MCR等指令执行后的状态是不一样的,它不会自行复位。为了避免子例程执行受到前次执行残留数据的影响,有的满足条件才调用的子例程编写了进入时清除残留数据的初始化操作的梯级逻辑。
图11-5 被调用子例程中的有关带入带出参数的梯级逻辑
像TON这样的指令就要非常关注了,通常的计时器启动都会有自动复位的作用,只有子例程的调用是不会清除原有的累加值的。更重要的是,每当例程调用,TON指令被扫描时会修改累加值ACC,它会将上次扫描到这次扫描的时间间隔迭加在累加值ACC上,如果子例程调用的时间间隔超出了计时器可容纳的时间间隔范围,这时计时器的ACC值就变得不可靠了。Logix控制器是32位的数据处理单元,它预留了22位来存放这个间隔时间值,可以算出间隔时间最大值是69.905min,当一个含有计时器指令的例程被停止调用69.905min以上,这个计时器的累积值就不能使用了。所以,计时器的处理在这种情况下须要谨慎。
同样是调用子例程的指令JXR是调用外部子例程的指令,这条指令仅仅在SoftLogix5800的软控制器中才会用到,因为只有在运行着SoftLogix5800软件的同一台计算机中,才有可能访问到第三方的程序,这里就不举例说明了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。