使用持久变量保存数据
当应用程序重新加载、下载、热启动或冷启动后,持久变量保持其值。
控制器上需要一个特殊的非易失性存储区来延长使用寿命,例如 NVRAM 或 UPS。将数据备份到此类存储不需要任何额外的时间,这比使用 Persistence Manager 保留数据更具优势。如果控制器不提供硬件支持,则数据通常存储在文件中。如果您正确关闭控制器,数据将被保留。但是,如果发生电源故障或“拔掉插头”,数据将会丢失。
行为
保值
不受控制的终止
通过调用命令热启动 重新设置温暖
调用命令冷启动 冷复位
再次下载应用程序
加载引导应用程序
重新初始化
调用命令 重置原点
因此,仅当您将控制器重置为交付状态时,才会重新初始化持久变量,例如,如果您使用命令
选择。另一方面,如果您再次加载应用程序,则尽可能保留持久化数据。这取决于变化的深远程度。更改应用程序名称总是会导致完全重新初始化。对实现的更改永远不会导致重新初始化:数据持久性已完全保留。仅当现有变量是持久的时,当您更改声明以使持久变量列表保持一致时,对声明的更改才会导致新变量的初始化。当您添加新变量或删除现有变量时就是这种情况。如果您编辑和更改先前声明的持久变量的标识符或数据类型,可能会出现不一致。
下载应用程序或加载引导应用程序时的机制
如果在持久性编辑器中编辑变量列表,则会导致变量列表不会像编辑器中显示的那样保存,而是在保存之前自动进行后期编辑。
在后处理中,您删除的变量将替换为具有相同内存占用的占位符变量。这意味着以下变量将其地址保留在过程映像中。此外,您添加的任何变量都会移至列表底部。后处理可以抵消可能导致持久性丧失的更改。但是您会创建占用额外内存的间隙。
加载应用程序时,变量列表的 CRC 值和列表的长度(变量数)存储在控制器上。再次加载应用程序时,会将新的测试值与控制器上当前的测试值进行比较。然后连续比较变量列表直到指定的长度。如果您编辑了声明(例如,名称或数据类型),则会重新初始化该变量。否则它的值被保留。再次加载应用程序时, CODESYS 检查持久性编辑器中声明的变量列表是否仍然与控制器上已有的变量列表一致。
当变量本身没有显着变化时,该机制运行良好。对标识符和数据类型的过度更改会继续导致重新初始化和持久性丢失。因此,如果您预计根据您的应用程序需要频繁更改,则通常不建议使用此类列表。此外,在数据类型更改后发生在线更改的情况下,持久变量的健壮性不如具有正常生命周期的变量。
基本上,一段时间后,您应该清理间隙的变量列表和命令 重新排序列表并清理空白 跑步。但是,在清理之后,列表不再匹配控制器上的列表,并且您触发了所有持久变量的初始化。所有变量的持久性都丢失了。
提示
在 V3.5 SP1 之前的版本中,持久性编辑器中的更改总是会导致重新初始化。
通过配方管理器保存数据
为了清理全局持久变量列表而不丢失其持久性,您可以使用配方管理器将数据保存在配方中。在配方管理器中生成持久变量列表的所有变量的列表,同时控制器将它们的当前值保存为配方。然后选择命令 重新排序列表并清理空白 然后重新下载。如果你现在的命令 从配方中恢复值 被选中时,配方中保存的值被恢复。
更改持久变量列表中的现有声明
如果更改变量的名称或数据类型,这将被解释为新的声明,并导致在下一次在线更改或加载应用程序时重新初始化变量。对于复杂的数据类型,当添加新组件时,或者当您将变量类型从 INT
到 UINT
例如,在使用过的结构的深度。
基本上,复杂的用户定义数据类型不适合在持久变量列表中进行管理,因为即使是很小的更改也会导致变量被所有组件初始化。
在实例路径中双重分配内存
您可以在功能块或程序中保留全局变量或本地声明的变量。为此,请将关键字添加到声明中 PERSISTENT
.此外,在持久化全局变量列表中添加该变量的实例路径。为此,请在持久性编辑器中选择命令 添加所有实例路径.
通过以下机制保证持久性:
确定在哪些循环任务中访问该变量。
在第一个循环任务结束时(在每个循环中),变量被复制到持久全局变量列表中。
重新启动控制器后,会将值从持久变量复制到普通变量。
这种机制的缺点是在声明点和实例路径点都分配了内存。这个持久变量占据 双倍的 储存空间。此外,数据会在每个周期中复制到两个位置。这可能很耗时,尤其是在涉及大型结构化值时。
持久功能块实例的内存位置
功能块实例始终完全在内存中。这是必要的,以便相同的代码可以在不同的实例上工作。如果现在功能块中只有一个变量 PERSISTENT
被标记时,功能块实例与所有变量一起完全存储在剩余内存中,尽管只有一个变量被视为持久变量。但是,非易失性存储器的可用程度与主存储器不同。
具有指向 SRAM 中实例的指针作为变量的功能块不存储在安全存储器中。
进口于 CoDeSys V2.3-项目
当你打开 CoDeSys V2.3 将其导入到项目中 CODESYS V3,持久变量的声明不会被保留。您必须修改声明并在单独的持久全局变量列表中重新创建它们。