RSS

西门子S7-300 150个问题解答之七

来源: 作者: 时间:2008-07-09 Tag: 点击:

  135:能否在STEP 7中使用间接寻址编写循环程序?
   可以,间接寻址允许寻址地址在程序运行期间才可以确定的操作数。这意味着,程序的一部分可以重复执行。在每个运行周期内,循环编程为所使用的操作数分配不同的地址。
  
  136:ANY指针类型的参数如何被传送出块边界?
  下面的例子解释了系统功能块SFC50“RD_LGADR”(读模块逻辑地址)内参数的确定。例如,为功能块FB1编程可分为下面几个步骤:
  • 声明一个IN变量“test”和一个TEMP变量“test2”,类型都为ANY(图1)。
  • 将SFC50的参数“PEADDR”传送到变量“test2”(图1)。
  • 通过为ANY指针“test”赋值,将数据传送到临时变量“test2”中。
  
  

   

 
字串1


  
   语句L P##test首先将地址装载到Accu1,然后通过LAR1语句装载到地址寄存器AR1中(可能是LAR1 P##test的简化格式)。通过寄存器间接寻址将ANY指针(10 字节长)中的地址信息读出:
  
   代码 注释
  0 L W[AR1,P#0.0] 读出当前Accu1中参数数据类型的代码。
  2 L W[AR1,P#2.0] 读出Accu1中的重复因数。重复因数表明通过参数类型ANY传递的数据类型的大小。
  4 L W[AR1,P#4.0] 读数据块的号或者从ANY指针中读出“0”(这个对应于ANY指针的第 4 到第 5 字节)。
  6 L D[AR1, P#6.0] 将区域指针读入 Accu1。
  
  每次读地址寄存器AR1之后,数据被保存或者缓存(如T LW 0)在临时变量“test2”中(ANY指针)。按照Network 1中的语句顺序,传送到功能块FB1 的ANY指针被复制到临时变量“test2”中。
  
  137:怎样通过交叉区域寄存器间接寻址访问功能块的本地数据或者功能?
  这里必须预先定义本地数据。您可以使用下列语句访问FB或FC的本地数据:
  对于存储器间接指针寻址,本地变量必须声明为临时变量(temp):
  L P##Lokalvariable
  LAR1 字串1
  L W[AR1,P#X.x]
  此处不能使用变量类型“Input”、“Output”和“In_Out”,将被语法检查视为非法。
  
  138:怎样编程间接访问一个ARRAY类型变量的元素?
   一个位、字节或者字符域的尺寸是按照字节限制排列的——在所有其它情况下是按照字对齐的。表T6-1中给出了一个域的存储示例。操作系统计算域中单个元素末端位置的位地址。域被分配到从下一个字地址(或字节地址)。下一个数据类型从下一个整字开始(或者整字节).
  声明部分:
   在声明部分,必须定义一个与将被间接寻址的ARRAY有着同一结构的ARRAY。不一定非要将ARRAY声明为IN-OUT变量;也可以声明为TEMP、IN或OUT变量。
  网络:
   域宽度(OFFSET)在网络中定义。ARRAY中的单个元素的最小常规数据宽度是一个字节;即使在两个变量之间定义一个BOOL。有必要确定相关的域的宽度和确定下一个期望域的起始地址。可使用下面的算法:
   地址(指数):b = 元素长度*(指数 - 1)
  创建具有不同数据类型的结构时,必须注意,在特定的环境下可能会自动插入填充字节。
  保存ARRAY数据类型 :
  示例:ARRAY [1..2,1..3] OF 整数 将生成下列域:
字串6

  多维域是按照顺序保存的。在本例中整数 [1,1]后面是整数 [1,2],整数 [1,3]后面是整数 [2,1]。
  
  139:STEP 7 以哪种格式存储POINTER参数类型?
   STEP 7以 6 个字节保存POINTER参数。表4-1显示了用于保存POINTER参数类型的内存区域以及每个字节中保存的数据。i POINTER参数类型保存了下列信息:
  
   


  
  DB号(如果DB中没有保存任何数据时为0)。
  CPU中的内存区域(表格中列出了不同内存区域的十六进制代码)。
  数据的地址(按照Byte.Bit格式)。
  如果将形式参数声明为POINTER参数类型,则只需要指定内存区域和地址。STEP 7自动将输入项目的格式转换为指针格式。
  
  140:如何间接访问I/O地址区域?
   下面演示了一个间接访问PA区域的例子。您具有对输出模块只写访问和对输入模块只读访问的权利
字串7

   FUNCTION_BLOCK FB 2
   TITLE =
   VERSION : 0.1
   VAR_INPUT
   TargetAddress : DWORD := DW#16#FF; //Target address by PA address range
   OutputValue : DWORD ; //Output value
   P_Typ : BOOL ; //1=PE range, 0=PA range
   END_VAR
   VAR_OUTPUT
   InputValue : DWORD ; //Input value
   END_VAR
   VAR_TEMP
   TargetTmp : DWORD ;
   END_VAR
   BEGIN
   NETWORK
   TITLE =
  
   U #P_Typ;
   SPB PEA;
  
   L #TargetAddress;
   T #TargetTmp; //Load target address in the tempor鋜e store
   SLD 3; //Calculate the formate of pointer Byte.Bit
   T #TargetTmp; //Initialisation of temp variable with target address in L-Stack
   L #OutputValue; //Load output value
   T PAD [#TargetTmp]; //Transfere output value to target address
   SPA End;
  
   PEA: L #TargetAddress;
   T #TargetTmp; //Load target address in the tempor鋜e store
字串5

   SLD 3; //Calculate the formate of pointer Byte.Bit
   T #TargetTmp; //Initialisation of temp variable with target address in L-Stack
   L PED [#TargetTmp]; //Load output value
   T #OutputValue; //Transfere output value to target address
  
   End: CLR ;
  
   END_FUNCTION_BLOCK 字串8


上一页 1 23 下一页
Google
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册