CODESYS中含RETAIN局部变量的功能块,是否整个实例都存于RETAIN存储区?
CODESYS 中RETAIN声明规则的实测偏差疑问
在CODESYS官方手册中可查阅到如下规则说明:
如果在功能块中将某局部变量声明为RETAIN,CODESYS会将该功能块的完整实例存储在RETAIN区间(即功能块的所有数据);但仅声明为RETAIN的变量会被当作RETAIN变量处理。
针对该规则,有开发者开展了对照实测,过程如下:
- 编写测试用功能块,块内包含两组独立声明的变量:
VAR Test1: ARRAY[1..50] OF UINT; // 占100字节 END_VAR VAR RETAIN Test2: ARRAY[1..50] OF DINT; // 占200字节 END_VAR - 主程序中仅对该功能块实例化1次,运行状态下通过
SIZEOF函数测得该功能块的总内存占用为312字节 - 打开设备右键菜单下的「Device Memory Info」页面,读取RETAIN存储区的总占用值,实测数值仅为203字节
按照手册描述的规则推演,只要功能块内部存在RETAIN类型的局部变量,整个功能块的所有数据都会被纳入RETAIN存储区,对应的RETAIN区总占用应该和功能块本身的312字节大小匹配。但实测结果显示,RETAIN区的占用值仅和块内RETAIN变量的大小接近,并未把非RETAIN的普通变量Test1的内存空间计入RETAIN统计。这一结果和手册描述存在明显出入,由此产生疑问:手册的规则说明是否存在表述误差?
内容的提问来源于stack exchange,提问作者Dawid Rutkowski
相关产品推荐
相关产品推荐

