You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:05:19