这个DB DI寄存器在功能与功能块调用时会互换是什么原理?
刘玉蓉
发布于2014-11-05 17:34
407
0
标签:
调用FB时为什么数据块DB寄存器内容与DI寄存器内容要进行交换?
原文是这样的:帮我注意②和⑥:
当调用功能块(FB)时,会有以下事件发生:
①调用块的地址和返回位置存储在块堆栈中,调用块的临时变量压入L堆栈;
②数据块DB寄存器内容与DI寄存器内容交换;
③新的数据块地址装入DI寄存器;
④被调用块的实参装入DB和L堆栈上部;
⑤当功能块FB结束时,先前块的现场信息从块堆栈中弹出,临时变量弹出L堆栈;
⑥DB和DI寄存器内容交换。
其中②和⑥我看不太明白,为什么在调用时进行寄存器的交换,此时正发生什么情况?
佳答案
这涉及到功能块调用时的堆栈操作。我们必须明白每个功能块FB都有其自己私有的背景数据块,数据块地址寄存器用于存放所有数据块的数据,而且多可以同时打开一个共享数据块和一个背景数据块,而执行FB时打开背景数据块时,必须执行指令OPEN DI,而不能执行OPEN DB,这就是为什么在执行当前FB块时,发生新的FB块调用时必须互换DI寄存器和DB寄存器的内容。而DI寄存器保存背景数据块的内容,而DB寄存器保存共享数据块的内容
当发生块的调用或有来自更优先级的中断时,就将有关的块的信息存储在块(B)堆栈。在逻辑快调用其它块时,这就有一个问题,而且每个FB有其自己的背景数据块(DI),你在执行先前块时已经执行OPEN DIX打开一个背景数据块(数据块存储在DI寄存器中),现在要调用其它FB块,必须又要打开新的背景数据块,而背景数据块只能用指令OPEN DI,所以必须执行数据块寄存器的互换,即把先前的背景数据块暂时存储在DB寄存器中,而新的背景数据块存储在DI寄存器中,然后执行OPEN DIX指令打开被调用块的背景数据块;
如果你明白以上的解释,那么就很容易理解⑥DB和DI寄存器内容交换,你在执行完被调用块的操作后,必须把数据寄存器的内容换回,就把刚执行的被调用块的背景数据块保存到DB数据块寄存器,而把前边调用块的背景数据块保存到DI数据寄存器中,以便继续执行先期FB的程序执行,而FB块的执行,必须使用OPEN DI打开其背景数据块,所以必须进行互换的原因。