整个功能块真的存储在 RETAIN 内存中吗?
Is the whole function block really stored in RETAIN memory?
在 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 保留。
在 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 保留。