为什么编译器会对幂函数语句发出消息 “Range of a standard function argument exceeded (15:16496)”?

描述:
当编程幂函数语句时,如果幂的底为零则收到消息 "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

  1. 判断 OK 标记。关于此主题的信息可以在 Internet 中条目号为 21834306 的 FAQ "Evaluation of the OK flag" 中找到。
    n
  2. 编程一个条件,使得数值零不能用作底数 (示例图 01)。

    为什么编译器会对幂函数语句发出消息 "Range of a standard function argument exceeded (15:16496)"?
    图 01

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

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

相关推荐

发表回复

登录后才能评论