在 TIA 里试一下
通过 TiaLink 把本页示例(FB_Convert_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案: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 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | RealValue | Real | |
| 输出 | IntValue | Int | |
| 输出 | RealBack | Real | |
| 输出 | Rounded | DInt | |
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;
10 RealBack : Real;
11 Rounded : DInt;
12 END_VAR
13
14BEGIN
15 REGION 显式类型转换
16
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);
2#RealValue := INT_TO_REAL(#IntValue);
3#Rounded := ROUND(#RealValue);
常用转换:
| 转换 |
说明 |
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 状态见下方“验证状态”。
验证状态
“待实测”表示还没有在 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` 或直接赋值;位串和整数语义不同,混用容易得到错误值。