再论”16个测点,相邻两点编程问题“

已锁定

'Razor

西门子1847工业学习平台

  • 帖子

    3541
  • 精华

    46
  • 被关注

    233

论坛等级:至圣

注册时间:2008-03-31

钻石 钻石 如何晋级?

再论”16个测点,相邻两点编程问题“

465

3

2017-03-30 15:56:49

原帖地址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"


























再论”16个测点,相邻两点编程问题“ 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54775条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。