CODESYS V3中使用指针(pointer)和引用(reference)的优势是什么?
CODESYS功能块选择指针/引用而非数组接口的核心原因
你之前使用的西门子TIA Portal、欧姆龙Sysmac并非没有同类功能,只是IDE对底层逻辑做了深度封装,普通标准化开发场景不会向用户暴露这类低阶操作。CODESYS的定位更偏向灵活的跨平台定制开发,因此会开放指针、引用这类操作给开发者,供应商FB选择这类接口的原因主要有四点:
- 避免硬编码限制,提升功能块通用性
如果用数组作为FB的输入输出参数,必须在FB接口定义阶段就固定数组的类型、长度,比如定义ARRAY[1..50] OF INT的输入参数,后续就只能接入长度刚好为50的INT数组,参数不匹配就会直接报错。使用指针/引用的同时搭配数据长度参数,不管外部传入的数组是10个元素还是1000个元素,功能块都可以直接适配,不需要修改FB本身的接口定义,通用性大幅提升。 - 降低内存开销,提升运行效率
数组作为值参数传入FB时,会默认把整个数组的内容全量拷贝到FB的本地内存区,当数组长度较大(比如上万个元素的采集数据)时,拷贝动作会占用额外的扫描周期时间,还会浪费PLC的内存空间。使用指针/引用时,功能块直接操作原始数据源的内存地址,完全没有数据拷贝的动作,运行效率更高,非常适合运动控制、高速数据采集这类对扫描周期要求严苛的场景。 - 适配非数组类连续数据块
部分场景下需要处理的数据并非标准数组结构,比如多结构体拼接的连续内存、从现场总线/外设直接读取的原生内存缓冲区,这类数据没法直接作为数组参数传给FB。只要通过指针传入数据块的首地址,功能块就可以直接读取解析内容,灵活性远高于固定类型的数组接口。 - 支持动态数据操作需求
数组的长度是编译阶段就固定死的,运行过程中无法调整,如果要实现不定长FIFO缓冲区、动态长度数据处理这类需求,固定数组完全无法实现。用指针配合CODESYS的__NEW/__DELETE动态内存分配指令,就可以实现运行时调整数据长度的操作,覆盖更多定制化开发场景。
注意:指针/引用操作存在内存访问越界的风险,参数传错可能直接导致PLC运行异常,供应商提供的封装FB一般已经做好了边界校验,使用时严格按照文档要求传参即可,不要随意修改内部逻辑。
内容的提问来源于stack exchange,提问作者MrUncles
相关产品推荐
相关产品推荐

