为什么函数会偶尔在OUT参数中产生错误的返回值?当指定输入输出参数时需要注意些什么 ?

描述:
本条目包含了以下主题内容:n

  1. 函数的OUT参数中的偶发错误返回值n
  2. 基本输入和输出参数的提供n
  3. 形式参数和实际参数间的区别
  1. 函数的OUT参数的偶发错误返回值

STEP 7在函数(FC)的OUT参数中出现这种情况可能由于以下原因:n

根据IEC1161,FC是不带内存的块,不象FB,FC没有任何静态变量。 块参数保存在函数和功能块中的方式不同。n

静态 的和临时的本地数据之间的区别:n

  • 与操作数相关的静态本地数据存储在FB的情景数据块中。块关闭后静态本地数据不会丢失。n
  • 临时本地数据没有保存在情景数据块中,而是保存在CPU系统内存的本地数据栈中并且不能超出周期限制使用。这种临时本地数据是用作结果的中间存储的 ,并只能在程序编辑时使用。数据在块关闭后会被丢弃。

CPU内部操作或FC参数存储的表示

临时本地数据是按照声明的顺序保存在本地数据堆栈中,与数据类型相一致:
n

L Input
T LW"1" 变量初始化
L InOut
T LW"3" 变量初始化
CALL FC
L LW"2"
// 变量初始化不在这里执行!
// 用户必须保证OUTPUT变量
// 在每个FC周期中描述:
T Output
L LW"3"
T InOut

当FC调用完成,编辑器将块参数以越域指针保存在块代码中。每个块参数需要一个双字内存空间:n

  • P# LW"1" INPUT (E,A,M)n
  • P# LW"2" OUTPUT (E,A.M)n
  • P# LW"3" IN_OUTPUT (E,A,M)

编辑器在块参数传送过程中使用临时本地数据。指针根据数据类型和声明类型指示当前参数:

L LW"2"
T Output
L LW"3"
T InOut

与功能块相反,函数仅涉及到本地数据范围内的数据存储而“不保存”。因此有必要在函数被调用时进行数据的分析/分配。n

为什么函数会偶尔在OUT参数中产生错误的返回值?当指定输入输出参数时需要注意些什么 ?
图 01n

操作系统在FC调用中使用本地数据堆栈作为此类型参数传送的结果。 因此,用户不能在配置中拥有完整的栈。n

  1. 基本输入输出参数的提供

要区分给函数接口提供基本形式参数(例如数据类型BOOL,BYTE,WORD或DWORD)的两种方式。n

  1. 调用块为基本形式参数分配过程映像或本地数据堆栈(L堆栈)中的一个标记,一个输入或输出。
    这种情况下,函数代码直接使用越域指针操作这些基本实际参数(例如P#E0.0,P#M0.0)。n
  2. 基本形式参数提供为常数或一个数据块元素。
    在这种情况下,实际参数值在函数被调用前拷贝到调用块的L堆栈中。函数代码使用指定调用块本地数据范围的越域指针进行操作。
    请注意输出参数没有初始化,并且输入参数没有被删除。因此,要确保在这种情况下输入为只读而输出在每个周期中写入。在象“S”或“R”的命令中,信号仅根据逻辑操作的结果写入。这样,这些命令应被赋值符“=”取代或应在查询前对值进行初始化。
    如果不能保证每个周期中都写入值,应该使用IN/OUT参数。

补救措施:

  • 如果在FC调用过程中,给OUTPUT变量分配了一个DB地址,并且此OUTPUT变量需要在FC中设置或复位为所定义的状态,调用会提示S或R命令有=命令的作用。原因在于FC调用过程中分配了DB地址的OUTPUT变量在调用过程中是通过L堆栈供给的。这意味着如果R或S命令的条件不具备,那么OUTPUT变量就不再被描述。因而,DC单元由本地堆栈地址中的随机值供给。为了补救,建议用IN/OUT变量代替OUTPUT变量。这就是说在调用前本地堆栈地址被DB地址的内容重新组态。n
  • 在FC重复调用和/或DB变量用作当前值的情况下也会发生 情景调用。关于这种情况请参考STEP 7的在线帮助“避免调用块时的错误”。不论何时调用块,FC中的OUT参数必须被周期性的描述。

关于这一主题的更多信息可在以下关键字的在线帮助中找到:n

  • 避免调用块时的错误n
  • 参数传送过程中允许的数据类型
  1. 形式参数和实际参数的区别

形式参数用来定义数据类型,而实际参数是关联到当前值的。n

示例:

形式参数 实际参数
CALL FC1
on := E0.3
off := A4.5
  • 形式参数是实际参数的通配符。实际参数在块调用过程中被分配给形式参数。n
  • FC的形式参数必须被分配给实际参数。n
  • 当FB被调用时实际参数不需要分配给FB。如果在FB被调用时没有分配实际参数给它,在上次调用中写入情景数据块的值就用作实际参数。n
  • 块所使用的输入、输出和IN_OUT参数是作为指针被保存到调用代码块的实际参数中。这些指针对用户来说是不可见的。n
  • 输出和IN_OUT参数不能被赋值为常值因为常值无法写入。

形式参数可作为实际参数分配给绝对地址,符号名或常值。但是有些限制(见下表)。n

(*) 允许赋值
(-) 不允许赋值n

基本数据类型:

声明类型 绝对地址 符号名(在符号表中) 本地块符号 常数
Input * * * *
Output * * * -
IN_OUT * * * -

复合数据类型:

  • DATE_AND_TIME
  • STRING
  • ARRAY
  • STRUCT
  • UDT
  • FB
  • SFB
声明类型 绝对地址 DB元素的符号名称(在符号表中) 本地块符号 常数
Input - * * -
Output - * * -
IN_OUT - * * -

关键字:
参数传送
DB寄存器
实际参数
代码块

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc339634.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日 下午12:03
下一篇 2021年4月12日 上午12:00

相关推荐

发表回复

登录后才能评论