整个功能块是否真的存储在 RETAIN 内存中?

问题描述

在 CodeSys manual 中,我们可以读到:

"如果将功能块中的局部变量声明为 RETAIN,则 CODESYS 会将该功能块的完整实例存储在 Retain 范围内(该功能块的所有数据);但是,只有声明的 RETAIN 变量是"

但是真的有人测试过吗?我创建了一个只有以下变量的功能块:

VAR
   Test1:   ARRAY[1..50] OF UINT;   //100 bytes
END_VAR
VAR RETAIN
   Test2:   ARRAY[1..50] OF DINT;   //200 bytes
END_VAR

我的程序只实现了这个功能块的一个实例。在运行时使用 SIZEOF 显示功能块大小为 312 字节

现在,如果我右键单击设备,然后转到“设备内存信息”,我的保留数据的大小仅为 203 字节。

如果功能块的完整实例存储在保留范围内,我希望保留数据大小与功能块大小相同(312 字节),但事实并非如此,它只有 203 字节(保留数据的大小)。手册不正确吗?

解决方法

我可以说这是真的。我需要的第一个项目保留在 FB 中,在需要很多很多实例(FB 并不“简单”)后,我的内存不足。一旦我从 FB 中删除了保留并链接到外部保留变量,我的问题就消失了。那天我了解到文档警告我。

但我可以说,在那种情况下,我正在制定一个解决方案,其中包含大约 100 个独特且复杂的 FB,每个 FB 都存储一个用户条目。我做了几个简单得多的其他项目,我只是让编译器把整个 FB 都保留了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...