甘肃西门子S7-1500PLC模块代理(量大从优)

STEP 7功能块中的参数存储
编辑器把功能块的块参数存储到功能块的实例数据块中。在功能块的调用中,编辑器在块调用之前产生语句序列,把实参的值复制到实例数据块中,在调用后从实例数据块将其返回到实参中。在查看编译过的块时看不到这些语句序列。只能通过所占用的存储空间才能间接地注意到。
在实例数据块中,块参数可以存储为一个值、一个16位的数字,或一个指向实参的指针(如表1所示)。当存储为一个值时,所需的存储器取决于块参数的数据类型。数字占用2字节,指针占用6字节(DB指针)或10字节(ANY指针)。
表1 在功能块的情况下的参数存储
块参数、实例数据赋值和实参的关系在图1中给出。当把复杂类型的实参复制到实例数据块(输入参数)或返回到实参时(输出参数),编辑器使用系统功能SFC 20 BLKMOV,功能的参数建立在所调用块的暂态局部数据区中。
图1 功能块中的块参数传递
如果参数是输入参数或输入/输出参数,则在“实际”FB调用之前,实例数据块中保存为一个值的块参数,将使用语句序列实现复制操作。如果参数是输入/输出参数或输出参数,则复制操作在调用之后进行。因此,只能对输入参数进行检测操作和输出参数进行写操作的规律同样适用,比如,如果将一个(新的)值传送到输入参数,实参的当前值将会丢失。如果加载到输出参数,则加载的是实例数据块中的一个(旧的)值,而不是实参中的值。
因为块参数存储在实例数据块中,故在每次调用功能块时不需要初始化。如果没有设定初值,程序将使用输入或输入/输出参数的“旧”值,或从程序后面的其他位置中获取输出参数的值。在功能块外部,可以使用与存取全局数据块中变量相同的方式来存取实例数据块中的变量(使用块参数的符号名或块参数的名称)。同时也适用于静态局部数据。
如果在ANY参数中应用数据类型为ANY的暂态局部变量,编辑器将会把变量的内容复制到实例数据块的ANY指针中(块参数中)。
位于功能和功能块中的块参数的存储方式是不同的。作为用户,不必注意这些,可以用同样的方式编程这两种块类型的块参数。然而,这些差别对于块参数直接存取是非常重要的。
编辑器把功能中的块参数作为跨区的区指针,保存存和它自身调用语句一致的块代码中,所以每一个块参数需要一个双字的存储器空间。根据数据类型和声明类型的不同,指针可能指向实参自身,或者指向所调用块(由编辑器建立)的暂态局部数据中的实参的复制,或指向所调用块的暂态局部数据中的另一个指针,而这个指针才指向实参(如表1所示)。例外:对于参数类型TIMER、COUNTER和BLOCK_xx,指针是一个16位的数字,位于块参数左边的字中。
表1 功能中的参数存储
对于基本数据类型,块参数直接指向实参(如图1所示)。但是,当把区指针作为块参数时,由于它不能指向数据块中的任何常量或地址,因此在编译阶段,编辑器把数据块中的常量或(完整地址)实参复制到所调用块的暂态局部数据中,并使区指针指向它。这个参数区被称为V(前述块的暂态局部数据,V区)。
当块参数为输入参数或输入/输出参数时,向V区的复制操作发生在实际FC调用之前。而当块参数为输入/输出参数或输出参数时,复制操作在调用之后进行,功能值也是如此。因此,只能对输入参数进行检测操作、对输出参数进行写操作的规律同样适用。如果将一个值传送到带有完整寻址的数据地址的输入参数,则该值将存储在前述块的暂态局部数据中,并且它将会被遗忘,因为在数据块中没有其他的针对这个“实际”变量的复制操作。
图1 功能中的参数传递
加载一个相关的输出参数与此相似:既然从数据块的“实际”变量到V区的复制操作没有发生,此时将从V区加载一个(不确定的)值。
因为复制操作,如果具有完整寻址的数据地址被视为或者可以被视作实参,在块中就必须使用基本数据类型的定义值覆盖输出参数和功能值。如果不给输出参数赋值(比如,通过提前跳出这个块或跳过程序所在位置),局部数据就不会被初始化。于是,它的值将保持为一个在块调用前“出现的”值,输出参数将会被这个“未定义的”值所覆盖。
对于复杂数据类型(DT、STRING、ARRAY、STRUCT以及UDT),实参将存储在数据块或V区中。因为区指针不能指向数据块中的实参,在编译时编辑器将会创建一个DB指针。然后指针将指向数据块(DB NO.<>0)中的实参或指向V区(DB NO.=0)。在“实际”FC调用之前,将为所有已声明的类型创建DB指针。
参数类型为TIMER、COUNTER和BLOCK_xx的块参数包含了一个数字(32位的参数中左对齐的16位)而不是区指针。
参数类型POINTER的处理和复杂数据类型的方法完全一致。
对于数据类型ANY,编辑器在V区中创建一个10字节的ANY指针,指针可能指向任何变量。其原理和复杂数据类型相同。
如果要应用到ANY类型的块参数,或者是暂态局部数据中数据类型为ANY的实参,编辑器将会出现例外。此时编辑器不再创建ANY指针,而是令区指针(块参数)指向实参(此时,ANY指针可以在运行时修改)。
暂态局部数据(L栈)中的变量存储和全局数据块中的相一致。赋值通常从(相对的)字节0开始。注意,前20字节被启动信息占用。即使在不使用启动信息时,也必须声明前20字节(即使是一个只有20字节的字段)。
编辑器自身也要使用局部数据,比如在块调用中传送参数时。编辑器使用象征性(symbolically)声明的暂态局部数据,并且按照它们声明或使用的顺序来使用自身的暂态局部数据。在此不考虑寻址的暂态局部数据。所以在不知道编辑器使用了哪个局部数据时,就可能会发生重叠。如果需要或必须使用寻址存取局部数据,就可以在暂态局部数据声明的个位置声明一个字段,字段要保留必需的字节(字、双字)数。然后就可以在这个字段区使用寻址。对于组织块,在20字节的启动信息之后再定义字段。
图1中的例子给出了组织块中暂态局部数据的赋值。紧跟在启动信息后面的字段Ldata开始于字节LB 20,并在本例当中一直延伸到字节LB 35。编辑器自身的局部数据不占用这个区域,所以在此区域可以使用寻址。
在功能或功能块中将忽略启动信息。如果需要使用暂态局部数据以实现寻址,可以把该区域作为这些块的第~个变量来使用,然后它起始于字节LB 0。
甘肃西门子S7-1500PLC模块代理(量大从优)