可编程控制软件资料中,输入输出参数的名称还不足以说明变量怎样传递。CODESYS把VAR_IN_OUT定义为POU接口中的形式引用参数:调用时接收实际变量的引用,而不是生成该值的一份副本。对于整理程序接口说明的人,最先需要分清的因此是两个名字所面对的数据对象,而不仅是参数能读还是能写。[1]

形式变量属于被调用POU的接口,实际变量则是调用时传入的对象。帮助页解释,运行时传参不生成值副本,引用内部保存着实际值所在的内存地址。这个关系意味着POU内看到的参数,并非与原变量互不相关的新数据。本文只说明文档中的引用语义,不给出变量声明、地址设置或控制程序。[1]

写入后的结果使这一区别更加明确。文档说,在POU内部写VAR_IN_OUT变量,会影响传入的实际变量;退出POU时,已经作出的修改仍被保留。这里的保留指向原变量受到的更改,并非在介绍断电、下载或存储器复位的保持机制。不能因为句子中出现retained,就把一次调用的写回关系扩展成跨这些事件的数据保证。[1]

引用也不意味着这个接口可以从任何位置直接访问。原页明确,不能在实例外经“功能块实例名.变量名”的形式直接读写VAR_IN_OUT;该方式适用于VAR_INPUT与VAR_OUTPUT。于是,POU内部可以读写引用对象,与实例外能否用某种名称路径访问,是两个独立限制,不能用前者代替后者。[1]

普通VAR_IN_OUT的实参还有类别条件。该页不允许直接传入字面常量或bit变量,并在后续代码中说明相关情形。本文保留这项限制,不转述绕行示例。其含义是,只有一个看似相同的值还不够,接口还关心传入者是什么对象;引用变量与写在文字中的固定值,在文档语义中并未被视为同一种实参。[1]

VAR_IN_OUT CONSTANT进一步把引用与写权限分开。该参数允许传入STRING或WSTRING类型的变量或字面常量,参数可以读取但不能写入。CONSTANT在这里没有把引用改成值复制,而是使这类引用成为只读。帮助页还明确,字符串常量的长度不依赖形式VAR_IN_OUT CONSTANT变量所写长度;这项说明属于该只读字符串参数的语境。[1]

因此,接口资料可以分别回答三件事:传参是否复制值,内部写入影响谁,哪种参数只许读取。用一个“输入输出”的译名包办全部含义,会遗漏其中至少一层。本篇依据CODESYS连续定义和Usage段,首次发布日期未知,不采用另一段疑似VAR_OUTPUT CONSTANT笔误,也不执行示例或为生产项目判断兼容与控制安全。

资料:[1] https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_vartypes_var_in_out.html

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。