回复:关于ANY类型参数用法的一道题

艾星落尘

  • 帖子

    996
  • 精华

    1
  • 被关注

    179

论坛等级:至圣

注册时间:2010-02-26

白金 白金 如何晋级?

发布于 2016-11-10 13:51:52

5楼

展开查看
以下是引用蜗牛快跑在2016-11-10 12:18:20的发言 >

艾侠:请帮我看看我的程序错在哪里,程序报错CPU停止,但程序应该是已经正确执行了。程序在FC1内, DB1,DB2,DB3三个any类型;DB1在输入参数,DB2,DB3在输入/输出参数。其余都是临时变量,都是整形类。DB1存放1,2....20,共20个INT,程序执行后DB2内存放2,4...20,10个数,DB3存放1,3...19,10个数。程序应该是执行了,但CPU是报错的。不明白是啥原因,哪位大侠有时间帮我看看,谢谢

FC1 内程序:


      L     P##getw                     //IN参数any类型 取数

      LAR1  


      L     W [AR1,P#4.0]

      T     #db_no                      //取出DB号


      L     W [AR1,P#2.0]

      T     #length                     //取出长度


      L     D [AR1,P#6.0]

      LAR1  


next: OPN   DB [#db_no]

      L     W [AR1,P#0.0]

      T     #ini_w                      //得到数据区第一个字

......................................................................

  L     #ini_w

      L     W#16#1

      AW    

      L     W#16#0

      ==I   

      JCN   a00                         //逻辑结果为0即奇数时跳转

      L     #ini_w

      T     #even                       //偶数放even

...........................................................................

 L     P##even_db

      LAR2  


      L     W [AR2,P#4.0]               //取出DB号

      T     #evendb_no

      L     D [AR2,P#6.0]               //数据地址

      LAR2  


      L     #evenposi                   //填放的位置,数据字

      SLD   3

      +AR2  


      OPN   DB [#evendb_no]             //打开DB块

      L     #even                       //存放偶数

      T     W [AR2,P#0.0]


      L     #evenposi

      L     2

      +I    

      T     #evenposi                   //每次后移2字节

      +AR1  P#2.0


      L     #length

      LOOP  next


      JU    d00

..................................................................................

a00:  L     #ini_w

      T     #odd                        //是奇数转放odd


      L     P##odd_db                   //out参数any类型

      LAR2  

      L     W [AR2,P#4.0]

      T     #odddb_no                   //取出DB号

      L     D [AR2,P#6.0]

      LAR2                              //ar2存放首地址

      L     #oddposi                    //首字左移3位作地址

      SLD   3

      +AR2  


      OPN   DB [#odddb_no]              //打开DB块

      L     #odd

      T     W [AR2,P#0.0]               //填放数据

      L     #oddposi

      L     2

      +I    

      T     #oddposi

      +AR1  P#2.0


      L     #length

      LOOP  next

......................................................................................

d00:  BE  

另外:艾侠的程序,这里不是太懂“

 L     0

      T     #TEMP14

      CALL  "FILL"

       BVAL   :=#TEMP14

       RET_VAL:=#TEMP10

       BLK    :=#TEMP12


      CALL  "FILL"

       BVAL   :=#TEMP14

       RET_VAL:=#TEMP11

       BLK    :=#TEMP13

TEMP12,TEMP13赋初值0,程序里用在哪里了?还请明示,谢谢!

首先,我觉得程序写的有点乱,最好不要这么写,为什么不把提取DB号,地址,数据长度这些问题,在执行奇偶数之前就做好呢?第二,CPU报警的问题是loop 在不同的位置却到同一个next,不妨先删除一个loop看看,是否还有CPU停机的问题。

关于:

      L     0

      T     #TEMP14

      CALL  "FILL"

       BVAL   :=#TEMP14

       RET_VAL:=#TEMP10

       BLK    :=#TEMP12   是一个ANY指针对应奇数的DB块


      CALL  "FILL"

       BVAL   :=#TEMP14

       RET_VAL:=#TEMP11

       BLK    :=#TEMP13   是一个ANY指针对应偶数的DB块

具体的用法可以看SFC21的功能,就是一个清零的作用,这样当初始数据发生变化后,之前判断的数据就会被清除,不会留下痕迹。

强烈建议:读取ANY指针信息的步骤在之前就做好,并命名好临时变量的名称,方便查看程序。


一个人在战斗
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54774条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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