跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL CONVERT — 类型转换

SCL CONVERT — 类型转换

在兼容数据类型之间转换;SCL 也常用 INT_TO_REAL 等显式转换。

转换 S7-1200/1500 TIA V19 别名:类型转换 / CONVERT / INT_TO_REAL

在 TIA 里试一下

通过 TiaLink 把本页示例(FB_Convert_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。

TiaLink 设置

默认 http://localhost:8080。也可以在本页地址后加 ?tialink= 临时指定。

TiaLink 启动时若设置了 --api-token,这里要填相同的值;只保存在本机浏览器 localStorage,不会上传。

一句话

答案:SCL 的类型转换写成 <源类型>_TO_<目标类型>(值),例如 REAL_TO_INT、INT_TO_REAL;不是调用一个叫 CONVERT 的函数。

SCL 的类型转换写成 <源类型>_TO_<目标类型>(值),例如 REAL_TO_INT、INT_TO_REAL;不是调用一个叫 CONVERT 的函数。REAL_TO_INT 按最近整数取整,要截断用 TRUNC。

参数

参数方向类型存储区说明
IN输入源类型—要转换的值。SCL 里通常写成 `<源类型>_TO_<目标类型>(IN)`,不是 `CONVERT(IN := ...)`。
OUT输出目标类型—转换结果;目标类型由指令名后缀决定,例如 REAL_TO_INT 得到 Int,INT_TO_REAL 得到 Real。

参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。

最小示例

下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。

FB_Convert_Demo FB

最小示例 · 22 行 · 源文件 blocks/FB_Convert_Demo.scl

查看 FB_Convert_Demo 的块接口
区块名称类型说明
输入RealValueReal
输出IntValueInt
输出RealBackReal
输出RoundedDInt
blocks/FB_Convert_Demo.scl
1FUNCTION_BLOCK "FB_Convert_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4   VAR_INPUT
5      RealValue : Real := 20.56;   // 源值
6   END_VAR
7 
8   VAR_OUTPUT
9      IntValue : Int;              // REAL_TO_INT 结果
10      RealBack : Real;             // INT_TO_REAL 结果
11      Rounded : DInt;              // ROUND 结果
12   END_VAR
13 
14BEGIN
15   REGION 显式类型转换
16      // REAL_TO_INT 按最近整数取整;要截断用 TRUNC。
17      #IntValue := REAL_TO_INT(#RealValue);
18      #RealBack := INT_TO_REAL(#IntValue);
19      #Rounded := ROUND(#RealValue);
20   END_REGION
21END_FUNCTION_BLOCK
22 

块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。

SCL 写法

SCL
1#IntValue := REAL_TO_INT(#RealValue);   // Real -> Int,四舍五入
2#RealValue := INT_TO_REAL(#IntValue);   // Int -> Real
3#Rounded := ROUND(#RealValue);          // 显式取整到 DInt

常用转换:

转换 说明
INT_TO_REAL 整数转浮点,值不变
REAL_TO_INT 浮点转整数,按最近整数取整
DINT_TO_INT 大整数转小整数,可能越界
WORD_TO_INT 位串转整数,按位模式解释
INT_TO_WORD 整数转位串,按位模式解释

怎么工作

  • 转换方向由指令名决定,源和目标必须匹配;不要写 CONVERT(IN := ...)。
  • REAL_TO_INT 会按最近整数取整(TIA 示例 20.56 → 21);要截断用 TRUNC。
  • 目标范围不够时可能溢出或得到意外值;转换前检查范围。
  • 位串(WORD/DWORD)和整数语义不同,必须用对应的 WORD_TO_INT/INT_TO_WORD,不能靠 MOVE。
  • TIME、DATE、STRING 等类型也有各自的转换指令;不要假设任意类型都能互转。

常用场景

1. 模拟量工程量转整数

REAL 工程量要写到 INT 输出时用 REAL_TO_INT;需要截断时用 TRUNC,需要向下/向上取整用 FLOOR/CEIL。

2. 整数转浮点参与运算

INT 计数器参与除法/比例运算前先 INT_TO_REAL,避免整数除法丢小数。

3. 位串和数值互转

通信/IO 映射里 WORD 和 INT 经常互转;用显式转换并确认字节序/位模式,不要用 MOVE 蒙混。

常见坑

  • 写 CONVERT(IN := ...):SCL 里通常没有这个调用;用 <SRC>_TO_<DST>(...)。
  • REAL_TO_INT 当截断:它是四舍五入;截断用 TRUNC,向下/向上用 FLOOR/CEIL。
  • 目标范围溢出:DINT_TO_INT、REAL_TO_INT 超出目标范围会得到意外值;先检查范围。
  • 位串当整数:WORD/INT 的位模式相同但语义不同;用 WORD_TO_INT/INT_TO_WORD。
  • 用 MOVE 代替转换:MOVE 只做赋值,不做类型语义转换;需要转换就用显式转换。
  • 忽略精度:REAL 约 7 位有效数字;大数/高精度用 LREAL 或整数运算。

和 LAD 的区别

LAD 的 CONVERT 是带源/目标类型的盒;SCL 里写成 REAL_TO_INT(...) 这种显式转换,直接嵌在表达式里。语义一样,SCL 更容易在计算过程中转换。梯形图版本见 Learn-LAD 的 Convert 页。

云仿真验证

PLC 云仿真:PASS(2 次扫描)。场景:正数转换与取整;负数转换与取整。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。

查看云仿真回归输出
云仿真回归输出
PASS  正数转换与取整 (1 step(s), 1 scan(s))
PASS  负数转换与取整 (1 step(s), 1 scan(s))
RESULT: ALL PASS (2 scan(s))

云仿真验证语法、结构和逐扫描行为,不等同于 TIA 编译;TIA 状态见下方“验证状态”。

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真PASS(2 scans)2026-11-02scl_run_scenario / scl_validate
TIA 导入编译待实测—TiaLink + TIA Portal(待实测)

“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。

来源与说明

参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Conversion_operations/CONVERT__Convert_value.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。

源/目标类型和 REAL_TO_INT 取整示例以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。

Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。

常见问题

SCL 里有 CONVERT 函数吗?

TIA 帮助把这一族叫“转换”,但 SCL 代码里通常写 `REAL_TO_INT(...)`、`INT_TO_REAL(...)` 这种显式转换,而不是 `CONVERT(IN := ...)`。

REAL_TO_INT 会四舍五入还是截断?

TIA 帮助的示例是四舍五入到最近整数(20.56 → 21)。要截断用 `TRUNC`,要向下/向上用 `FLOOR`/`CEIL`。

位串和整数怎么转换?

用对应的显式转换,例如 `WORD_TO_INT`、`INT_TO_WORD`,不要用 `MOVE` 或直接赋值;位串和整数语义不同,混用容易得到错误值。

← 返回 SCL 指令手册