params、saved及session类型DML声明的局限性及相关技术问询
关于PLC变量存储与大数组处理的问题解答
1. params、saved及session声明的可处理数据量
这里的params(VAR_PARAM)、saved(VAR_SAVED)、session(VAR_SESSION)对应CODESYS等PLC开发环境中的变量存储类型,数据量限制如下:
- VAR_PARAM(参数变量):作为FB/FC的参数,单参数数组的大小受CPU调用栈剩余空间限制(小型PLC栈通常为几KB到几十KB),整体还受CPU装载内存的程序存储上限约束。
- VAR_SAVED(保持型变量):数据量直接由CPU的**保持内存(Retentive Memory)**大小决定,小型PLC可能仅几KB,中大型PLC可达几十MB,超出上限会导致编译报错或保持功能失效。
- VAR_SESSION(会话变量):会话周期内的临时存储,数据量受CPU工作内存的临时区域限制,单会话总数据量通常在几KB到几十KB级别,具体依赖CPU型号。
2. 对性能及内存分配/消耗的影响
VAR_PARAM
- 性能:值传递(基本类型/数组)会在调用时触发全量数据拷贝,数组越大耗时越长;引用/指针传递仅传递内存地址,性能损耗可忽略。
- 内存:值传递会在栈上分配参数副本,大数组易引发栈溢出;引用传递仅占用栈上4/8字节的地址空间,内存消耗极低。
VAR_SAVED
- 性能:保持型变量存储在非易失性内存或带电池备份的RAM中,读写速度比普通工作内存慢10~100倍,频繁读写会拉长程序扫描周期。
- 内存:占用静态分配的保持内存空间,不占用栈;但内存一旦分配无法动态调整,闲置空间无法复用。
VAR_SESSION
- 性能:会话变量位于工作内存临时区,读写速度与普通临时变量一致,性能损耗极低;会话结束后自动释放,无需手动管理。
- 内存:属于栈或动态分配内存,会话创建时分配、结束时释放;大数组可能导致栈溢出或工作内存碎片化。
3. 10k-100k元素的静态/动态数组处理方法
静态数组
- 用
VAR_GLOBAL或VAR_GLOBAL RETAIN存储:分配在工作内存静态区,不占用栈,读写速度快;若需保持数据,需确保不超过保持内存上限。 - 分块处理:将大数组拆分为多个小数组,每次仅加载/处理当前需要的块,减少单次内存占用与拷贝开销。
- 指针访问:通过指针直接操作数组内存,避免值传递时的全数组拷贝,大幅提升性能。
动态数组
- 内存池分配:提前申请一块连续的大内存区域,动态数组从内存池中获取空间,减少内存碎片化,提升分配/释放效率。
- 分块链表结构:采用链表或分块数组替代超大连续数组,降低内存分配失败概率,适合元素频繁增删的场景。
- 非保持型动态内存:无需保持数据时,优先使用工作内存的动态分配区,避免占用宝贵的保持内存;注意程序结束时手动释放,防止内存泄漏。
通用优化技巧
- 避免循环中频繁读写整个数组,仅操作必要元素;
- 大数组传递一律使用引用/指针,禁止值传递;
- 支持DMA的CPU可利用其批量读写数组,降低CPU占用率。
内容的提问来源于stack exchange,提问作者Aleks
相关产品推荐
相关产品推荐

