“启保停”电路是学习过程中最常见的一个案例,也是最简单易懂的控制程序。如果采用梯形图编程,如图1所示。在实际工程的电路中,很少有这么简单的起保停电路,一般都需要考虑急停、限位、过载保护等多项因素,启停信号也可能由多个触点组成的串、并联电路。所以“启保停”电路仅能作为入门学习的案例。
图1 起保停梯形图及波形图
在“启保停”电路中,启动信号X1和停止信号X2一般都是触发信号(实体按钮或HMI屏幕虚拟按钮提供的信号),也叫短信号,其按钮没有记忆保持功能(目前也有触发保持型的按钮,但作为启动/停止按钮不常用),不能保证Y1线圈的持续接通。
当启动信号X1按钮触发时(高电平),X1的常开触点接通,如果此时X2无动作,X2的常闭触点也接通,则Y1的线圈“通电”,其常开触点同时接通。此时即使X1回到低电平状态,其常开触点断开,“能流”仍可经Y1的常开触点和X2的常闭触点流过Y1,Y1仍为接通状态,这就是所谓的“自保持”功能。当停止信号X2触发时,它的常闭触点断开,使Y1的线圈“断电”,其常开触点同时断开。以后即使停止按钮复位,X2的常闭触点恢复接通,Y1的线圈仍然“断电”。
下面我们看看如何用SCL语言实现“启保停”的功能。
首先从逻辑上分析,要想“Y1接通”这一命题成立,从成立条件上是“X1或Y1为真,且X2为真”,这里就需要IF条件执行语句,其结构:
IF X1=TRUE OR Y1=TRUE AND X2=TRUE THEN
Y1=TRUE;
END_IF; //这种写法不规范也不全面,这是从分析上先建立一个框架。
这里需要学习“IF:条件执行”指令的内容。
IF:条件执行
使用“条件执行”指令,可以根据条件控制程序流的分支。该条件是结果为布尔值(TRUE 或 FALSE)的表达式。可以将逻辑表达式或比较表达式作为条件。执行该指令时,将对指定的表达式进行运算。如果表达式的值为 TRUE,则表示满足该条件;如果其值为 FALSE,则表示不满足该条件。
根据分支的类型,可以对以下形式的指令进行编程:
- IF 分支:IF <condition> THEN <instructions>END_IF;
如果满足该条件,则将执行 THEN 后编写的指令。如果不满足该条件,则程序将从 END_IF 后的下一条指令开始继续执行。
- IF 和 ELSE 分支:IF <condition> THEN <instructions1>ELSE <Instructions0>END_IF;
如果满足该条件,则将执行 THEN 后编写的指令。如果不满足该条件,则将执行ELSE 后编写的指令。程序将从 END_IF 后的下一条指令开始继续执行。
- IF、ELSIF 和 ELSE 分支:IF <condition1> THEN <instructions1>ELSIF <condition2> THEN <instruction2>ELSE <Instructions0>END_IF;
如果满足第一个条件(<条件 1>),则将执行 THEN 后的指令(<指令 1>)。执行这些指令后,程序将从 END_IF 后继续执行。
如果不满足第一个条件,则将检查第二个条件(<条件 2>)。如果满足第二个条件(<条件 2>),则将执行 THEN 后的指令(<指令 2>)。执行这些指令后,程序将从 END_IF 后继续执行。
如果不满足任何条件,则先执行 ELSE 后的指令(<指令 0>),再执行 END_IF 后的程序部分。
在 IF 指令内可以嵌套任意多个 ELSIF 和 THEN 组合。可以选择对 ELSE 分支进行编程。
明确了框架,再定义变量,此处只有三个变量X1,X2,Y1,由于X1和X2需要有数字输入地址,所有需要在PLC变量中进行定义,如图2所示。I0.0和I0.1是PLC的数字量输入点,作为外部输入信号的存储位,而M10.0则是PLC内部存储区的一个位变量,作为中间变量使用。如果Y1的信号直接作为输出信号,需要定义为Qx.x(数字量输出点)。这里涉及了数据类型,数据类型很多,没必要全部死记硬背,建议用哪个深入了解一下就可以。
图2 定义变量
数据类型:
在用户程序中,可使用预定义的数据类型,并将这些数据类型添加到用户自定义数据类型中。可使用以下类别:
- 基本数据类型(二进制数、整数、浮点数、定时器、DATE、TOD、LTOD、CHAR、WCHAR)
- 复杂数据类型(DT、LDT、DTL、STRING、WSTRING、ARRAY、STRUCT)
- 用户自定义数据类型(PLC 数据类型 (UDT))
- 指针
- 参数类型
- 系统数据类型
- 硬件数据类型
定义变量完成后,下一步就可以编程了。这里需要说明,程序既可以写在OB1里,也可以新建FB块,再将FB对应的DB块添加到OB1中循环执行。对于这种简单的程序运行结果没有什么不同,但是对于复杂的程序,建议采用模块化的多个FB实现,每个FB完成的单个或几个功能性的或任务性的完整程序,便于后期修改、调试,整个程序也显得简洁明了。
“启保停”程序示例如图3所示,使用IF指令的嵌套,第一层判断X1和Y1,嵌套第二层判断X2,实际上也可以写成一层,如图4所示。其实完成一个功能的可以多种程序编写形式,可以根据自己的习惯进行编写,只要满足所需功能,没有对错好坏之分。拆分成嵌套的形式,有的时候便于查看,尤其判断条件多的时候,监控时比较直观的观察每个判断条件的结果。
图3 启保停SCL程序1
图4 启保停SCL程序2
最后将对应的DB插入到OB1中循环执行即可(如图5所示)。
图5 OB1循环执行
,