描述:
当编程幂函数语句时,如果幂的底为零则收到消息 "Range of a standard function argument exceeded"。其它语句编程,例如 "C:= 2.0**2.0;" 或 "C:= 2.0**0.0;" 等都编译无错 (0 个错误,0 个警告)。n
如果使用的变量是实数型 (REAL) 而不是浮点型,例如语句 "C:= a**b;",则 S7-SCL 代码编译无错;但是对于 C 变量,如果变量 "a" 的值为零,则运行时期间显示值 "NaN" (Not a Number,“非数值”)。n
S7-SCL 编译器用公式 "EXP(b*LN(a))" 来计算幂 a**b,这就是为何在 S7-SCL 中数值零不能用作底数的原因。当计算常数时会出现 "Range exceeded ..." 消息,这是因为没有定义 LN(0)(负无穷),对于命令序列 "a**b"(表示 ab),LN(0) 会给出一个 OK 标记 = False,并且值为 NaN (非数值)。n
根据编译器的编程,存在下表所示的一些例外情况。
n
计算幂函数的示例和例外 | |
(-10)**0 | 可以 |
(-10)**0.0 | 不可以 |
(-10)**2 | 可以 |
(-10)**2.0 | 不可以 |
(-10)**3 | 不可以 |
0**0.0 | 可以 |
0**0 | 不可以 |
0**2 | 可以 |
0.0**2 | 可以 |
0**3 | 可以 |
0.0**3 | 不可以 |
补救措施:
对于在程序执行过程中计算 "C = ab"时无法避免底数 "a" 变为零的情况,有两种补救措施:n
- 判断 OK 标记。关于此主题的信息可以在 Internet 中条目号为 21834306 的 FAQ "Evaluation of the OK flag" 中找到。
n - 编程一个条件,使得数值零不能用作底数 (示例图 01)。
图 01
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc338398.html