原帖地址16测点,相邻两点编程问题
针对原帖,有坛友给出了一种解决方法,也有坛友给出了一些很中肯的建议。
原贴中给的方法,是取连续两个地址,判断它们的值,如果都小于2.0,则输出故障信号,这里再提出一种方法,仅供参考,欢迎大家讨论。
如下图所示,连续16个存储单元,照原贴中坛友给出的方法,假如仅有一对值小于2.0的地址,它们是#14和#15,处于需要进行比较值操作地址串的最右端,很不幸,这是最糟糕的情况,我们要进行15次比较操作,才能找到它们。
我们不妨换一种思路,我们不直接进行两个连续地址的比较,我们一个一个的处理,如下图示,我们也不从第一个地址#0开始,而是直接从青蓝色方块所示的偶数序(第2、4、6...)地址开始判断,如1#地址,如果#1地址的值比2.0小,我们再分别看#0和#2,否则我们下一个操作对象将会直接是#3地址,原因嘛,假如#1地址的值比2.0大,那无论#0或#2地址的值和2.0相比较是什么关系,对#1地址来说,都没有任何意义,因为只有#0和2#才能和#1组成相邻的地址对,这样看的话,即使唯一的一对值小于2.0的地址对也和我们上面说的最坏的情况一样,也处于最右端,采用此用方法,我们仅需要判断8次。
下面说一下步骤:
1、将current指针指向#1,我们判断#1的值是否小于2.0,如果不是,直接改变指针current(+8),进入下一循环判断;
2、如果#1的值小于2.0,我们通过改变指针current的值,分别-4、+4得到新指针previous(前一个)、next(下一个)的值;
3、然后判断新指针指向的地址的值是否小于2.0,如果previous指向的地址的值小于2.0,那么就可以直接输出故障位信号,跳出循环;
4、否则,我们继续判断指针next指向的地址值是否小于2.0,如果是,那么直接输出故障位信号,跳出循环。

****************************************************************************************************
本段代码检测连续存储的16个存储单元串中是否存在相邻的两个存储值都小于2.0的存储单元,如果存在,则输出故障位信号。
单纯的说好像没什么说服力,只好上代码了,代码已经仿真验证。
****************************************************************************************************
代码共40条,以空间换时间的代价不小。
水平有限,不足难免,欢迎指正。
****************************************************************************************************
CLR
SET
R "fault_bit"
LAR1 P#M 4.0
L 8
a00: T "cycle"
A(
L MD [AR1,P#0.0]
L 2.000000e+000
<R //current unit<2.0?
)
JCN cyc2 //jump to change pointer "current"
L -32
+AR1
A(
L MD [AR1,P#0.0]
L 2.000000e+000
<R //previous unit<2.0?
)
A(
L "cycle"
L 1
<>D //and not the last(eighth) judge
)
JCN cyc1
JU END
cyc1: L 64
+AR1
A(
L MD [AR1,P#0.0]
L 2.000000e+000
<R //next unit<2.0?
)
JCN cyc2 //jump to change pointer "current"
JU END
cyc2: L 64 //change pointer "current"
+AR1
L "cycle"
LOOP a00
END: = "fault_bit"