描述:
本条目包含了以下主题内容:n
- 函数的OUT参数中的偶发错误返回值n
- 基本输入和输出参数的提供n
- 形式参数和实际参数间的区别
- 函数的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
|
编辑器在块参数传送过程中使用临时本地数据。指针根据数据类型和声明类型指示当前参数: |
L LW"2" |
T Output |
L LW"3" |
T InOut |
与功能块相反,函数仅涉及到本地数据范围内的数据存储而“不保存”。因此有必要在函数被调用时进行数据的分析/分配。n
操作系统在FC调用中使用本地数据堆栈作为此类型参数传送的结果。 因此,用户不能在配置中拥有完整的栈。n
- 基本输入输出参数的提供
要区分给函数接口提供基本形式参数(例如数据类型BOOL,BYTE,WORD或DWORD)的两种方式。n
- 调用块为基本形式参数分配过程映像或本地数据堆栈(L堆栈)中的一个标记,一个输入或输出。
这种情况下,函数代码直接使用越域指针操作这些基本实际参数(例如P#E0.0,P#M0.0)。n - 基本形式参数提供为常数或一个数据块元素。
在这种情况下,实际参数值在函数被调用前拷贝到调用块的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
- 参数传送过程中允许的数据类型
- 形式参数和实际参数的区别
形式参数用来定义数据类型,而实际参数是关联到当前值的。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