回复:指针难题询问

文逸

  • 帖子

    128
  • 精华

    0
  • 被关注

    23

论坛等级:侠士

注册时间:2013-10-28

普通 普通 如何晋级?

发布于 2017-07-19 09:17:10

10楼

展开查看
以下是引用Letham在2017-07-14 09:14:02的发言 >7楼

需要了解下 指针类型POINTER 结构 就明白了!

Pointer可以理解成指向指针的指针,它所占的6个字节的地址空间分别指向一个DB块号(如果是DB,非DB内存则为0)和实际的指针地址

至于怎么取那个DB号,正常时,那个是由CPU操作系统在调用这段程序,在实参赋值形参时 自动赋值到W[AR1,P#0.0]里的 。D[AR1,P#2.0]就是指针地址了(当然 ,也可以手动给POINTER所占的地址赋值,比如FB里IN_OUT类型的 一个数据结构,由于FB在调用时可以不分配实参,所以你可以在程序内部手动赋值,这样更灵活 在程序执行期间可以指向任意地址空间和DB块)

比如

L P##P  FB里IN_OUT类型一个复杂数据类型,UDT等

OPEN DB10 

L DBNO

T W{AR1,P#0.0]




以下是引用meiruhua在2017-07-12 09:28:56的发言 >3楼: L W [ AR1 , ...

引用3楼详细内容:

 L W [ AR1 , P#0.0 ]     我就不明白这步是怎么取那个DB号的

以下是引用艾星落尘在2017-07-11 13:12:30的发言 >:      L     ...

引用详细内容:

      L     P##S1           //取指针地址,从下面的使用情况来看因该是POINTER     

      LAR1                    

      L     P##S2           //取指针地址,从下面的使用情况来看因该是POINTER       

      LAR2                       

      L W [ AR1 , P#0.0 ]        

      T     #w_Temp          //取S1对应的DB号给 #w_Temp     

      OPN DB [ #w_Temp]       //打开#w_Temp 对应的DB块   

      L D [ AR1 , P#2.0 ]          

      LAR1                    //取S1指针对应的地址数据存入AR1                 

      L W [ AR2 , P#0.0 ]        

      T     #w_Temp           //取S2对应的DB号给 #w_Temp        

      OPN DI [ #w_Temp]       //打开#w_Temp 对应的背景DB块       

      L D [ AR2 , P#2.0 ]         

      OD    16#0100_0000     //这个逻辑或的作用应该是将该地址转化为背景数据    

      LAR2                   //取S2指针对应的地址数据存入AR2        

      SET

      SAVE                      

      L B [ AR1 , P#1.0 ]     //取S1对应的DB块的数据的第二个字节,应该是字符串实际使用的数据  

      +     1                   

LOP:  T     #y_Loop              

      L B [ AR1 , P#1.0 ]        

      L B [ AR2 , P#1.0 ]   //因为是字节进行比较所以就有了 OD    16#0100_0000  这段指令     

      <>I                    //两个DB块的字符串进行比较不等就跳转到循环外,       

      JC    RESE               

      +AR1  P#1.0                

      +AR2  P#1.0           

      L     #y_Loop

      LOOP  LOP               //如果比较的结果相等就继续执行,知道循环数结束为止

      S     #EQ_STRNG         //比较结果都相等就置位#EQ_STRNG    

      JC    ENDE               

RESE: R     #EQ_STRNG         //比较结果有不等的就复位#EQ_STRNG     

ENDE: BE


意思是不是:L W[AR1,P#0.0]这个是取数据编号  L D[AR1,P#2.0]这个把后面的4个字节也就是这个数据存储的拿出来接下来比如 L B[AR1,P#0.0]这个时候才是取出数据的第一个字节的内容。

头顶一片天,脚踏一土地。
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54619条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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