西门子1200 SCL语言详解
- [一、西门子1200 SCL语言详解](#一、西门子1200 SCL语言详解)
-
- [1、 SCL 概述](#1、 SCL 概述)
- [2、SCL 基本语法元素](#2、SCL 基本语法元素)
-
- [2.1 、注释](#2.1 、注释)
- [2.2 、标识符 (变量名)](#2.2 、标识符 (变量名))
- 2.3、数据类型
- [2.4 、变量声明](#2.4 、变量声明)
- [2.5 、赋值语句](#2.5 、赋值语句)
- [2.6 、运算符](#2.6 、运算符)
- 3、程序控制结构
-
- [3.1、 条件语句 (`IF...THEN...ELSE`)](#3.1、 条件语句 (
IF...THEN...ELSE)) - [3.2 、多分支选择语句 (`CASE...OF`)](#3.2 、多分支选择语句 (
CASE...OF)) - [3.3、 循环语句](#3.3、 循环语句)
- [3.1、 条件语句 (`IF...THEN...ELSE`)](#3.1、 条件语句 (
- [4、函数 (FC) 和函数块 (FB)](#4、函数 (FC) 和函数块 (FB))
-
- [4.1 、函数 (FC - Function)](#4.1 、函数 (FC - Function))
- [4.2、 函数块 (FB - Function Block)](#4.2、 函数块 (FB - Function Block))
- [5、SCL 在 S7-1200 中的优势](#5、SCL 在 S7-1200 中的优势)
- [6、在 TIA Portal 中使用 SCL](#6、在 TIA Portal 中使用 SCL)
- 7、示例:一个简单的定时器应用 (使用 IEC Timer FB)
- 8、总结

一、西门子1200 SCL语言详解
1、 SCL 概述
结构化控制语言(Structured Control Language,简称 SCL)是一种高级编程语言,类似于 Pascal 或 C 语言。它是西门子 PLC 编程环境(如 TIA Portal)中支持的 IEC 61131-3 标准语言之一(其他包括 LAD、FBD、STL、GRAPH)。SCL 特别适合于:
- 处理复杂的数学运算和算法
- 处理大量数据(如数组、结构体)
- 实现复杂的逻辑控制
- 编写可重用的函数和函数块
- 需要清晰、结构化的代码的场景
2、SCL 基本语法元素
2.1 、注释
-
单行注释: 使用
//开头。scl// 这是一个单行注释 -
多行注释: 使用
(*和*)包围。scl(* 这是一个 多行注释 *)
2.2 、标识符 (变量名)
- 由字母、数字和下划线
_组成,不能以数字开头。 - 区分大小写。
- 应具有描述性。
2.3、数据类型
SCL 支持 IEC 61131-3 标准定义的基本数据类型和复杂数据类型:
- 基本数据类型:
- 布尔型:
BOOL - 整型:
BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT,LINT,ULINT - 浮点型:
REAL,LREAL - 时间型:
TIME,DATE,TIME_OF_DAY (TOD),DATE_AND_TIME (DT) - 字符/字符串:
CHAR,WCHAR,STRING,WSTRING
- 布尔型:
- 复杂数据类型:
- 数组:
ARRAY [1..10] OF INT - 结构体:
STRUCT ... END_STRUCT - 枚举:
TYPE ... : (Red, Yellow, Green) ... END_TYPE - 指针:
POINTER TO - 引用:
REFERENCE TO
- 数组:
- 系统数据类型: 如
TIMER,COUNTER。
2.4 、变量声明
变量在代码块的开始部分声明。
scl
VAR
StartButton AT %I0.0 : BOOL; // 输入变量,硬件地址 I0.0
MotorRun : BOOL; // 临时变量
Setpoint : REAL := 100.0; // 临时变量,带初始值
END_VAR
VAR CONSTANT
MaxValue : INT := 1000; // 常量
END_VAR
VAR_GLOBAL
GlobalCounter : INT; // 全局变量 (在全局数据块或 FB 接口中定义更常见)
END_VAR
2.5 、赋值语句
使用 := 运算符进行赋值。
scl
MotorRun := StartButton AND NOT StopButton; // 布尔逻辑赋值
Setpoint := Setpoint + 10.0; // 算术运算赋值
2.6 、运算符
- 算术运算符:
+,-,*,/,MOD,**(乘方) - 比较运算符:
=,<>,>,<,>=,<= - 逻辑运算符:
AND,&(与),OR(或),XOR(异或),NOT(非) - 位运算符:
AND,OR,XOR,NOT(操作对象为位序列时)
3、程序控制结构
SCL 提供类似高级语言的流程控制语句。
3.1、 条件语句 (IF...THEN...ELSE)
scl
IF Temperature > Setpoint THEN
CoolingValve := TRUE;
HeatingValve := FALSE;
ELSIF Temperature < Setpoint - Hysteresis THEN
CoolingValve := FALSE;
HeatingValve := TRUE;
ELSE
CoolingValve := FALSE;
HeatingValve := FALSE;
END_IF;
3.2 、多分支选择语句 (CASE...OF)
scl
CASE MachineState OF
0: // Idle
StartProcess := FALSE;
ResetAlarms := FALSE;
1: // Running
StartProcess := TRUE;
IF Alarm THEN ResetAlarms := TRUE; END_IF;
2: // Maintenance
// ... maintenance actions ...
ELSE
// Handle unexpected state
ErrorFlag := TRUE;
END_CASE;
3.3、 循环语句
-
FOR循环: 指定循环次数。sclFOR Index := 1 TO 10 BY 1 DO Total := Total + SensorValues[Index]; END_FOR; -
WHILE循环: 条件为真时循环。sclWHILE (Total < Target) AND (Attempts < MaxAttempts) DO Attempts := Attempts + 1; // ... try to increase Total ... END_WHILE; -
REPEAT...UNTIL循环: 至少执行一次,直到条件满足。sclREPEAT // ... get sensor reading ... Readings := Readings + 1; UNTIL SensorReady OR (Readings >= MaxReadings) END_REPEAT;
4、函数 (FC) 和函数块 (FB)
这是 SCL 强大和可重用性的核心。
4.1 、函数 (FC - Function)
- 没有内部状态(无记忆性)。
- 每次调用都使用相同的输入产生相同的输出。
- 不能直接读写全局变量(通常通过输入输出参数)。
- 常用于数学计算、逻辑转换。
scl
FUNCTION CalculateAverage : REAL
VAR_INPUT
Values : ARRAY [1..N] OF REAL; // 假设 N 是常量
END_VAR
VAR
Sum : REAL := 0.0;
i : INT;
END_VAR
FOR i := 1 TO N DO
Sum := Sum + Values[i];
END_FOR;
CalculateAverage := Sum / N;
END_FUNCTION
4.2、 函数块 (FB - Function Block)
- 有内部状态(有记忆性)。
- 拥有静态变量 (
VAR),其值在调用之间保持。 - 可以拥有自己的数据块(背景数据块 Instance DB)。
- 常用于控制器、状态机、设备驱动(如定时器、计数器)。
scl
FUNCTION_BLOCK MotorController
VAR_INPUT
Start : BOOL;
Stop : BOOL;
Fault : BOOL;
END_VAR
VAR_OUTPUT
RunCmd : BOOL;
END_VAR
VAR
LastStart : BOOL; // 静态变量,记住上次状态
END_VAR
// 上升沿检测启动
IF Start AND NOT LastStart AND NOT Fault THEN
RunCmd := TRUE;
END_IF;
// 停止或故障立即停止
IF Stop OR Fault THEN
RunCmd := FALSE;
END_IF;
LastStart := Start; // 记住本次 Start 状态供下次使用
END_FUNCTION_BLOCK
使用 FB:
scl
// 在 OB 或其他 FB/FC 中实例化并使用
VAR
MainMotor : MotorController; // 实例化 FB
END_VAR
MainMotor(Start := I_StartButton, Stop := I_StopButton, Fault := I_Overload);
Q_MotorContact := MainMotor.RunCmd;
5、SCL 在 S7-1200 中的优势
- 处理复杂算法: 数学运算、PID 控制算法等编写更简洁高效。
- 数据处理能力强: 数组、结构体、字符串操作方便。
- 代码重用性高: 通过 FC 和 FB 封装功能。
- 结构化清晰: 代码逻辑清晰,易于维护和调试。
- 执行效率: 相比图形化语言(如 LAD),对于复杂逻辑,编译后的 SCL 代码执行效率通常很高。
6、在 TIA Portal 中使用 SCL
- 创建 SCL 块: 在项目树中,右键点击
程序块->添加新块-> 选择SCL语言,类型选择函数 (FC)或函数块 (FB)或组织块 (OB)。 - 编写代码: 在打开的编辑器中进行编程。
- 编译: 编写完成后进行编译,检查语法错误。
- 下载和调试: 下载到 PLC,使用监控表、在线诊断等功能进行调试。
7、示例:一个简单的定时器应用 (使用 IEC Timer FB)
scl
// 假设使用 TON (通电延时定时器)
FUNCTION_BLOCK MyTimedProcess
VAR_INPUT
Start : BOOL; // 启动信号
TimeDelay : TIME := T#5S; // 延时时间,默认 5 秒
END_VAR
VAR_OUTPUT
ProcessActive : BOOL; // 过程激活信号
TimeElapsed : BOOL; // 时间到信号
END_VAR
VAR
TimerInstance : TON; // 使用系统提供的 TON 函数块
END_VAR
// 启动定时器
TimerInstance(IN := Start, PT := TimeDelay);
// 输出过程激活状态 (只要 Start 为真或定时器在计时)
ProcessActive := Start OR TimerInstance.Q;
// 输出时间到信号 (定时器完成)
TimeElapsed := TimerInstance.Q;
END_FUNCTION_BLOCK
8、总结
SCL 为西门子 S7-1200 PLC 提供了强大的高级编程能力,尤其适合处理复杂的逻辑、算法和数据结构。通过掌握其语法、数据类型、控制结构和函数/函数块的使用,工程师可以编写出高效、清晰且易于维护的 PLC 程序。在 TIA Portal 环境中集成开发也非常方便。
