直播课堂
HOME
直播课堂
正文内容
plc scl编程讲解 PLC编程小白必知:关于SCL语言编程方法的简介
发布时间 : 2024-11-25
作者 : 小编
访问数量 : 23
扫码分享至微信

PLC编程小白必知:关于SCL语言编程方法的简介

SCL :Structured Contorl Language,结构化控制语言。

在TIA博途软件中,默认支持SCL语言,在建立程序块时可以直接选择SCL语言。

SCL语言类似计算机高级语言,如果你有C、Java、C++、Python这种高级语言的学习经历,再学习SCL就会容易很多。

在用SCL语言编程时,主要用IF...THEN/FOR/WHILE语句去构造条件、循环、判断这样的结构,在这些结构中再次添加指令,去实现逻辑判断。所有程序的编写都是在纯文本的环境下编辑,不像梯形图那么直观。

今天就和大家聊一下关于SCL编程的基础知识:

变量与常量地址与符号寻址方式

以上是PLC技术学习的基础知识,但凡懂一点PLC,对上面三部分内容应该都不会陌生。所以我也不打算把书本上的东西再重复一遍,这篇文章我只介绍在SCL中,上面三部分内容的使用以及与梯形图中的不同之处。

1、变量与常量

简单点来说,在程序运行时如果一个数据的值是不确定的我们就把它称作变量 。比如锅炉的温度,水流的速度,这些数据会随着时间(或者其他因素)波动。

反之,肯定会有一部分数据,不会受到外界的干扰,就是唯一值,这部分数据我们就称作常量 。比如一天有24小时,π=3.14。

常量的存在主要是为了存储一些固定的数值,在编程时使用常量能减少出错率。声明后的常量也比较容易修改。

举例来说,程序中如果有多处使用π,我们可以先定义π为常量,然后在编程时只需要把π带入公式即可,这样就能减少每次输入3.14出错的概率。后续维护时,想提高计算精度,我们可以直接在声明中改变π,使π=3.1415926,否则多处的数值改起来会相当麻烦。

无论是变量还是常量,在 TIA Portal 中按照作用的区域又可以分为全局和局部 。也就是我们常说的全局变量、全局常量,局部变量、局部常量。

全局变量 (或者全局常量)如果简单理解,大概分为两种,一种是在PLC变量表中建立的变量(或者常量)。还有一种是全局DB中创建的变量(或者常量)

全局变量可以被PLC中的所有程序使用,比较典型的就是PLC中的 I、Q、M存储区。

局部变量 (或者局部常量)一般是在FC/FB中建的变量(或者常量),也就是我们常说的内部变量(或者内部常量)

正常情况我们在某一个FC/FB中声明的内部变量,只会在该FC/FB中使用。但是TIA Portal软件中对该要求没有强制,也就是说FC/FB的内部变量也是可以被其他的FC/FB处理的。

在SCL编程时我们最好不要使用外部程序,处理内部变量,否则在程序移植时很容易出错。

2、地址与符号

变量的声明: 变量的声明有时候也叫变量定义,定义变量通常要指定变量的名称、数据类型,默认值等属性。

在SCL编程中,一定记住这个准则:变量要先定义后使用

变量的主要作用是用于存储数据,是数据存储的基本单元。声明变量就是向PLC的寄存器中,申请一块特定的区域用于存储数据。

这块区域的属性就是变量的属性,比如一个短整型变量占用2个字节,单精度浮点型数据占用4个字节。

在 TIA Portal 中声明局部变量会像上图中所示,利用表格的形式定义各种数据。

Input、Output、Inout这三种是FB对外的接口(形式参数),Static、Temp、Constant主要用于FB程序内部。

常量定义 :在声明常量时,并不像变量那样占用PLC的特定存储区域,所以常量也就没有绝对地址。因为常量就代表了特定的数值,在程序中也禁止修改常量。

上图是定义局部常量的方法,全局常量在PLC变量表的【用户常量】标签页里定义,如下图所示:

3、寻址方式

寻址就是我们对数据的访问方式,有绝对地址寻址符号寻址 两种。

PLC中的存储区域主要有四种:I、Q、M、DB。我们可以直接通过地址进行读取数据,比如 I0.0、MW10、DB1.DBW20。这种访问数据的方式就叫做绝对地址寻址

前面讲过,变量要先定义再使用,在定义变量的过程中,我们就赋予了绝对地址一个特殊的符号名称,通过定义的符号进行数据访问就是符号寻址。

在TIA Portal 中使用绝对地址编程时,软件会自动添加默认符号(博途不允许无符号名称的变量出现),并且增加了优化访问模式的DB。可见在S7-1200/1500编程中,弱化了绝对寻址。

SCL编程时符号寻址的书写格式:

DB块变量的寻址格式:"DB块名称".变量名称

PLC变量的寻址格式:"变量名称"

局部变量的寻址格式:#变量名称

上图是三种变量在SCL程序编写过程中,书写的格式,在编程SCL程序时需要严格遵守。

忘记书写格式时,可以通过拖拽的方式使用变量,或者使用软件的智能关联功能。

SCL编程时也可以使用变量前加 % 的方式使用绝对地址寻址,DB块变量的书写格式为%DB块号.变量地址。TIA PORTAL软件会判断该地址有没有对应符号名称,如果有则立即转换为符号名称,没有则保留绝对地址。

如果是PLC变量,也可以通过%变量地址的方式使用绝对地址寻址,TIA PORTAL软件会判断该地址有没有对应符号名称,如果有则立即转换为符号名称,没有则新建符号名称。

实例 SCL编程,这9种程序控制指令必须掌握

SCL作为一种编程语言,可以实现LAD/FBD所有的功能,大多数的指令与LAD/FBD都是相同的,只是在编辑器中的外形不同。只有一些指令使用是不太一样的甚至LAD/FBD没有的,这里只介绍这些不同的。

SCL特殊的指令有以下几种,如图1-3红框中的指令:

图1 读写存储器

图2 转换操作

图3 程序控制指令

在这三部分中,读写存储器的PEEK POKE指令可以参考链接,转换操作可以参考链接,这里只介绍图3的程序控制指令。

【文末免费领取学习资料】

【文末免费领取学习资料】

【文末免费领取学习资料】

程序控制指令

程序控制指令是SCL编程的基础,接近高级语言的指令,虽然这些功能通过LAD/FBD也可以实现,但使用SCL编写会更加方便,逻辑条理也更加清晰。

程序控制语句说明选择IF-THEN语句用于将程序执行转移到两个备选分支之一(取决于条件为 True 还是 False);CASE语句用于选择执行 n 个备选分支之一(取决于变量值)循环;FOR语句只要控制变量在指定值范围内,就重复执行某一语句序列;WHILE-DO语句只要仍满足执行条件,就重复执行某一语句序列;REPEAT-UNTIL语句重复执行某一语句序列,直到满足终止条件为止;程序跳转CONTINUE语句停止执行当前循环迭代;EXIT语句无论是否满足终止条件,都会随时退出循环;GOTO语句使程序立即跳转到指定标签;RETURN语句使程序立刻退出正在执行的块,返回到调用块。下面详细介绍各条指令的用法。

(1)IF:条件执行

说明:使用"条件执行"指令,可以根据条件控制程序流的分支。该条件是结果为布尔值(True 或 False)的表达式。可以将Bool变量、逻辑表达式或比较表达式作为条件。

执行该条件执行指令时,将对指定的表达式进行运算。如果表达式的值为 True,则表示满足该条件;如果其值为 False,则表示不满足该条件。

参数 根据分支的类型,可以对以下形式的指令进行编程:

IF...THEN... 分支: IF <条件>THEN <语句1>END_IF;

图4 IF...THEN... 分支

如果满足该条件,则将执行 THEN 后编写的指令。如果不满足该条件,则程序将从 END_IF 后的下一条指令开始继续执行。

IF...THEN... ELSE...分支: IF <条件>THEN <语句1>ELSE <语句2>END_IF;

图5 IF...THEN... ELSE...分支

如果满足该条件,则将执行 THEN 后编写的语句。如果不满足该条件,则将执行 ELSE 后编写的语句。不论执行哪一个语句,之后都将从 END_IF 后的下一条指令开始继续执行。

IF...THEN... ELSIF...分支: IF <条件1>THEN <语句1>ELSIF <条件2>THEN <语句2>END_IF;

图6 IF...THEN... ELSIF...分支

如果满足条件1,则将执行 THEN 后的语句1,执行这些语句后,程序将从 END_IF 后继续执行。

如果不满足条件1,则将检查条件2。如果满足条件2,则将执行 THEN 后的语句2。执行这些语句后,程序将从 END_IF 后继续执行。

如果不满足任何条件,则直接执行 END_IF 后的程序部分。

在 IF 指令内可以嵌套任意多个 ELSIF 和 THEN 组合。可以选择对 ELSE 分支进行编程。

参数

下表列出了该指令的参数:

参数

数据类型

存储区

说明

<条件>

BOOL

I、Q、M、D、L

待求值的表达式。

<语句>

-

在满足条件时,要执行THEN后的语句。如果不满足条件,则执行 ELSE 后编写的语句。

示例

图7 IF示例

下表展示了不同的操作数数值对目标变量的影响:

操作数值"Tag_1"TrueFalseFalseFalse"Tag_2"FalseTrueFalseFalse"Tag_3"FalseFalseTrueFalse"Tag_Value"1020300

(2)CASE:创建多路分支

说明:使用"创建多路分支"指令,可以根据数字表达式的值执行多个指令序列中的一个。

按如下方式声明此指令:

CASE <变量> OF

<常数1>: <语句1>;

<常数2>: <语句2>;

......

<常数n>: <语句n>;

ELSE <语句>;

END_CASE;

图8 CASE语句

参数

下表列出了该指令的参数:

参数

数据类型

存储区

说明

<变量>

整数、位序列*

I、Q、M、D、L

与设定的常数值进行比较的值。

<常数>

位序列

若为位序列,则常数可以为以下值:

二进制数(例如,2#10) 八进制数(例如,8#77) 十六进制数(例如,16#AD) 未定型的常数(例如,1000)

整数

作为指令序列执行条件的常数值。常数可以为以下值:

整数(例如,5) 整数范围(例如,15 到 20) 由整数和范围组成的枚举(例如,10、11、15 到 20)

<语句>

-

-

当表达式的值等于某个常数值时,将执行该常数后的各种指令。如果不满足条件,则执行 ELSE 后编写的指令。如果两个值不相等,则执行这些指令。

* TIA PORTAL V16开始支持位序列数据类型的变量

示例

图9 CASE示例

下表展示了不同的操作数数值对目标变量的影响:

操作数值"Tag_Value"01,3,56,7,8,9,1016,17,20,21,22,23,24,25其他"Tag_1"1----"Tag_2"-1---"Tag_3"--1--"Tag_4"---1-"Tag_5"----1

【文末免费领取学习资料】

【文末免费领取学习资料】

【文末免费领取学习资料】

(3)FOR:在计数循环中执行

说明:使用"在计数循环中执行"指令,重复执行程序循环,直至运行变量不在指定的取值范围内。

也可以嵌套程序循环。在程序循环内,可以编写包含其它运行变量的其它程序循环。

通过指令"复查循环条件"(Continue),可以终止当前正在运行的程序循环。通过指令"立即退出循环"(Exit)终止整个循环的执行。

注意:

有关运行次数和运行变量的信息:

程序运行时无法更改运行次数。出于性能原因,应在块接口的"Temp"部分中声明运行变量。在循环中,该运行变量无法更改。

按如下方式声明此指令:

FOR <运行变量> := <起始值> TO <结束值> BY <增量> DO

<语句>;

END_FOR;

如果增量为1,可以简写为:

FOR <运行变量> := <起始值> TO <结束值> DO

<语句>;

END_FOR;

图10 FOR语句

下表列出了该指令的参数:

参数

数据类型

存储区

说明

<运行变量>

有符号整数、无符号整数*

I、Q、M、D、L

执行循环时会计算其值的操作数。执行变量的数据类型将确定其它参数的数据类型。

<起始值>

I、Q、M、D、L

表达式,在运行变量首次执行循环时,将为运行变量分配该表达式的值。

<结束值>

I、Q、M、D、L

表达式,在运行程序最后一次循环时会为运行变量分配该表达式的值。在每个循环后都会检查运行变量的值:

未达到结束值:执行符合 DO 的语句 达到结束值:最后执行一次 FOR 语句 超出结束值:完成 FOR 循环

执行该指令期间,不允许更改结束值。

<增量>

I、Q、M、D、L

表达式,根据增量表达式的值,执行变量在每次循环后都会递增(正增量)或递减(负增量)自身变量值。

如果未指定增量,则在每次循环后执行变量的值加 1。

执行该指令期间,不允许更改增量。

<语句>

-

只要运行变量的值在取值范围内,每次循环都就会执行的语句。取值范围由起始值和结束值定义。

*TIA PORTAL V16开始支持无符号整数类型的变量

示例

图11 FOR示例

Tag_Value 操作数乘以b_array 数组变量的元素 (2, 4, 6, 8)。并将计算结果读入到a_array 数组变量的元素 (2, 4, 6, 8) 中。

下表展示了给定 Tag_Value 与 b_array[i] 的值得到 a_array[i] 的结果:

设定Tag_Value值5设定b_array[2]b_array[4]b_array[6]b_array[8]值3579结果a_array[2]a_array[4]a_array[6]a_array[8]值15253545

(4)WHILE:满足条件时执行

说明:使用"满足条件时执行"指令可以重复执行程序循环,直至不满足执行条件为止。该条件是结果为布尔值(True 或 False)的表达式。可以将逻辑表达式或比较表达式作为条件。

执行该指令时,将对指定的表达式进行运算。如果表达式的值为 True,则表示满足该条件;如果其值为 False,则表示不满足该条件。

也可以嵌套程序循环。在程序循环内,可以编写包含其它运行变量的其它程序循环。

通过指令"复查循环条件"(Continue),可以终止当前连续运行的程序循环。通过指令"立即退出循环"(Exit)终止整个循环的执行。

可按如下方式声明此指令:

WHILE <条件>

DO <语句>;

END_WHILE;

图12 WHILE语句

参数

下表列出了该指令的参数:

参数

数据类型

存储区

说明

<条件>

BOOL

I、Q、M、D、L

表达式,每次执行循环之前都需要进行求值。

<语句>

-

在满足条件时,要执行的语句。如果不满足条件,则程序将从 END_WHILE 后继续执行。

示例

图13 WHILE示例

下表展示了循环初始和循环结束时变量值的变化

初始循环结束Tag_25Tag_105

【文末免费领取学习资料】

【文末免费领取学习资料】

【文末免费领取学习资料】

(5)REPEAT:不满足条件时执行

说明:使用"不满足条件时执行"指令可以重复执行程序循环,直至不满足执行条件为止。该条件是结果为布尔值(True 或 False)的表达式。可以将逻辑表达式或比较表达式作为条件。

执行该指令时,将对指定的表达式进行运算。如果表达式的值为 True,则表示满足该条件;如果其值为 False,则表示不满足该条件。

即使满足终止条件,至少也会执行一次循环内的语句。

也可以嵌套程序循环。在程序循环内,可以编写包含其它运行变量的其它程序循环。

通过指令"复查循环条件"(Continue),可以终止当前连续运行的程序循环。通过指令"立即退出循环"(Exit)终止整个循环的执行。

可按如下方式声明此指令:

REPEAT <语句>;

UNTIL <条件>

END_REPEAT;

图14 REPEAT语句

参数

下表列出了该指令的参数:

参数

数据类型

存储区

说明

<语句>

-

在设定条件的值为 False 时执行的指令。即使满足终止条件,此指令也执行一次。

<条件>

BOOL

I、Q、M、D、L

表达式,每次执行循环之后都需要进行求值。如果表达式的值为 False,则将再次执行程序循环。如果表达式的值为 True,则程序循环将从 END_REPEAT 后继续执行。

示例

图15 REPEAT示例

下表展示了循环初始和循环结束时变量值的变化

初始循环结束Tag_25Tag_106

(6)CONTINUE:复查循环条件

说明:使用"复查循环条件"指令,可以结束 FOR、WHILE 或 REPEAT 循环的当前程序运行。

执行该指令后,将再次计算继续执行程序循环的条件。该指令将影响其所在的程序循环。

图16 CONTINUE用在FOR循环

图17 CONTINUE用在WHILE循环

图18 CONTINUE用在REPEAT循环

示例

图19 CONTINUE示例

下表展示了计算结果:

变量计算结果"DB10".Test[0]-"DB10".Test[1]-"DB10".Test[2]-"DB10".Test[3]-"DB10".Test[4]-"DB10".Test[5]1"DB10".Test[6]1"DB10".Test[7]1

如果满足条件 i < 5,则不执行后续值分配 ("DB10".Test[i] := 1)。运行变量 (i) 以增量"1"递增,然后检查其当前值是否在设定的循环取值范围内。如果执行变量在循环取值范围内,则将再次计算 IF 的条件。

如果不满足条件 i < 5,则将执行后续值分配 ("DB10".Test[i] := 1) 并开始一个新循环。在这种情况下,执行变量也会以增量"1"进行递增并接受检查。

(7)EXIT:立即退出循环

说明:使用"立即退出循环"指令,可以随时取消 FOR、WHILE 或 REPEAT 循环的执行,而无需考虑是否满足条件,并在循环结束(END_FOR、END_WHILE 或 END_REPEAT)后继续执行程序。

该指令将影响其所在的程序循环。

图20 EXIT语句

示例

图21 EXIT示例

下表展示了计算结果:

变量计算结果"DB10".Test[0]1"DB10".Test[1]1"DB10".Test[2]1"DB10".Test[3]1"DB10".Test[4]1"DB10".Test[5]1"DB10".Test[6]-"DB10".Test[7]-

如果满足条件 i > 5,则将取消循环执行。程序将从 END_FOR 后继续执行。

如果不满足条件 i <= 5,则将执行后续值分配 ("DB10".Test[i] :=1) 并开始一个新循环。将运行变量 (i) 以 1 进行递增,并进行检查该变量的当前值是否在程序中设定的循环取值范围之内。如果执行变量 (i) 在循环取值范围内,则将再次计算 IF 的条件。

【文末免费领取学习资料】

【文末免费领取学习资料】

【文末免费领取学习资料】

(8)GOTO:跳转

说明:使用"跳转"指令,可以从标注为跳转标签的指定点开始继续执行程序。

跳转标签和"跳转"指令必须在同一个块中。在一个块中,跳转标签的名称只能指定一次。每个跳转标签可以是多个跳转指令的目标。不允许从"外部"跳转到程序循环内,但允许从循环内跳转到"外部"。

注意:

LAD/FBD语言内的SCL段,不能使用GOTO指令。

跳转标签遵循以下语法规则:

字母(a 至 z,A 至 Z) 字母和数字组合;请必须字母为开始

可按如下方式声明此指令:

GOTO <跳转标签>;

...

<跳转标签>: <语句>

示例

图22 GOTO示例

下表展示了每个操作数数值对目标变量的变化影响:

操作数值Tag_Value123其他

初始值结束值初始值结束值初始值结束值初始值结束值Tag_101000000Tag_201010000Tag_301010100Tag_401010101

根据"Tag_Value"操作数的值,程序将从对应的跳转标签标识点开始继续执行。例如,如果"Tag_Value"操作数的值为 2,则程序将从跳转标签"MyLABEL2"开始继续执行。在这种情况下,将跳过"MyLABEL1"跳转标签所标识的程序行。

(9)RETURN:退出块

说明:使用"退出块"指令,可以终止当前处理块中的程序执行,并在调用块中继续执行。

如果该指令出现在块结尾处,则可以跳过。

图23 RETURN语句

示例

图24 RETURN示例

如果"Tag_Error"操作数的信号状态不为 0,则将终止当前处理块中的程序执行。

(来源:网络,版权归原作者所有,侵删)

相关问答

PLCS7-SCL是什么意思?

学过高级语言的对SCL是完全没有压力的。可以说,SCL(SCL其实是西门子的称呼,其他基于61131-3标准的叫ST,结构化文本)简化版的pascal。但是,真正的完全支持611...

S7系列的PLC的编程语言LAD、STL、SCL、GRAPH、HIGRAPH、CFC分别是什么意思?

LAD:梯形图----------日系称作为LDSTL:指令表---------日系称作为ILSCL:结构文本-------日系称作为STGRAPH:图形编程-----日系称作为SFCHIGRAPH:...

西门子scl语言使用方法?

你好,SCL(StructuredControlLanguage)是一种编程语言,用于编写西门子可编程逻辑控制器(PLC)的程序。以下是使用SCL语言的步骤:1.打开S7编程软件,创建...

在scl中如何置位?

西门子PLC编程语言有以下五种:梯形图LAD,功能块图FBD,语句表STL,结构控制语言SCL,顺序功能图Graph。下面我们组态演示如何在SCL中置位以及注意事项。首先,...这...

stl语言和scl语言的区别?

STL语言和SCL语言都是西门子公司的工业自动化编程语言,不过二者在语法和特点上有所不同。STL(StructuredTextLanguage)语言是一种结构化文本语言,它采用类...

scl编程语言用途?

SCL含义为结构化控制语言(StructuredControlLanguage),是一种类似于计算机高级语言的编程方式,它的语法规范接近计算机中的PASCAL语言,符合国际标准IEC6...

PLC初学者如何从梯形图过渡到ST语言编程?

说一点个人看法。如果你本来是学计算机的转行到工控自动化行业,那么ST语言编程对你来说应该是轻而易举,看看帮助文件或者实际测试一下应该很容易就能上手!下...

data和scl的区别?

Data和SCL代表着两个不同的概念。1.Data(数据):Data是指一组未经加工或处理的原始信息。它可以是数字、文本、图像、音频、视频等形式的信息,没有被组织、解...

plc中scl图是什么?

结构化文本编程,类似高级语言编程结构化文本编程,类似高级语言编程

Plc与c语言哪个更难?

当然C语言了,难谈不上。入门都简单。C入门很简单,但是想玩的出神入化。。。。难得很!PLC的实质就是单片机的逻辑化。可视化,让它更简单。电工级的操作就可以...

 puzzor  ip网络对讲系统 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部