首页 > 基础教程 > SCL基础教程 > 文章内容

SCL PLC 编程教程第二篇 SCL 的基本语法与编程界面认识:从第一个程序开始

时间: 2026-04-15 12:15浏览量:9次


上一篇我们讲了,SCL 不是一种“神秘语言”,它本质上就是一种适合 PLC 进行复杂逻辑和数据处理的结构化文本编程方式。很多工程师第一次看到 SCL,会觉得它像代码,不像 PLC;但真正开始接触后就会发现,它并没有想象中那么难。

不过,SCL 初学者最容易卡住的,不一定是控制逻辑,而是这些最基础的问题:

程序到底写在哪儿
为什么有的地方能写,有的地方不能写
变量名后面为什么要加分号
赋值和判断到底有什么区别
为什么程序看起来不长,却一直报错
一个最简单的 SCL 程序应该怎么开始

这些问题如果一开始没理顺,后面越学越容易乱。
所以这一篇我们就先把 SCL 的“门槛部分”跨过去。你只要把这一篇看懂,后面进入 IF、CASE、循环、数组这些内容时,会轻松很多。

一、先建立一个最重要的概念:SCL 不是“随便找个地方就能写”

很多刚接触 SCL 的人,脑子里还是梯形图思路:
新建一个网络,拖个指令,接上线,基本就能开始写逻辑。

但 SCL 不是这种方式。

SCL 需要依托于一个具体的程序块来写。也就是说,你不是在空气里写代码,而是在某个块里面写逻辑。这个“块”可能是:

FC
FB
OB
方法块里的某一部分逻辑
某些支持 SCL 的功能区域

如果你是用西门子 TIA Portal 来做项目,那么最常见的情况就是在这些程序块中选择 SCL 语言,然后进入文本编辑界面来编写。

这一点非常关键。
因为初学者常常会把两个问题混在一起:

第一个问题是“我会不会写 SCL 语法”。
第二个问题是“我知不知道程序应该写在哪个块里”。

实际上,第二个问题经常比第一个问题更先把人卡住。

所以你要先记住一句话:

SCL 不是单独漂浮的一段代码,它一定属于某个程序块。

二、在工程里,SCL 一般写在哪里

虽然不同品牌、不同平台的表达方式会有差别,但以大多数 PLC 工程项目的实际习惯来看,SCL 常见的使用位置主要有下面几种。

1. 写在 FC 里

FC 可以理解成一个功能。
它通常适合写一些“有输入、有处理、有输出”的独立逻辑,但不一定保存内部状态。

比如:

一个模拟量换算功能
一个温度滤波功能
一个数据比较功能
一个字符串拼接功能
一个批量报警判断功能

这种逻辑很适合用 SCL 来写,因为它本身就比较像“数据处理函数”。

2. 写在 FB 里

FB 更适合做那些需要保存内部状态的功能模块。
比如:

电机控制模块
阀门控制模块
报警模块
状态机模块
配方处理模块
计时统计模块

如果这个功能不仅要算结果,还要记住自己当前处于什么状态,那么 FB 往往更合适。

很多工程项目里,真正体现 SCL 价值的地方,往往都在 FB 里。

3. 写在 OB 里

OB 是组织块。
有些工程师也会直接在主循环组织块里写一部分 SCL 逻辑,尤其是项目比较简单、或者只是先快速验证某段功能时。

但从工程规范角度来说,如果逻辑逐渐复杂,通常还是建议把功能拆到 FC 或 FB 里,不要全部堆在 OB 里,否则后面会越来越难维护。

三、SCL 的编程界面,和梯形图到底有什么不同

你一进入 SCL 编辑界面,第一感觉通常是:
“这不就是一页代码吗?”

对,表面上看确实像代码编辑器。
但你不要把它想成传统 IT 编程,也不要被“满屏英文关键字”吓住。它的核心还是 PLC 工程逻辑,只是表达方式变成了文本。

和梯形图相比,SCL 界面最大的差别有三个。

1. 梯形图是“看连接关系”,SCL 是“看语句结构”

梯形图的重点在于触点、线圈、分支、串联并联的逻辑关系。
你往往一眼扫过去,看的是电流通路感。

而 SCL 不一样。
SCL 重点在于:

这一句做什么
哪一句属于哪个判断
哪一段属于哪个循环
哪些变量被赋值了
条件成立时执行哪些动作

也就是说,SCL 更强调结构层次。

所以初学者一定要学会“缩进意识”。
虽然有时候缩进不是语法强制要求,但它对阅读非常重要。
同样一段程序,缩进清楚和缩进混乱,阅读难度完全不同。

2. 梯形图依赖图形块,SCL 依赖关键字

在梯形图里,你经常用到的是:

常开触点
常闭触点
线圈
定时器
计数器
比较器
逻辑块

而在 SCL 里,你要开始熟悉的是这些关键字:

IF
THEN
ELSE
END_IF
CASE
OF
FOR
TO
DO
END_FOR
WHILE
END_WHILE

它们并不复杂,但需要你逐渐形成阅读习惯。

3. 梯形图更像“搭积木”,SCL 更像“写句子”

梯形图很多时候是把逻辑元件拼接起来。
SCL 更像是用一句一句的话把程序写出来。

比如梯形图里是“串几个触点后驱动一个线圈”,
SCL 里可能就写成:

MotorRun := StartPB AND NOT StopPB AND NOT Fault;

一句话就把逻辑说完了。

所以初学者学 SCL 时,脑子里最好不断问自己一句话:

我现在是不是能用一句清楚的话,把这个控制逻辑说出来?

能说出来,往往就更容易写出来。

四、SCL 程序最基础的组成,先认识四样东西

在真正开始写程序前,你先别急着背复杂语法,只要先认识下面四样东西就够了:

1. 变量

变量就是程序里要参与运算、判断、输出的名字。
你可以把它理解成“一个有名字的数据位置”。

比如:

StartPB
StopPB
MotorRun
Fault
LevelRaw
TemperatureSet
StepNo

这些都可以是变量。

初学者最容易犯的错误之一,就是把变量当成“随手起的名字”。
其实不是。变量名本身就是程序可读性的一部分。
以后你会越来越强烈地感觉到:变量名起得好不好,直接决定程序好不好维护。

2. 赋值

赋值就是把某个结果放到某个变量里。
SCL 里最常见的赋值符号是:

:=

例如:

MotorRun := TRUE;

意思就是:把 TRUE 赋给 MotorRun。

注意,这里不是“判断”,而是“把值给它”。
这一点很多新手一开始会混淆。

3. 表达式

表达式就是一段可以计算出结果的内容。
例如:

StartPB AND NOT Fault

这就是一个布尔表达式,最终结果不是 TRUE 就是 FALSE。

再比如:

TemperatureRaw * 100.0 / 27648.0

这就是一个数值表达式,最终结果会得到一个数。

4. 语句结束符

SCL 中很多独立语句后面要写分号:

;

比如:

MotorRun := TRUE;

这个分号很重要。
很多初学者报错,不是逻辑错,而是单纯忘了分号。

你可以先粗略记住一个规律:

普通赋值语句、调用语句后面,通常要有分号。

至于 IF、FOR、CASE 这些结构,后面我们会逐步讲。

五、先学会看懂一个最简单的 SCL 程序

先看一段非常基础的代码:

IF StartPB AND NOT Fault THEN
    MotorRun := TRUE;
ELSE
    MotorRun := FALSE;
END_IF;

很多人第一次看到这种写法,视觉上会有点紧张。
其实你只要按正常中文语义去理解就行:

如果 启动按钮按下 并且 没有故障
那么 电机运行等于真
否则 电机运行等于假
判断结束

这段程序里面,最关键的是几个关键词:

IF:如果
THEN:那么
ELSE:否则
END_IF:这个判断结束

你可以发现,SCL 的逻辑结构其实很像人平时说话。
所以初学时最好的方法不是死背,而是先把它翻译成人话。

比如上面这段代码,你完全可以先在脑子里说成:

“如果启动按钮按下并且没有故障,那就让电机运行;否则电机不运行。”

只要你能这样顺畅翻译,后面写代码就不会太吃力。

六、写第一个真正有感觉的程序:启停控制

下面我们写一个比刚才更像 PLC 小程序的例子。
假设我们要实现一个非常基础的控制:

按启动按钮,电机运行
按停止按钮,电机停止
有故障时,电机也停止

先说明一下:
这里只是为了学习 SCL 写法,所以逻辑会写得比较直接。真正工程项目里,还会考虑按钮边沿、自锁、模式选择、联锁条件等内容,后面我们再展开。

示例程序如下:

IF Fault THEN
    MotorRun := FALSE;
ELSIF StopPB THEN
    MotorRun := FALSE;
ELSIF StartPB THEN
    MotorRun := TRUE;
END_IF;

这里又出现了一个新关键字:

ELSIF:否则如果

这个结构的意思是:

如果故障存在,就停机。
否则如果停止按钮按下,也停机。
否则如果启动按钮按下,就运行。

这段代码看上去是不是已经很接近人说话的逻辑顺序了?

而且你会发现,SCL 在表达“多条件判断”时,比梯形图更紧凑。
特别是当条件越来越多时,这种优势会越来越明显。

七、SCL 里最基础的几种数据,你先有个概念

初学者不需要一开始就记所有数据类型,但有几类要先知道,因为你后面写程序一定会遇到。

1. BOOL

布尔量,也就是只有两种状态:

TRUE
FALSE

通常对应开关量逻辑,比如:

按钮是否按下
电机是否运行
故障是否存在
阀门是否打开
2. INT

整数类型。
适合存放不带小数的数,比如:

计数值
步骤号
报警编号
小范围设定值
3. REAL

实数类型,也就是可以带小数。
常用于:

温度
压力
流量
液位
模拟量换算结果
4. TIME

时间类型。
后面涉及定时器、延时、时间比较时会用到。

5. STRING

字符串。
比如报警文本、条码内容、设备名称等。

你暂时不用急着背细节,只要知道:
不同变量不是随便乱用的,它们有各自适合存放的数据类型。

这就像你不能拿温度变量去直接当字符串用,也不能拿布尔量去当带小数的工艺参数。

八、初学 SCL,最容易混淆的三个地方

这一部分非常重要。很多人不是学不会,而是一开始就掉进了这些坑里。

1. 赋值和比较分不清

看这两种写法:

MotorRun := TRUE;



IF MotorRun = TRUE THEN

它们不是一回事。

第一句是赋值,意思是“把 TRUE 给 MotorRun”。
第二句是比较,意思是“判断 MotorRun 是否等于 TRUE”。

一个是“给它”,一个是“看它是不是”。

很多新手程序写错,不是逻辑不懂,而是把这两个概念混掉了。

2. 忘记结束语句

比如写了 IF,却没写 END_IF。
写了 FOR,却没写 END_FOR。
这种错误在 SCL 里很常见。

因为 SCL 不是图形块自动收口,它需要你自己把结构写完整。
所以以后你每写一个 IF,都要本能地想到:
“我这个 IF 最后在哪里结束?”

3. 不重视缩进,结果自己都看不懂

比如下面这种写法,虽然有时未必报错,但阅读起来很痛苦:

IF StartPB THEN
IF NOT Fault THEN
MotorRun := TRUE;
END_IF;
END_IF;

而写成这样就清楚很多:

IF StartPB THEN
    IF NOT Fault THEN
        MotorRun := TRUE;
    END_IF;
END_IF;

所以从一开始就养成缩进习惯,非常值。
这不是“好看”而已,而是为了避免以后程序一长,连你自己都不想看。

九、为什么同样是 PLC 程序,SCL 更容易出现“语法错误”

这个现象很多人都经历过。
梯形图里,元件拖进去,线接好,通常就比较直观。
SCL 里哪怕逻辑是对的,也可能因为一个小地方报错。

常见原因有:

分号漏了
关键字拼错了
IF 没有正确结束
括号没配对
变量名写错
大小写或命名不一致
数据类型不匹配
把布尔量当数值用
把数值直接当字符串处理

所以你要理解一个现实:

SCL 比梯形图更依赖书写规范。

这不是它麻烦,而是因为它更接近“结构化文本语言”的特性。
但好处也同样明显:只要你养成规范习惯,后面程序会比纯图形方式更清楚。

十、初学者写第一个程序时,建议按这个顺序来

我很建议你不要一上来就写复杂流程,而是先按下面这个顺序练习。

第一步:先定义几个最简单的变量

比如:

StartPB
StopPB
Fault
MotorRun

你先只围绕这四个量写逻辑。

第二步:先只做单个判断

例如:

如果启动按钮按下,并且没有故障,则电机运行。

IF StartPB AND NOT Fault THEN
    MotorRun := TRUE;
END_IF;

先别急着加停止、复位、模式切换。
先把最小逻辑写通。

第三步:再补充 else 或 elsif

比如加上故障停机:

IF Fault THEN
    MotorRun := FALSE;
ELSIF StartPB THEN
    MotorRun := TRUE;
END_IF;

逐步加,不要一口气堆十个条件。

第四步:再考虑完整控制逻辑

比如:

启动
停止
故障
自动模式
急停
复位条件
联锁条件

这时候再扩展,思路会清楚很多。

十一、一个稍微完整一点的入门示例

下面给你一个更像实际控制的入门示例。
假设设备有以下要求:

必须在自动模式下
没有故障
没有急停
启动按钮按下后,电机运行
停止按钮按下后,电机停止

示例代码:

IF Fault OR EStop THEN
    MotorRun := FALSE;
ELSIF StopPB THEN
    MotorRun := FALSE;
ELSIF AutoMode AND StartPB THEN
    MotorRun := TRUE;
END_IF;

这段程序虽然简单,但已经能体现几个 SCL 的基础特点:

第一,它的判断顺序是清楚的。
先处理最危险、最优先的停机条件,再处理停止命令,最后处理启动条件。

第二,它把多个条件压缩成了比较紧凑的逻辑表达。
如果用梯形图,也能做,但会更分散。

第三,它已经开始体现“程序顺序思维”了。
也就是:先判断什么,后判断什么,优先级怎么安排。

这正是 SCL 学习中非常重要的一步。

十二、SCL 初学阶段,不要急着追求“写得复杂”

很多工程师一学 SCL,就特别想赶紧写出很厉害的东西,比如:

多层循环
数组批处理
配方系统
状态机
字符串解析
通信协议处理

这些以后当然都要学,但不是现在。

现在最重要的是把这些最基础的感觉建立起来:

我知道程序写在哪里
我知道一个判断结构怎么开始、怎么结束
我知道赋值是什么意思
我知道分号为什么重要
我知道变量名不能乱写
我能看懂最简单的 IF 程序
我能自己写一个最小启停逻辑

只要这些东西建立起来,后面进度会非常快。

反过来说,如果这些基础动作没养成,一上来就学高级内容,最后往往变成“能抄代码,但自己不会写”。

十三、写 SCL 时,脑子里最好一直保留这三个意识
1. 先想逻辑,再写语句

不要一边想一边乱敲。
最好先用中文把逻辑说清楚:

如果什么条件成立,就做什么;否则做什么。
说清楚了,再写成 IF 结构。

2. 每一层结构都要有开始和结束

有 IF,就一定要想到 END_IF。
有循环,就一定要想到循环结束。
这样不容易丢结构。

3. 代码不是写给 PLC 看,是写给人维护的

PLC 当然会执行程序,但工程项目最终一定要人来看、来改、来接手。
所以从一开始就注意:

命名清楚
缩进整齐
逻辑分层
条件不要乱堆
适当加注释

这比你少写几行代码更重要。

十四、这一篇学完后,你至少应该掌握什么

如果这一篇你消化得比较顺,至少应该建立下面这些基础认知:

SCL 程序不是随便写在哪儿,而是写在具体的程序块里。
SCL 的编辑界面和梯形图不同,它更强调语句结构和层次。
一个最基础的 SCL 程序通常由变量、表达式、赋值语句和结构关键字组成。
IF、THEN、ELSE、END_IF 是最基础的判断结构。
普通语句后面的分号很重要。
缩进虽然有时不是硬性要求,但对阅读和维护非常关键。
初学阶段最重要的不是写复杂,而是把最基础的判断和赋值写对、写清楚。

十五、小结:真正的入门,不是会抄代码,而是敢自己写第一段

很多人学 SCL 时,会有一种错觉:
好像只有写出很多行代码,才算真的入门。

其实不是。

真正的入门,往往是你第一次能自己独立写出这样一段最小逻辑:

IF StartPB AND NOT Fault THEN
    MotorRun := TRUE;
ELSE
    MotorRun := FALSE;
END_IF;

因为从这一刻开始,你不再只是“看得懂”,而是开始“能表达”。

这一步特别重要。

SCL 学习的本质,不是记住多少关键字,而是逐渐让你拥有一种能力:
把设备逻辑用结构化的方式写出来。

而这个能力,就是从最基础的程序块、变量、赋值、IF 结构、分号、缩进这些看似很小的地方开始建立的。

亲,下一篇我建议直接接着写:

第三篇《变量、数据类型与地址概念:SCL 程序为什么不能乱定义变量》

这一篇会把很多人最容易模糊的内容讲透,包括:

变量到底怎么分类
输入、输出、临时变量、静态变量是什么
BOOL、INT、DINT、REAL 怎么区分
为什么有些运算会报类型错误
地址概念在 SCL 里应该怎么理解

这样后面再进入 IF、CASE、FOR,就会更稳。
下载资料前请先绑定手机号码
对不起,请登录后再发表评论!

触屏端
扫一扫手机也能发信息
明扬工控商城-工控网-工控自动化真品,一站式专业服务!