一、寻址方式 1)直接寻址 1.直接地址:例如I0.0,Q1.7,PIW256,PQW512,MD20,T15,C16,DB1.DBB10,L10.0等 2.符号寻址:例如qq,ww.aa等 2)间接寻址 1.存储器间接寻址:16位指针,例如OPN DB[MW2] 32位指针,例如A I[MD0] 2.寄存器间接寻址:32位指针,例如A I[AR1,P#0.0],A [AR1,P#0.0] 二、寻址的灵魂:如何使用指针? 指针用来指向一个地址。使用这种寻址方式的优点在于可以在程序运行过程中实现变址。指针用于存储器间接寻址 程序中用于存储器间接寻址的语句包含一个指令、一个地址标识符、以及一个偏移量(偏移量必须在方括号内给出)。 下面给出一个双字格式的指针的例子: L P#8.7 把指针值装载到累加器1 T I[MD2] 把指针值传送到MD2 A I[MD2] 查询I8.7的信号状态 = Q[MD2] 给输出位Q8.7赋值 存储区域内部寻址及交叉寻址:程序中采用这些寻址方式的语句包含一个指令以及下列内容:地址标识符、地址寄存器标识符、偏移量。地址 寄存器(AR1、AR2)及偏移量必须写在方括号内。 存储区域内部寻址例程:指针不包含指示存储区域的信息: L P#8.7 把指针值装载到累加器1 LAR1 把指针从累加器1装载到AR1 A I[AR1,P#0.0] 查询I8.7的信号状态 = Q[AR1,P#1.1] 给输出位Q10.0赋值 偏移量0.0不起作用。输出Q10.0 等于8.7 (AR1) 加偏移量1.1。结果是10.0 ,而不是9.8。 存储区域交叉寻址例程:在存储区域交叉寻址中,指针中包含指示存储区域的信息(例子中为 I 和 Q)。 L P#I8.7 把指针值及存储区域标识装载到累加器1 LAR1 把存储区域I 和地址8.7装载到AR1 L P#Q8.7 把指针值和地址标识符装载到累加器1 LAR2 把存储区域Q和地址8.7装载到AR2 A [AR1,P#0.0] 查询输入位I8.7的信号状态 = [AR2,P#1.1] 给输出位Q10.0赋值 偏移量0.0不起作用。输出Q10.0 等于8.7 (AR2) 加偏移量1.1。结果是10.0 ,而不是9.8, 三、如何用一个变量作索引实现在一个域中读一个元素或写一个元素? 一个域(数据类型为ARRAY)是几个相同数据元素的连接。在源代码中一个单空间域的声明执行如下: My_Array: ARRAY[4..11] OF INT; 它标识了一个数据类型为“INTEGER”的8(=11-4+1)元素单空间域。 为了访问域中的一个元素,输入域名并在方括号中输入希望访问的元素的号码,比如:My_Array[6]。 在S7-SCL (结构化控制语言- 符合IEC 1131-3 的结构化文本)可以使用变量做索引: i:INT:=46 My_Array[i]:=0 在FBD/LAD/STL中,索引必须是个常量,因此限制了可使用的域的范围。 四、怎样访问复合数据类型数组单元的变量? 复合数据类型数组单元中的变量只有通过单独的函数才能访问。作为传送参数这个函数拥有期望的数组数量并以数组[0]作为起始地址。对此函数的要求是数组置于一个数据块中并且数组[0]不被当前数据使用。这就决定了从参数传送来的地址并将指定的数组拷贝到作为处理区的数组[0]。接下来可对数组进行符号处理。然后它被拷贝回原始的数组号。 首先用这些参数定义并计算数组[0]的地址和要处理的数组数量。将这些值保存在函数的临时变量内。 L P##Field_Start // 输入地址域[0] LAR1 L D [AR1,P#0.0] // 把这些地址保存在类型为ANY的临时变量中 T LD 0 // temp 'firststruc' = LD 0-9 T LD 10 // temp 'sourcestruc' = LD 10-19 L D [AR1,P#4.0] T LD 4 T LD 14 L W [AR1,P#8.0] T LW 8 T LW 18 L LD 16 // 定义期望数组的地址 LAR1 L #Indices L LW 12 *I SLD 3 +AR1 TAR1 LD 16 然后用SFC20 (BLKMOV)将要处理的数组拷贝到数组[0]。就可以根据应用需求,对索引数组通过符号访问。然后用SFC20 (BLKMOV)将数组[0]拷贝回原始区域。 |
|
来自: 金玉满堂jjnla8 > 《S7-300》