在博图(TIA Portal)编程中,SCL(Structured Control Language,结构化控制语言)是应用最广泛的高级编程语言之一,相较于梯形图(LAD)、功能块图(FBD),它更适合编写复杂逻辑、数学运算和循环控制程序,灵活性极高。
很多新手入门SCL时,容易混淆关键字用法、掌握单一逻辑写法,导致编程效率低、程序冗余。本篇博客将从SCL基础入门出发,详细讲解每个基础逻辑的多种写法、核心关键字的含义及使用规范,搭配真实工业场景案例,让新手快速掌握SCL编程技巧,轻松应对日常项目需求。
前置说明:本文基于博图V17版本讲解,适用于S7-1200、S7-1500系列CPU,所有案例均可直接复制到博图中编译使用(需根据实际I/O地址调整)。
一、SCL基础准备(新手必看)
1. 打开博图软件,新建项目并添加对应CPU(如S7-1513),在“程序块”中新建“函数(FC)”或“功能块(FB)”,编程语言选择“结构化控制语言(SCL)”。
2. SCL编程规则:语句以“;”结尾,区分大小写(关键字默认大写,变量名可自定义,建议遵循“前缀+功能”命名规范,如I_Start、Q_Run);注释用“//”(单行注释)或“/*…*/”(多行注释),不影响程序运行。
3. 核心概念:变量分为输入(I)、输出(Q)、中间变量(M)、数据块(DB)变量,编程前需先在“变量声明表”中定义变量,避免报错。
二、SCL基础逻辑(多种写法+案例)
SCL的基础逻辑主要包括:触点逻辑(与/或/非)、边沿检测、赋值语句、循环语句、条件判断语句,每种逻辑均提供2-3种常用写法,适配不同编程习惯和场景。
(一)触点逻辑(与/或/非)—— 最基础,高频使用
核心作用:实现简单的开关控制,对应梯形图中的常开、常闭触点串联(与)、并联(或),以及触点取反(非)。
核心关键字:AND(与)、OR(或)、NOT(非),也可使用逻辑运算符“&&(与)、||(或)、!(非)”(两种写法通用,推荐新手先掌握关键字写法)。
1. 与逻辑(两个条件同时满足,输出有效)
场景:启动按钮(I0.0,常开)和急停按钮(I0.1,常闭)同时有效时,电机运行输出(Q0.0)得电。
写法1:关键字写法(直观,贴合梯形图逻辑)
// 与逻辑:I0.0常开 AND I0.1常闭,满足则Q0.0得电
IF I0.0 AND NOT I0.1 THEN
Q0.0 := TRUE;
ELSE
Q0.0 := FALSE;
END_IF;
写法2:逻辑运算符写法(简洁,适合复杂逻辑嵌套)
// 与逻辑:I0.0 && (!I0.1),满足则Q0.0得电
Q0.0 := I0.0 && !I0.1;
写法3:简化赋值写法(无需IF语句,适合简单逻辑)
// 直接赋值,条件满足则为TRUE,否则为FALSE
Q0.0 := (I0.0 AND NOT I0.1);
2. 或逻辑(任意一个条件满足,输出有效)
场景:手动启动按钮(I0.0)或自动启动按钮(I0.2)任意一个按下,电机运行输出(Q0.0)得电。
写法1:关键字写法
IF I0.0 OR I0.2 THEN
Q0.0 := TRUE;
ELSE
Q0.0 := FALSE;
END_IF;
写法2:逻辑运算符写法
Q0.0 := I0.0 || I0.2;
3. 非逻辑(条件取反,输出有效)
场景:停止按钮(I0.3,常开)按下时,电机停止输出(Q0.0失电)。
// 两种写法通用
Q0.0 := NOT I0.3;
// Q0.0 := !I0.3;
(二)边沿检测逻辑—— 捕捉信号上升/下降沿
核心作用:检测输入信号的瞬间变化(上升沿:从0→1;下降沿:从1→0),常用于启动、停止的脉冲触发,避免信号持续有效导致误动作。
核心关键字:R_TRIG(上升沿触发器)、F_TRIG(下降沿触发器)(博图自带功能块),也可手动编写边沿检测逻辑(适合理解原理)。
场景:按下启动按钮(I0.0,常开),电机运行输出(Q0.0)保持得电(脉冲触发,松手后仍运行);按下停止按钮(I0.3,常开),电机停止。
1. 上升沿检测(R_TRIG功能块写法,推荐)
// 声明中间变量:上升沿触发器实例、中间标志位
VAR
R_TRIG_Start: R_TRIG; // 上升沿触发器实例
M0_0: BOOL; // 中间标志位,用于保持输出
END_VAR
// 上升沿检测:I0.0按下瞬间(0→1),触发M0_0置1
R_TRIG_Start(CLK := I0.0);
IF R_TRIG_Start.Q THEN
M0_0 := TRUE;
END_IF;
// 停止按钮按下(下降沿或直接检测),M0_0置0
IF I0.3 THEN
M0_0 := FALSE;
END_IF;
// 中间标志位控制输出
Q0.0 := M0_0;
2. 上升沿检测(手动编写,理解原理)
// 声明中间变量:存储上一周期的输入状态
VAR
I0_0_Last: BOOL; // 存储I0.0上一周期状态
M0_0: BOOL;
END_VAR
// 手动上升沿:当前周期I0.0为1,上一周期为0,即为上升沿
IF I0.0 AND NOT I0_0_Last THEN
M0_0 := TRUE;
END_IF;
// 停止逻辑
IF I0.3 THEN
M0_0 := FALSE;
END_IF;
// 更新上一周期状态(关键:必须放在最后,避免误触发)
I0_0_Last := I0.0;
Q0.0 := M0_0;
3. 下降沿检测(F_TRIG功能块写法)
// 场景:按钮松开瞬间(1→0),触发输出脉冲
VAR
F_TRIG_Stop: F_TRIG;
Q0_1: BOOL; // 脉冲输出
END_VAR
F_TRIG_Stop(CLK := I0.3);
Q0_1 := F_TRIG_Stop.Q; // 按钮松开瞬间,Q0_1输出一个扫描周期的高电平
(三)赋值语句—— 变量赋值、数学运算
核心作用:给变量赋值(包括BOOL、INT、DINT等类型),实现数学运算(加减乘除、取余等),是SCL编程的基础操作。
核心关键字::=(赋值符号),数学运算符:+(加)、-(减)、*(乘)、/(除)、MOD(取余)。
1. 简单赋值(BOOL/INT类型)
// BOOL类型赋值(开关状态)
Q0.0 := TRUE; // 输出得电
Q0.1 := FALSE; // 输出失电
// INT类型赋值(数值)
MW0 := 100; // 中间字MW0赋值为100
DB1.DBW0 := MW0; // 将MW0的值赋值给数据块DB1的字变量DBW0
2. 数学运算赋值(常用场景)
场景:采集模拟量输入(AI0.0,对应工程量0-1000),将其转换为0-100的百分比,存储到DB1.DBD0(实数类型)。
VAR
AI_Input: INT; // 模拟量输入(0-1000)
Percent: REAL; // 百分比(0-100)
END_VAR
AI_Input := PIW256; // 读取AI0.0的模拟量值(PIW256为AI0.0对应地址)
Percent := (AI_Input / 1000.0) * 100; // 转换为百分比
DB1.DBD0 := Percent; // 赋值到数据块
3. 取余运算(MOD)案例
场景:统计电机运行次数(MW0),每运行3次,触发指示灯(Q0.2)闪烁一次。
MW0 := MW0 + 1; // 运行次数加1
IF (MW0 MOD 3) = 0 THEN // 取余,余数为0时触发
Q0.2 := NOT Q0.2; // 指示灯闪烁(取反)
END_IF;
(四)条件判断语句—— 多分支逻辑控制
核心作用:根据不同条件执行不同的程序逻辑,对应梯形图中的分支指令,常用两种形式:IF-ELSE(单/多分支)、CASE(多分支,适合固定值判断)。
核心关键字:IF、ELSE、ELSEIF、END_IF、CASE、OF、END_CASE。
1. IF-ELSE语句(多条件判断,灵活)
场景:根据温度传感器(AI0.0,转换后为0-100℃)的数值,控制散热风扇(Q0.3)的运行状态:≤30℃停止,31-60℃低速运行,≥61℃高速运行。
VAR
Temp: REAL; // 温度值(0-100℃)
END_VAR
Temp := DB1.DBD0; // 读取转换后的温度值
IF Temp <= 30.0 THEN
Q0.3 := FALSE; // 风扇停止
ELSEIF Temp > 30.0 AND Temp <= 60.0 THEN
Q0.3 := TRUE; // 低速运行(假设Q0.3得电为低速)
ELSE
Q0.3 := TRUE; // 高速运行(可搭配另一个输出Q0.4控制高速,此处简化)
Q0.4 := TRUE;
END_IF;
2. CASE语句(固定值判断,简洁)
场景:根据选择开关(I0.4、I0.5组合,对应3种模式),控制电机运行模式:模式1(I0.4=1,I0.5=0)低速,模式2(I0.4=0,I0.5=1)高速,模式3(I0.4=1,I0.5=1)停止。
VAR
Mode: INT; // 模式变量
END_VAR
// 组合选择开关,赋值给Mode
Mode := (I0.4 * 2) + I0.5;
CASE Mode OF
1: Q0.0 := TRUE; Q0.1 := FALSE; // 模式1:低速(Q0.0得电)
2: Q0.0 := FALSE; Q0.1 := TRUE; // 模式2:高速(Q0.1得电)
3: Q0.0 := FALSE; Q0.1 := FALSE; // 模式3:停止
ELSE: Q0.0 := FALSE; Q0.1 := FALSE; // 其他情况:停止
END_CASE;
(五)循环语句—— 重复执行指定逻辑
核心作用:重复执行一段程序,直到满足退出条件,适合批量操作(如批量赋值、批量检测),常用两种:FOR循环(固定次数)、WHILE循环(条件满足则循环)。
核心关键字:FOR、TO、BY、END_FOR、WHILE、END_WHILE。
1. FOR循环(固定次数,推荐用于批量操作)
场景:批量置位输出Q0.0-Q0.7(8个输出点),用于设备初始化。
VAR
i: INT; // 循环变量
END_VAR
// 循环8次,i从0到7,每次递增1
FOR i := 0 TO 7 BY 1 DO
// 批量置位Q0.i(通过变量地址偏移实现)
"Q0_" + INT_TO_STRING(i) := TRUE;
END_FOR;
2. WHILE循环(条件循环,适合不确定次数的场景)
场景:检测物料传感器(I0.6),直到物料到位(I0.6=1),电机(Q0.0)停止运行。
// 电机先启动
Q0.0 := TRUE;
// 物料未到位(I0.6=0),持续循环(电机运行)
WHILE NOT I0.6 DO
// 循环内可添加延时、检测等逻辑(此处简化)
END_WHILE;
// 物料到位,电机停止
Q0.0 := FALSE;
三、SCL核心关键字汇总(必记)
以下关键字是SCL编程的基础,按功能分类,结合上述案例理解,无需死记硬背,多实操即可熟练掌握:
-
逻辑运算关键字:AND(与)、OR(或)、NOT(非)—— 对应触点逻辑
-
边沿检测关键字:R_TRIG(上升沿)、F_TRIG(下降沿)—— 捕捉信号瞬间变化
-
赋值关键字::=(赋值)—— 给变量赋值、传递数值
-
条件判断关键字:IF、ELSE、ELSEIF、END_IF、CASE、OF、END_CASE—— 多分支逻辑
-
循环关键字:FOR、TO、BY、END_FOR、WHILE、END_WHILE—— 重复执行逻辑
-
常用辅助关键字:VAR(变量声明)、END_VAR(变量声明结束)、COMMENT(注释)
四、综合实操案例(整合基础逻辑,直接套用)
场景:小型自动化设备控制,实现“启动-运行-停止-复位”全流程,整合触点逻辑、边沿检测、条件判断,包含SCL多种写法。
// 变量声明
VAR
// 输入变量
I_Start: BOOL := I0.0; // 启动按钮(常开)
I_Stop: BOOL := I0.1; // 停止按钮(常开)
I_Reset: BOOL := I0.2; // 复位按钮(常开)
I_Sensor: BOOL := I0.3; // 物料检测传感器(常开)
// 输出变量
Q_Run: BOOL := Q0.0; // 电机运行输出
Q_Alarm: BOOL := Q0.1; // 报警输出
// 中间变量
R_TRIG_Start: R_TRIG; // 启动上升沿触发器
F_TRIG_Stop: F_TRIG; // 停止下降沿触发器
Run_Flag: BOOL; // 运行标志位
Count: INT; // 运行次数统计
END_VAR
// 1. 启动逻辑(上升沿触发,保持运行)
R_TRIG_Start(CLK := I_Start);
IF R_TRIG_Start.Q THEN
Run_Flag := TRUE;
Count := Count + 1; // 运行次数加1
END_IF;
// 2. 停止逻辑(下降沿触发,或复位触发)
F_TRIG_Stop(CLK := I_Stop);
IF F_TRIG_Stop.Q OR I_Reset THEN
Run_Flag := FALSE;
Q_Alarm := FALSE;
END_IF;
// 3. 运行控制逻辑(与逻辑:运行标志位AND传感器未触发)
Q_Run := Run_Flag AND NOT I_Sensor;
// 4. 报警逻辑(条件判断:传感器触发且运行中)
IF I_Sensor AND Run_Flag THEN
Q_Alarm := TRUE;
END_IF;
// 5. 运行次数统计(循环+取余,每运行5次报警闪烁)
IF (Count MOD 5) = 0 AND Count <> 0 THEN
Q_Alarm := NOT Q_Alarm;
END_IF;
案例说明:该程序包含启动、停止、复位、报警、计数5个核心功能,整合了本文讲解的所有基础逻辑和关键字,新手可复制到博图中,修改I/O地址后编译调试,快速熟悉SCL编程思路。
五、新手避坑提醒
-
关键字区分大小写:博图中SCL关键字默认大写(如IF、AND),变量名可小写,但建议统一规范,避免报错。
-
循环变量需初始化:FOR循环的循环变量(如i)无需手动初始化,博图会自动赋值;WHILE循环需确保有退出条件,避免死循环。
-
变量声明不可遗漏:所有使用的变量(包括中间变量),必须在VAR和END_VAR之间声明,否则会提示“未定义变量”。
-
边沿检测注意实例化:R_TRIG、F_TRIG是功能块,使用前需在变量声明中实例化(如R_TRIG_Start: R_TRIG;),不可直接使用。
六、总结
博图SCL编程的核心的是“灵活运用逻辑和关键字”,本文讲解的基础逻辑(与或非、边沿检测、赋值、条件判断、循环),覆盖了日常项目80%的编程需求,每种逻辑的多种写法可根据场景灵活选择——新手建议先掌握关键字写法,熟悉后再使用简洁的逻辑运算符写法,提升编程效率。
实操是掌握SCL的关键,建议新手结合本文案例,在博图中反复调试、修改,熟悉每个关键字的用法和逻辑的实现方式。如果遇到具体场景的编程难题(如复杂数学运算、批量控制),可留言交流,一起探讨解决方案~



