STEP 7 (TIA Portal) 在内部传送数据可以使用指针方式或者复制方式,取决于参数的传送区域和数据类型。
如果数据作为副本传送(值传递),块调用时操作数的值将被复制到被调用块的 Input 参数。例如,FB 的副本是存储在背景数据块,FC 的副本是存储在块堆栈区。
如果使用结构型变量(像数据类型ARRAY,STRUCT,STRING,...)作为块参数,那么 STEP7 是以指针传递数据的(引用传递)。
以下表格对比了两种数据传递方式之间的不同之处。
数据作为副本传递(值传递) | 数据作为指针传递(引用传递) |
---|---|
块调用时,块使用的是参数的值,并不直接使用参数。 | 块使用参数所指向的内存地址。 |
写访问只改变副本,而不会改变块中的值。 | 写访问直接改变参数。 |
*副本需要额外的内存。 | 因为没有副本,所以不需要额外的内存。 |
更多的信息请查阅 Programming Guideline for S7-1200/1500 90885040。
*备注
在使用 InOut 参数的情况下,即便副本并没有在块中被修改,在块结束的时候操作数的副本也将写入操作数。这意味着在块运行期间,操作数(或操作数的一部分)的异步改变(通过 HMI 写访问或者更高优先等级的运行系统)将会丢失,因为块被调用后,操作数的值会被覆盖。
补救方法
在共享数据块中定义变量,并且使用共享DB块变量作为块参数。
在 S7-1200/S7-1500 块调用中,被传递的变化的数据存储在 InOut 参数中,那么以上所述内容也会发生。例如:
一个有 “优化的块访问” 选项的功能块,调用一个没有 “优化的块访问” 选项并且包含一个使用 PLC 数据类型作为 InOut 参数的功能块。
备注
不要使用M存储区的原因如下:
- 由于兼容性的问题,M存储区并没有被优化,所以优化的全局DB比M存储区更好用。
- 每种控制器的M存储区大小不一样,所以使用共享 DB 块就可以随意使用在程序中。
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc322489.html