王生彬
王生斌
级别: 论坛先锋
精华主题: 0
发帖数量: 639 个
工控威望: 1792 点
下载积分: 6031 分
在线时间: 253(小时)
注册时间: 2007-09-07
最后登录: 2024-12-26
查看王生彬的 主题 / 回贴
楼主  发表于: 2009-07-16 11:41
step7中的难点:间接寻址示例,中文详细注释。


  

推荐欢迎纠错,防止误导。
  
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传送
      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,确保符合地址格式的要求。详细: http://bbs.e10000.cn/a/a.asp?B=302&;ID=608300  
      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  

luoshenglong
级别: *
精华主题: * 篇
发帖数量: * 个
工控威望: * 点
下载积分: * 分
在线时间: (小时)
注册时间: *
最后登录: *
查看luoshenglong的 主题 / 回贴
1楼  发表于: 2010-04-11 23:19
hao,这个文章真的很不错,再接再厉
homexuejun
级别: 探索解密
精华主题: 0
发帖数量: 61 个
工控威望: 121 点
下载积分: 465 分
在线时间: 23(小时)
注册时间: 2010-04-22
最后登录: 2024-12-12
查看homexuejun的 主题 / 回贴
2楼  发表于: 2010-06-05 20:24
还是有点看不懂楼主多指点可以不qq437803317
wangyd
级别: 略有小成
精华主题: 0
发帖数量: 129 个
工控威望: 214 点
下载积分: 467 分
在线时间: 58(小时)
注册时间: 2010-06-28
最后登录: 2024-08-01
查看wangyd的 主题 / 回贴
3楼  发表于: 2010-07-07 19:32
我是新手,觉得有用,下了一个留着,谢谢楼主!
chaocheng
级别: 探索解密
精华主题: 0
发帖数量: 14 个
工控威望: 130 点
下载积分: 592 分
在线时间: 9(小时)
注册时间: 2014-05-18
最后登录: 2024-11-12
查看chaocheng的 主题 / 回贴
4楼  发表于: 2022-09-20 11:41
很好的帖子,现在发现,昨晚上看了一个类似功能的块,异曲同工啊。