有类型和无类型常量
常量值有指定的表示法,具体取决于数据类型和数据格式,分为有类型和无类型的表示法。
数学函数中运算有类型和无类型常量一定要慎重,否则可能会发生不需要的隐式转换,从而导致生成不正确的值。看下面的例子:
DInt类型: Variable_DINT := Int# 2 +50000;
计算结果: Variable_DINT= -15534;
原因分析:有类型常量的数据类型决定了无类型常量的数据类型。 这意味着加法是在 INT 数据类型区域中执行。 在第一步中,无类型常量 50000 将隐式转换为 INT 数据类型。 但这种转换会导致生成负值 (-15536)。 然后该值将添加到有类型常量 (INT#2)。 结果是 -15534。由于将写入加法运算结果的变量被声明为 DINT 数据类型,因此数字 -15534 将隐式转换为 DINT 数据类型,并写入到变量“Variable_DINT”。 但结果仍为负数。
解决方案
- 将两个常量都采用有类型常量。 如果两个常量都采用有类型常量,较长的数据类型将确定计算结果。
Variable_DINT := Int# 2 +DInt# 50000;在此计算操作中,将有类型常量 INT#1 与有类型常量 DINT#50000 相加。常量 INT#2 将转换为 DINT 数据类型,并且两个常量的相加将在 DINT 数据类型区域中执行,最终得到正确的结果。 - 另一种方法是两个常量都采用无类型常量。 如果两个常量都采用无类型常量,它们在当前 CPU 上将被解释为最宽的可能数据类型。 这意味着在 S7-1500 系列 CPU上,这两个常量都解释为 LINT 数据类型。
Variable_DINT := 2 +50000;常量 2 和 50000 将解释为 LINT 数据类型,相加的结果将再次转换为 DINT 数据类型,最终也能得到正确的结果。
常量设置类型要慎重!!