工业自动化“隐形王牌”:SCL语言

一  需要的软件

编程软件:博图TIA Portal V17;模拟软件:S7-PLCSIM  Advanced V5.0。 

二 常规变量的测试

1. 创建FC块

图片

双击“添加新块”,在弹出的对话框中选择需要创建的块类型“函数FC”,语言选择“SCL”语言,名称对话框填入块名称,这里命名为“FC3”;以上工作完成后,单击右下角“确定”;建成的块如下: 

图片

2. 通用变量表数据编程

这里通用变量表数据指系统自带的变量、I/O变量、M区变量。

下面以启停保最基本的程序演示为例:

(1)定义变量 

图片

(2)编辑程序 

图片

这里使用了REGION区间函数,可以对代码进行整理,也可以对其划分的一个区间的代码进行剪切,粘贴,复制,删除插入等操作,方便后续编程过程中,代码的重复使用,修改等。输入程序的过程中,变量只需要直接输入变量表中的名称或者变量的地址,变量便可以被选择调用。

以上程序的含义是:Q输出电动机的状态等同于I输入点电动机启动和Q输出电动机触点的并联,然后再串联I输入常闭触点电动机停止;即起保停标准回路。

其中:

“:=”代表赋值的意思

OR是并联的含义;AND代表串联的含义

NOT代表取反,这里代表常闭触点;(如果没有NOT,则默认为常开点)

(3)程序执行 

图片

编写完的程序,一定记得在组织块中调用。 

图片

以上是变量表中常规I/O变量的执行。由于是I/O输入点所以不能强制。 

图片

换成M寄存器变量实际执行效果如下。M点可以执行强制操作。可以看到电动机启动强制为1时,电动机状态为运行,程序执行成功。 

图片

3.数据块的变量调用

图片

创建DB1_HMI数据块,取消优化块访问选项;创建成功后,创建启停保的变量。 

图片

这里主要讲DB块变量的输入,输入DB块变量时,直接用鼠标左键拖住DB块不要松开,拖入需要输入的程序段,然后输入后缀“.”符号,后面便会出现DB块里面的具体地址,选择需要的地址,便可以成功调用DB块里面的变量。输入结束后的情况如下: 

图片

在程序编写完成后,保存、编译及下载程序,监控效果如下: 

图片

如果我们需要模拟运行情况,用鼠标右击DB块界面的相应变量,在弹出的列表当中选择“修改操作数”。 

图片

在单击“修改操作数”弹出的对话框的修改值中输入1,单击“确认”,电动机启动将被执行。 

图片

图片

 程序段中的监控界面如下: 

图片

可以看出程序段中的执行结果和DB块中的变量状态一致,程序执行成功。

三 常用指令的调用及执行

1.上升沿和下降沿

图片

在右侧基本指令中拖入上升沿指令,弹出的对话框直接确认即可。 

图片

bool_in是检测0到1的状态变量,bool_out是在bool_in检测到0到1的变化时的输出变量,当bool_in检测到0到1的变化时,bool_out输出高电平。 

图片

上面是上升沿的示例,可以看到,在电动机启动"DB1_HMI".motor执行后,触发了"DB1_HMI".ZW高电平,"DB1_HMI".ZW1被置1,程序成功执行。低电平类似,只是检测1到0的状态时,输出被触发。

2. 定时器

将定时器拖入相应程序段时,跳出如下对话框: 

图片

单击右下角确认按钮,定时器被调用 

图片

IN:触发定时器工作的BOOL变量,为1时工作,为0时复位

PT:定时器设定值,格式为T#+时间单位,可以是分钟M,小时H,毫秒MS,秒S等,单位不能错。

Q:定时器输出,后面连接的变量应为BOOL量,定时器运行到设定时间时,将被置位。

ET:用于定时器运行状态存储,格式是TIME类型的变量 

图片

我们根据定时器的应用编写了一段程序,当IN为1时,定时器开始计时,20S后电动机运行,电动机运行后,阀门被打开,电动机停止后,阀门同时关闭。 

图片

这是20S定时时间到的状态,ET显示T#20S计时时间到,可以看到20S后电动机和阀门状态为TRUE,程序正常执行。

图片

这是定时器始动值IN为0的状态,定时器所有值被全部复位。其他定时器类同。

3. 计数器

将定时器拖入相应程序段时,跳出如下对话框: 

图片

单击右下角确认按钮,计数器被调用 

图片

CU:计数器脉冲触发位,连接的BOOL变量应为脉冲信号,变量由0到1时触发一次计数操作。

R:连接BOOL变量置位时复位计数器。

PV:计数器的设定值,格式为INT整型变量。

Q:计数器达到设定值PV时,Q连接的BOOL变量输出为1。

CV:计数器当前值,显示计数器当前的计数值;格式为INT整型变量。 

图片

以上是计数功能的案例,“启动”手动置位后,5S内定时输出置位,触发计数器计数,来回计数直到达到计数器设定值,计数输出置位;最终程序执行复位操作。

4. 运算及比较的运行操作

(1)加、减、乘、除 

图片

可以看出加减乘除的运算,乘和除是同一优先级,加和减是同一优先级;但乘和除的优先级高于加和减的运算;同一优先级,由左向右依次执行。

图片

 增加多个运算后,可以体现的更明显,计算结果符合优先级和前后顺序。

(2)比较运算 

图片

液位1和液位2进行比较,液位计1大于等于液位2时,电动机运行;以上是结果为假的运算结果。 

图片

以上是条件满足,电动机运行的情况。

大于>,等于=,小于<,大于等于>=,小于等于<=和以上类似。需要注意的是不等于的符号不是≠,而是<>。 

图片

这液位1和液位计2的数值不相等的执行结果。

(3)逻辑运算

这里介绍几种逻辑运算的符号,AND,OR,NOT,XOR,赋值:=指令;示例如下: 

图片

相当于梯形图的如下结构:

图片

可以得出如下结果:

1. SCL语言赋值的程序结构为:结果+赋值符号+变量及逻辑符号的判断公式

2. AND相当于触点的串联,是与的意思,与条件全部满足才能得出结果。与的符号还可以使用&来表示。

3. OR相当于触点的并联,是或的意思,或条件只要满足其中一个就能得出结果。

4. NOT相当于触点类型转换为常闭触点,是取反的意思。

5. XOR是两个输入状态不同时输出为真,相同时输出假;异或运算仅支持BOOL类型。

6. 需要注意分号,等号等符号的输入必须是英文输入方式,中文会报错。

7. 每条代码必须以分号结尾

8. SCL语言对变量名、函数名等区分大小写,例如#Input1与#input1被视为不同变量。

9. 优先级从高到低:括号 > 算术运算符(如*、/) > 比较运算符 > 逻辑运算符(如NOT > AND > OR)。

10. 字符用单引号包裹,例如'A';字符串用双引号,例如"Hello"。

四 程序控制指令

1. IF… THEN …END IF语句

图片

当满足液位计1大于液位2数值时,电动机运行。这个语句的含义是仅当条件满足时执行指定逻辑。

2. IF… THEN …ELSE…END IF语句

图片

当满足液位计1大于液位2的数值时,电动机运行;如果不满足则阀门打开,可以看出这个例子当中不满足条件,所以阀门打开。这个语句的含义是根据条件选择执行不同的逻辑分支。

3. IF… THEN …ELSE…END IF语句

图片

这是一个多路条件判断语句,哪一路条件为真就执行哪一路程序,这里第二路条件为真,所以电动机运行;这个语句的含义是支持多个条件依次判断,适用于复杂逻辑场景。还可以写成如下形式: 

图片

4. IF嵌套语句

图片

当液位1的值大于液位2的值时,执行嵌套内的IF语句,阀门打开后,泵运行。可以看出来程序运行成功。

5. CASE语句

图片

CASE语句用于实现多分支条件控制,适用于需要根据不同状态或值执行不同操作的场景。CASE后面的变量需要整型数据,不接受浮点型、字符串和Bool量。根据变量的值或状态来选择执行对应的程序段。这里可以看到执行了第二条程序段;执行条件可以是一个状态或者值,可以是两个状态或者值,之间用英文版逗号隔开;也可以是一个区间的值。若不添加ELSE且未匹配条件,可能导致逻辑遗漏;建议始终包含ELSE以增强鲁棒性。

6. FOR语句

图片

以上是数组赋值程序,#i是temp的INT类型变量,AC

图片

是数组变量,相当于数组内每一位值乘以2,则AC[1]=2, AC[2]=4…AC[5]=10; 

图片

以上是By默认步数等于1;FOR语句主要用来完成循环和赋值的功能。

 SCL语言相比梯形图更具有便捷性,代码简洁,程序较短;可以使用少量的程序段便捷的处理复杂的运算及逻辑判断;SCL语言作为结构化控制语言,其核心优势在于高度的灵活性和强大的数据处理能力。它采用结构化编程范式,支持函数、数组、复杂逻辑运算等高级功能,尤其适合处理多维数组、复杂算法及大规模数据操作。SCL的语法接近C语言,对有编程基础的人员更友好,同时支持与梯形图(LAD)等其他PLC语言混合编程,提高了开发效率和代码可重用性。此外,SCL遵循IEC 61131-3标准,兼容性强,能够适应工业自动化领域对高可靠性和远程控制的需求,在复杂控制逻辑和多设备协同场景中表现突出。

相比梯形图,其编译后的机器码执行效率较低,且部分功能实现(如某些底层操作)需要结合其他语言;这是SCL语言劣势部分;可以和常规梯形图结合使用,增加程序的简洁性,减少编程的工作量,提升工作效率。

 

作者:

网名禅主,80后,2015年开始从事环保行业自控及电气系统设计,调试工作,已有10年时间;先后从事过污泥处理,工业废水处理,污水处理,市政泵站,调蓄池相关工作。

图片

2025年5月

Tags: