您现在的位置是:首页 > PLC技术 > PLC技术
STEP 7功能中的参数存储
来源:艾特贸易2018-04-28
简介位于功能和功能块中的块参数的存储方式是不同的。作为用户,不必注意这些,可以用同样的方式编程这两种块类型的块参数。然而,这些差别对于块参数直接存取是非常重要的。 编辑
位于功能和功能块中的块参数的存储方式是不同的。作为用户,不必注意这些,可以用同样的方式编程这两种块类型的块参数。然而,这些差别对于块参数直接存取是非常重要的。
编辑器把功能中的块参数作为跨区的区指针,保存存和它自身调用语句一致的块代码中,所以每一个块参数需要一个双字的存储器空间。根据数据类型和声明类型的不同,指针可能指向实参自身,或者指向所调用块(由编辑器建立)的暂态局部数据中的实参的复制,或指向所调用块的暂态局部数据中的另一个指针,而这个指针才指向实参(如表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指针可以在运行时修改)。
(作者稿费要求:需要高清无水印文章的读者3元每篇,请联系客服,谢谢!在线客服:)
点击排行
