okyes 发表于 2012-7-5 20:48:40

step7中的难点:间接寻址示例,中文详细注释。

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 ;
      T   DIW ;
      +AR1P#2.0;//指针移位
      +AR2P#2.0;
      L   #Loop_Val;
      LOOPLP1; //循环变量减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

内芯里 发表于 2012-7-6 01:22:15

hao,这个文章真的很不错,再接再厉

婚礼 发表于 2012-7-6 05:55:50

还是有点看不懂楼主多指点可以不qq437803317

欢喜缘 发表于 2012-7-6 10:29:25

我是新手,觉得有用,下了一个留着,谢谢楼主!
页: [1]
查看完整版本: step7中的难点:间接寻址示例,中文详细注释。