紫外工控论坛

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2254|回复: 2

[软件资源] 间接寻址示例及中文详细注释【转】

[复制链接]
冰糖 发表于 2011-3-19 19:42:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
FUNCTION "DBtoDB" : VOID //该功能块的作用是把一个数据块中的指定的一批数据,复制到另一个块的指定位置。  
TITLE =                  //标题,这里没有指定  
AUTHOR : BaiZH           //作者 感谢您,BaiZH,通过您的这个例子我基本入明白了间接寻址的用法。不过具体在什么情况下使用我还得继续努力。  
FAMILY : IR               //分类  
NAME : DBtoDB              //名称  
VERSION : 0.1              //版本  
VAR_INPUT                                                              //输入型变量声明开始  
  SRC_DB : INT ; //Source DB Block Number                           //整型值,要复制的源数据块块号  
  SRC_SttAddr : INT ; //Start Address of the Sending Data in SRC_DB  //源数据块的要复制的数据起始地址  
  SendNum : INT ; //Words Number Need Sending                         //要复制的数据量  
  DST_DB : INT ; //Destination DB Block Number                       //目标数据块号  
  DST_SttAddr : INT ; //Start Address of the Receiving Data in DST_DB //目标数据块中数据起始地址  
END_VAR  
VAR_IN_OUT                                                              //输入输出变量声明                                                         
  Enable : BOOL ; //Enable Bit                                        //使能此功能块位  
END_VAR  
VAR_TEMP                                                                //声明临时变量  
  DB_LOAD_TEMP : INT ;                                               //存放临时数据块块号  
  Loop_Val : INT ;                                                     //Send Data Loop Value //循环次数  
  DB_SAVE : INT ;                                                     //保存进入此函数前,系统已经打开的数据块号  
  DI_SAVE : INT ;                                                     //同上  
  AR1_SAVE : DWORD ;                                                    //保存进入此函数前,地址寄存器1中的值  
  AR2_SAVE : DWORD ;                                                 //同上  
END_VAR  
BEGIN  //在STEP7的BLOCK中编辑时的程序主要从这里开始  
NETWORK  
TITLE =Send Data  
//Move data from DB to DB  
      A     #Enable;    //使能位,ENABLE为1执行以下程序  
      JCN   END;         //否则跳转到最后  
      TAR1  #AR1_SAVE; // Save AR and Opened DB //保存进入此函数前的数据到临时变量中,以备离开时复原  
      TAR2  #AR2_SAVE;  
      L     DBNO;     //同上,保存调用前的现场数据,以备调用完毕复原主程序的现场数据  
      T     #DB_SAVE;  //一个DBNO,一个DINO,是因为要同时打开两个数据块,只能一个背景数据块,一个共享数据块。  
      L     DINO;  
      T     #DI_SAVE;  
      L     #SRC_DB; //Open DB  //把要打开的数据块块号通过中间变量#DB_LOAD_TEMP传送。它的好处引用cvlsam的指点,(详细:非常的抱歉,引发您的误解,前面那个A,实际上我表达的意思是A #Enable,只是懒于打字,造成您的误会。
对于这个,应该非常的好理解,如:
---|  |-----------------------————————()
这样的应该常看见吧,触点动作,线圈吸合,同样,在这里,A     #Enable也是一样的道理,当#Enable为1,那么动作,如果您这里使用Input,那么不管#Enable是否为真,您OPN指令的执行参数都会发生改变,这样的程序会造成多个出口,引发逻辑上的混乱,为了避免这样的混乱,借用中间变量的赋值操作,从而使得OPN执行参数的变化必须依赖于#Enable变量的状态,从而使用程序无多层出入口,提高了程序的封装。)

      T     #DB_LOAD_TEMP;  
      OPN   DB [#DB_LOAD_TEMP];  
      L     #DST_DB; //Open DB  
      T     #DB_LOAD_TEMP;  
      OPN   DI [#DB_LOAD_TEMP];  
      L     #SRC_SttAddr; //Load Start Address //要复制的数据起始地址  
      SLD   3; //左移位,使的地址指针最右边三位保证为0,确保符合地址格式的要求。(详细: 因为西门子规定:存储器间接寻址必须使用32位指针格式,也就是说,要访问位,字,双字这样的地址就必须使用32位指针,而32指针的格式要求0,1,2位必须为0,因此这里使用双字左移指令移动3位,当然,左移指令等同于数据乘以8,因此今后您看到不是使用SLD 3,而是使用乘以8的方式不要再犯迷糊了。)
      LAR1  ;  
      L     #DST_SttAddr;  
      SLD   3;  
      LAR2  ;  
      L     #SendNum;  开始循环程序,把复制的数据量放入循环变量中  
LP1:  T     #Loop_Val; //Move Data  
      L     DBW [AR1,P#0.0];  
      T     DIW [AR2,P#0.0];  
      +AR1  P#2.0;  //指针移位  
      +AR2  P#2.0;  
      L     #Loop_Val;  
      LOOP  LP1; //循环变量减1,判断循环条件  
      LAR1  #AR1_SAVE; //Recover Original AR and DB//这里在执行完功能后,开始恢复调用前的主程序现场数据。  
      LAR2  #AR2_SAVE;  
      OPN   DB [#DB_SAVE];  
      OPN   DI [#DI_SAVE];  
      SET   ; //系统将RLO置1,代表FB(FC)执行完毕,相当于功能块的ENO使能输出位。再次感谢cvlsam。  
      R     #Enable;  
END:  NOP   0;  
END_FUNCTION  
666366 发表于 2011-3-20 09:10:14 | 显示全部楼层
学习中
kuwait 发表于 2011-4-7 21:45:43 | 显示全部楼层
dddddddddddddddd
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


--------------------------------------------------------------------------------------------------------------------
本站是工控技术交流站点,论坛内容均为网络收集或会员所发表,并不代表本站立场,会员拥有该内容的所有权力及责任!
本站内容如有侵犯您的版权,请按下面方式联系本站管理员,我们将及时删除处理
管理员:冰糖 QQ:5483695(请直击主题), Mail:admin#ziwai.net(#改成@) 其它非本人.
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!

QQ|Archiver|手机版|小黑屋|紫外工控论坛. ( 苏ICP备11032118号-1 )

GMT+8, 2024-5-17 10:56 , Processed in 0.390625 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表