有类型和无类型常量的解释
常量是具有固定值的数据,其值在程序运行期间不能更改。常量在程序执行期间可由各种程序元素读取,但不能被覆盖。常量值有指定的表示法,具体取决于数据类型和数据格式。分为有类型和无类型的表示法。
建议在数学函数中不要混用有类型和无类型常量,否则可能会发生不需要的隐式转换,从而导致生成不正确的值。
编程示例
在以下编程示例中,可以看到使用有类型和无类型常量的运算。
1. 创建一个 SCL 函数块并将其命名为“FB_MathsFunctions”。
2. 在块接口的“Temp”部分声明“Variable_DINT”变量。
3. 编写以下程序代码:
Variable_DINT := INT#1 +50000;
在此数学运算中,将有类型常量 INT#1 与无类型常量 50000 相加。无类型常量 50000 在软件中将带黄色下划线,指示常量值超出了 INT 数据类型允许的范围。
要查看结果,请转至在线。
1. 通过右键单击“编译 > 软件(仅更改)”(Compile > Software (only changes) 命令执行此命令来编译 SCL 函数块“FB_MathsFunctions”。
2. 使用“下载到设备 > 软件(仅更改)”(Download to device > Software (only changes)) 命令下载块。
3. 转至在线并监视块。
有类型常量的数据类型定义加法的数据类型。这意味着加法是在 INT 数据类型区域中执行。 在第一步中,无类型常量 50000 将隐式转换为 INT 数据类型。但这种转换会导致生成负值 (-15536)。然后该值将添加到有类型常量 (INT#1)。结果是 -15535。由于将写入加法运算结果的变量被声明为 DINT 数据类型,因此数字 -15535 将隐式转换为 DINT 数据类型,并写入到变量“Variable_DINT”。但结果仍为负数。
1. 可能的解决方案
避免得到错误结果的一种方法是两个常量都采用有类型常量。如果两个常量都采用有类型常量,较长的数据类型将确定计算结果。
在“FB_MathsFunctions”SCL 函数块中编写以下程序代码:
在此计算操作中,将有类型常量 INT#1 与有类型常量 DINT#50000 相加。
要查看结果,请转至在线。
1. 通过右键单击“编译 > 软件(仅更改)”(Compile > Software (only changes) 命令执行此命令来编译 SCL 函数块“FB_MathsFunctions”。
2. 使用“下载到设备 > 软件(仅更改)”(Download to device > Software (only changes)) 命令下载块。
3. 转至在线并监视块。
常量 INT#1 将转换为 DINT 数据类型,并且两个常量的相加将在 DINT 数据类型区域中执行。
2. 可能的解决方案
避免得到错误结果的另一种方法是两个常量都采用无类型常量。如果两个常量都采用无类型常量,它们在当前 CPU 上将被解释为最宽的可能数据类型。这意味着在 S7-1500 系列 CPU上,这两个常量都解释为 LINT 数据类型。
在“FB_MathsFunctions”SCL 函数块中编写以下程序代码:\
在此计算操作中,将无类型常量 1 与无类型常量 50000 相加。
要查看结果,请转至在线。
1. 通过右键单击“编译 > 软件(仅更改)”(Compile > Software (only changes) 命令执行此命令来编译 SCL 函数块“FB_MathsFunctions”。
2. 使用“下载到设备 > 软件(仅更改)”(Download to device > Software (only changes)) 命令下载块。
3. 转至在线并监视块。
常量 1 和 50000 将解释为 LINT 数据类型,相加的结果将再次转换为 DINT 数据类型。
- 西门子博途:使用常量的示例 2024-11-23
- 西门子博途: 使用 IEC 定时器和计数器 2024-11-23
- KUKA C4 安装工业以太网软件 2024-11-23
- STEP7-压缩用户存储器(RAM) 2024-11-23
- 西门子博途: 网络视图 2024-11-23
- 西门子S7-300模块扩展IO接线 2024-11-23
- 西门子编程电缆PC Adapter USB A2使用 2024-11-23
- 西门子S7-200SMART和S7-1200之间通信(图文) 2024-11-23
- 利用西门子S7-1200计数器指令,实现设备运行时间统计 2024-11-23
- 【实例】变频器、触摸屏、PLC的综合运用,边学边用边实践! 2024-11-23