0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

西门子SCL语言编程常用指令

PLC技术圈 来源:PLC技术圈 2020-09-07 17:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

指令

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

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

图1 读写存储器

图2 转换操作

图3 程序控制指令

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

程序控制指令

程序控制指令见以下表格。

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

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

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" True False False False
"Tag_2" False True False False
"Tag_3" False False True False
"Tag_Value" 10 20 30 0

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" 0 1,3,5 6,7,8,9,10 16,17,20,21,22,23,24,25 其他
"Tag_1" 1 - - - -
"Tag_2" - 1 - - -
"Tag_3" - - 1 - -
"Tag_4" - - - 1 -
"Tag_5" - - - - 1

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]
3 5 7 9
结果 a_array[2] a_array[4] a_array[6] a_array[8]
15 25 35 45

WHILE:满足条件时执行

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

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

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

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

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

WHILE <条件>

DO <语句>;

END_WHILE;

图12 WHILE语句

参数

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

参数 数据类型 存储区 说明
<条件> BOOL I、Q、M、D、L 表达式,每次执行循环之前都需要进行求值。
<语句> - 在满足条件时,要执行的语句。如果不满足条件,则程序将从 END_WHILE 后继续执行。

示例

图13 WHILE示例

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

初始 循环结束
Tag_2 5
Tag_1 0 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_2 5
Tag_1 0 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"进行递增并接受检查。

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 的条件。

GOTO:跳转

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

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

注意:

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

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

字母(a 至 z,A 至 Z)

字母和数字组合;请必须字母为开始

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

GOTO <跳转标签>;

...

<跳转标签>: <语句>

示例

图22 GOTO示例

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

操作数
Tag_Value 1 2 3 其他
初始值 结束值 初始值 结束值 初始值 结束值 初始值 结束值
Tag_1 0 1 0 0 0 0 0 0
Tag_2 0 1 0 1 0 0 0 0
Tag_3 0 1 0 1 0 1 0 0
Tag_4 0 1 0 1 0 1 0 1

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

RETURN:退出块

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

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

图23 RETURN语句

示例

图24 RETURN示例

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 西门子
    +关注

    关注

    98

    文章

    3272

    浏览量

    119755
  • 编程语言
    +关注

    关注

    10

    文章

    1959

    浏览量

    38927
  • SCL
    SCL
    +关注

    关注

    1

    文章

    244

    浏览量

    17937

原文标题:西门子SCL语言编程,常用指令介绍

文章出处:【微信号:xue_PLC,微信公众号:PLC技术圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    西门子推出Tessent IJTAG Pro

    西门子数字化工业软件宣布推出 Tessent IJTAG Pro,通过将传统的串行执行的操作转变为并行操作,实现基于 IEEE1687 标准的 IJTAG 输入 / 输出方式的革新,同时提供对定制化
    的头像 发表于 11-03 09:23 373次阅读

    西门子变频器的选择技巧

    在工业自动化领域,变频器作为电机控制的核心设备,其选型直接关系到生产效率和设备寿命。西门子作为全球领先的电气工程品牌,其变频器产品线丰富,涵盖G120、S120、V20等多个系列。面对不同应用场
    的头像 发表于 08-23 23:19 1374次阅读
    <b class='flag-5'>西门子</b>变频器的选择技巧

    西门子PLC如何使用Modbus 485通讯传输接收数据

    西门子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站协议库(西门子标准库指令)。使用 Modbus RTU 主站指令库,可以读写 Modbus
    的头像 发表于 08-19 13:52 4005次阅读
    <b class='flag-5'>西门子</b>PLC如何使用Modbus 485通讯传输接收数据

    西门子SMART200脉冲指令资料

    西门子SMART200脉冲指令
    发表于 07-29 17:29 0次下载

    西门子发布关于美国解除近期对中国EDA出口限制的声明

    西门子今天就美国解除近期对中国 EDA 出口限制发布以下声明。 西门子近期获美国商务部工业与安全局 (BIS) 通知,该局于 5 月 23 日致函西门子所提出的 对中国客户出口电子设计自动化
    的头像 发表于 07-03 19:01 2358次阅读

    西门子Smart200网口穿透教程

    2021_昆仑通态_物联网_穿透教程_西门子Smart200网口穿透_V1.0_0414
    发表于 06-09 15:04 3次下载

    工业智能网关可以采集西门子PLC吗

    工业智能网关可以采集西门子PLC的数据。物通博联提供全面接入西门子PLC的数据采集解决方案,其工业智能网关支持多种网络制式,可采集各种工业设备数据,包括主流PLC品牌如西门子、施耐德、三菱、欧姆龙
    的头像 发表于 05-26 09:14 681次阅读

    西门子TIA Portal中使用CFC语言实现电机控制的全流程

    西门子 CFC(Continuous Function Chart)是一种图形化的编程语言,主要用于西门子自动化系统(如 SIMATIC PCS 7、TIA Portal 等)中的过程
    的头像 发表于 05-21 10:47 3212次阅读
    在<b class='flag-5'>西门子</b>TIA Portal中使用CFC<b class='flag-5'>语言</b>实现电机控制的全流程

    西门子再收购EDA公司 西门子宣布收购Excellicon公司 时序约束工具开发商

    精彩看点 此次收购将帮助系统级芯片 (SoC) 设计人员通过经市场检验的时序约束管理能力来加速设计,并提高功能约束和结构约束的正确性   西门子宣布 收购 Excellicon 公司 ,将该公司用于
    的头像 发表于 05-20 19:04 1283次阅读
    <b class='flag-5'>西门子</b>再收购EDA公司  <b class='flag-5'>西门子</b>宣布收购Excellicon公司  时序约束工具开发商

    西门子伺服电机简明样本

    西门子伺服电机简明样本
    发表于 04-14 15:36 2次下载

    西门子荣获IDC MarketScape MES领导厂商称号

    近日,西门子数字化工业软件在IDC MarketScape发布的《2024-2025全球制造执行系统供应商报告》中脱颖而出,被评为制造执行系统(MES)领导厂商。这一荣誉标志着西门子在MES领域
    的头像 发表于 02-10 11:11 959次阅读

    ABB机器人与西门子PLC通讯案例

    在现代工业自动化领域中,机器人与可编程逻辑控制器(PLC)之间的通讯是实现高效、精准生产线的关键。ABB机器人与西门子PLC作为行业内的佼佼者,其通讯技术的掌握对于提升生产效率、优化生产流程具有
    的头像 发表于 02-02 16:43 3188次阅读

    西门子变频器图纸

    西门子变频器图纸
    发表于 01-07 18:19 16次下载

    三菱PLC与西门子PLC比较

    三菱电机(Mitsubishi Electric)和西门子(Siemens)都是全球知名的自动化和控制系统供应商,它们各自生产的PLC(可编程逻辑控制器)广泛应用于工业自动化领域。 1. 品牌历史
    的头像 发表于 12-26 16:46 4416次阅读

    西门子6FC5210-0DF52-2AA0 NCU伺服模块

    西门子电气是西门子家族的重要成员之一, 它是一款功能强大、性能稳定的家用电器品牌,涵盖了厨房电器、冰箱、洗衣机、空调、热水器等多个品类。西门子电气的产品线非常丰富,其产品在设计和性能方面都表现出色
    的头像 发表于 12-24 11:28 658次阅读
    <b class='flag-5'>西门子</b>6FC5210-0DF52-2AA0 NCU伺服模块