偶尔钻钻牛角尖,为一个很简单的问题争个不休,也是很好的!
这其实也是一个好现象,我们的技术才会不断进步吗!其时对于一个看似简单的问题,确实有必要进行深究!
还是给楼主举个例子,就很清楚了!
如:OB1无条件调用FC1,FC2(先调用FC1,后调用FC2);必须强调一点:以下分析的前提条件:在执行FC1后,执行完FC2前,程序必需没有被中断过,如果被中断,那么执行结果无法预料;
OB1程序:
CALL FC1
CALL FC2
FC1程序:
A M10.1
= L10.1
FC2程序如下:
A L10.1
= M10.2
A M10.3
FP L10.1
S M10.4 //使用S是为了便于人观察程,若用=, M10.4 只置位一个扫描周期,时间太短,不利于观察执行结果!
A M10.5 //只是为了测试方便,方便不断测试时复位M10.4;
R M10.4
1、若M10.1=1,那么M10.2=1;M10.4肯定为0(没有疑问,中间没有谁写过L10.1,不过有个前提条件,在执行FC1后,执行完FC2前,程序没有被中断过,如果被中断,那么执行结果无法预料)
2、若先M10.1=1,后M10.3为1,那么M10.4 不会置1的。(因为这时L10.1在执行FC1后置为1)
3、若M10.1=0后,M10.3为1,那么M10.4 置1的(因为这时L10.1在执行FC1后置为0,M10.4 =1在FP处有一个上升沿)
测试的结论是:执行完FC1后,释放临时存储区,但是相应位的状态保持原值(打个比方:A房东协议把空房子卖给B,B当然
没有拥有房间内的电视,但B肯定拥有房间内天花板的)。
应该说临时变量继承是前面它的被写的值。但是由于很多地方会
不经意地写临时数据:如1、跳转指令的目的区也用到临时变量;2、OB块会写临时数据(OB35,0B40)
大家可以试一下:如果上面程序在执行过程中随机调用OB40(哪怕OB40是空指令,他也会写临时变量),那么上面的程序执行结果M10.4 无法预料。
本人的结论:说临时变量没有记忆能力是指临时变量经常会被不可预见的程序写,因而它的值离开块相当于是随机的,也就有没有记忆能力的意思了。而不是真正的没有记忆功能。临时变量其实也有传递性,记忆能力,但是千万不要乱用它,因为我们无法预料系统其他地方何时会写临时变量(如OB40),至少程序有不可预见的执行结果,
再次强调:书上说得临时变量没有记忆能力,是指它的值具有不可预见性!(个人认为语句有点不贴切,但是理解为没有记忆能力也不能算错。其实它的存储地址是固定在临时存储区的)
最后,强烈认为不可靠的变量我们不如不用它!(指临时变量离开块时)
附件为本人做的测试程序!600K左右!实际运行一下吧
点击此处查看附件