广西西门子S7-1500PLC模块代理(量大从优)
STEP 7的在全局数据块中存储
编辑器按照变量声明的顺序,把单个变量保存到数据块中。实际上,存在下列规则:
●连续声明序列中的个位变量位于下一个字节的第0位,后面紧跟下一个位变量。
●字节变量保存在下一个字节中。
●字和双字变量一般开始于字边界,就是说,位于偶数地址的字节中。
●DT和STRING变量开始于字边界。
●ARRAY变量开始于字边界,并且被“填充”到下一个字边界。这适用于位或字节数组。基本数据类型的数组组件的保存如上面所述,更高数据类型的数组组件开始于字边界。数组的每一维都像自主数组一样对齐。
●STRUCT变量开始于字边界,并被“填充”到下一个字边界。单纯的位结构和字节结构也是如此。基本数据类型的结构组件的存储如上面所述。更高数据类型的结构组件开始于字边界。
通过合并位变量和成对地安排字节变量,可以优化数据块中的数据存储。
可以看到未优化和优化的数据存储的例子。注意,编辑器总是把ARRAY和STRUCT变量“填充”到下一个字。就是说,不能把位或字节变量存储到字节间隔中。不过,可以使用结构来优化变量的排列
对于使用CODE_VERSION1编译的功能块(没有“多实例能力”),可以没有任何限制地使用本章讲述的所有语句。
对于具有“多实例能力”的功能块,编辑器通过地址寄存器AR2存取实例数据,就是说,所有的存取操作都是间接的。这种情况同样适用于间接寻址,或处理地址寄存器。如果对保存在区指针中的实例数据使用寻址,编辑器将采用地址。然而,如果使用的是符号寻址,编辑器将把其作为“二次间接寻址”而拒绝这种设计。
表1给出了这种情况的两个例子:如果在具有“多实例能力”的功能块中使用存储器间接寻址,就不能直接使用保存静态局部数据的指针。先将指针复制到暂态局部数据项目,然后才能使用它。不能把静态局部数据中的指针直接加载到地址寄存器中,并且不能把地址寄存器的内容直接传送给指针(第二个例子)。
表1 静态局部数据情况下的不同编程
对于“多实例能力”的功能块(块版本2),STEP 7使用地址寄存器AR2作为实例数据的“基地址寄存器”。当调用一个实例时,AR2包含了P#DBX0.0,所有块参数或FB中的静态局部数据的存取操作,都采用使用地址区DI的区内寄存器间接寻址方式,寻址时使用的寄存器为AR2。局部实例的调用使“基地址”增加+AR2 P#y.x,以使得存取操作可以相对于被调用功能块中的地址,使用主调用功能块中的实例数据块来进行。用这种方式,可以把功能块作为自治实例或局部实例来调用(在此适合于功能块中的任意指针,甚至可以多次调用)。
如果使用块版本1对功能块进行编程(没有“多实例能力”),STEP 7将不使用地址寄存器AR2。
所以,如果需要在具有多实例能力的功能块中使用地址寄存器AR2,必须保存其内容,然后在使用后恢复它。在使用地址寄存器AR2的区域中,不能通过编程对任何块参数或静态局部数据进行存取。
在功能中,对于地址寄存器AR2的使用没有任何限制。
如果想要在功能块中使用AR2和DI寄存器进行间接寻址。首先,要保存寄存器中的内容,并且在恢复AR2和DI寄存器的内容之前,不能对块参数或静态局部数据进行存取。
STL使用地址寄存器AR1存取的块参数可以像DB指针一样传送。如果是在功能中,这些参数包括所有的复杂数据类型的块参数;如果是在功能块中,则这些参数指复杂数据类型的输入/输出参数。
当存取这种类型的块时,按照顺序,要检测一个结构的位组件或把一个INT值写入到数组组件。地址寄存器AR1中的内容发生了改变,同时,DB寄存器中的内容也发生改变。当通过“传递”这种类型的块参数来调用块时,也是如此。
如果使用地址寄存器AR1,在加载到地址寄存器和间接寻址之间,不能存在上述块参数的存取操作。否则,必须在存取前保存AR1中的内容,并在存取后重新加载它。
比如加载一个指针到AR1,并使用地址寄存器间接寻址,还需要加载结构组件Motor.Act的值,则在加载Motor.Act之前,需要保存DB寄存器和地址寄存器AR1中的内容。在加载后,再恢复寄存器的内容
可以将一个值按顺序添加到地址寄存器中,比如在程序循环中,每一次循环地址值都要增加。可以在语句中将该值定义为常量(作为区内指针),或者定义为累加器1的右边字中的内容。地址寄存器(区内或跨区)中的指针类型和地址区是保留的(未定的)。
1.使用指针加
语句+AR1 P#y.x和+AR2 P#y.x将一个指针添加到指定的地址寄存器。注意,使用这些语句,区指针的值为P#4095.7。如果累加器中的值大于P#4095.7,该数值就译码为以二进制补码表示的定点数并且被减去。
比如,一个数据区和一个字值进行比较。如果比较值大于数据区中的值,则存储器位被设为“1”,否则设为“0”。
OPN DB 14;
LAR1 P#DBX2 0.0;
LAR2 P#M10.0;
LQuantity_Data;
Loop: T LoopCounter;
L ComparisonVa1;
L W[AR1,P#0.0];
>I ;
= [AR2,P#0.0];
+AR1 P#2.0;
+AR2 P#0.1;
L LoopCounter;
LOOP Loop;
2.使用累加器中的值加
语句+AR1和+AR2将累加器1中的数值的译码为INT类型,使用正确的符号将其扩展为24位,并把它与地址寄存器的内容相加。这样,指针被简化。超出字节地址的范围(0~65535)也没有更深的影响:其位将被“截断”(如图1所示)。
注意:位地址加载到第0位~第2位。如果要增加累加器1中的字节地址,必须从第3位开始加(将数值左移3位)。
图1 添加到地址寄存器
举例:在数据块DB 14中,如果要删除16字节,且这些字节的地址是根据存储器双字MD 220中的指针和存储器字节MB 18中的一个(字节)偏移量计算出来的,那么在与AR1相加之前,必须调整MB 18的内容(SLW3)。
OPN DB 14;
LAR1 MD 220;
L MB 18;
SLW 3;
+AR1 ;
L 0:
T DBD[AR1,P#0.0];
T DBD[AR1,P#4.0];
T DBD LAR1,P#8.0];
T DBD[AR1,P#12.0];
注意:使用位格式填充较大的数据区时,系统功能SFC 21 FILL是有效的。
广西西门子S7-1500PLC模块代理(量大从优)