关键字:顺序功能图;S7-200 SMART;梯形图;功能测试。
系列文章目录
基于S7-200 SMART实现一键启停
基于7-200 SMART实现Modbus TCP通信
基于S7-200 SMART实现MATLAB写入与读取PLC数据
前言
基于顺序功能图设计PLC的程序是一种常用且有效的程序设计方式,本文将基于该方法实现机组延时关机程序。
一、机组延时关机程序的功能分解
在设计一段程序之前,我们首先需要明确该程序的功能,比如说常见的起保停程序——按下启动按钮后电机启动,按下停止按钮后电机停止转动。这里对延时关机有以下要求:
- 正常运行时①、②号机工作,指示灯不工作
- 电源接通后①、②号机同时工作
- 电源断开后,首先PLC控制一号机按钮关闭①号机
- 在①号机关闭后进行计时
- 在①号机关闭一段时间后后PLC控制指示灯运行信号开启指示灯并进行计时
- 在指示灯开启一段时间后后PLC控制②号机运行信号关闭②号机,关机流程结束
- 如果在上述流程中电源接通,则PLC进行控制恢复正常运行状态
可以检测到的信号是电源信号,可以控制的信号是①号机按钮信号、②号机运行信号、指示灯运行信号。
二、机组延时关机程序的顺序功能图
1.控制流程描述
根据已知的描述,我们可以得到以下五种控制情况:
- 正常关机:机组正常运行状态时断开电源,断开电源导致进入①号机关闭状态,进入该状态 T 1 T_1 T1时间后进入指示灯开启状态,进入该状态 T 2 T_2 T2时间后关闭②号机状态;
- 关闭电源后在指示灯启动前再接通电源:机组正常运行状态时断开电源,断开电源导致进入①号机关闭状态,①号机关闭 T 1 T_1 T1时间内接通电源导致进入①号机重开机准备状态,进入该状态 T 3 T_3 T3时间后进入①号机重开机状态,进入该状态 T 1 T_1 T1时间后进入机组正常运行状态;
- 关闭电源后在指示灯启动前再接通电源,在恢复正常运行前再次断开电源:机组正常运行状态时断开电源,断开电源导致进入①号机关闭状态,①号机关闭 T 1 T_1 T1时间内接通电源导致进入①号机重开机准备状态,进入该状态 T 3 T_3 T3时间后进入①号机重开机状态,进入该状态 T 1 T_1 T1时间内断开电源导致进入①号机重关机准备状态,进入该状态 T 3 T_3 T3时间后进入①号机关闭状态;
- 关闭电源后在指示灯启动后PLC关闭前接通电源:机组正常运行状态时断开电源,断开电源导致进入①号机关闭状态,进入该状态 T 1 T_1 T1时间后进入指示灯开启状态,进入该状态 T 2 T_2 T2时间内接通电源导致进入①号机重开机准备状态,进入该状态 T 3 T_3 T3时间后进入①号机重开机状态,进入该状态 T 1 T_1 T1时间后进入机组正常运行状态;
- 关闭电源后在指示灯启动后PLC关闭前接通电源,在恢复正常运行前再次断开电源:机组正常运行状态时断开电源,断开电源导致进入①号机关闭状态,进入该状态 T 1 T_1 T1时间后进入指示灯开启状态,进入该状态 T 2 T_2 T2时间内接通电源导致进入①号机重开机准备状态,进入该状态 T 3 T_3 T3时间后进入①号机重开机状态,进入该状态 T 1 T_1 T1时间内断开电源导致进入①号机重关机准备状态,进入该状态 T 3 T_3 T3时间后进入①号机关闭状态。
2.状态
在上述五个控制情况中总共出现了七种状态——机组正常运行状态、①号机关闭状态、指示灯开启状态、关闭②号机状态、①号机重开机准备状态、①号机重开机状态、①号机重关机准备状态,分别用
x
M
G
_
R
U
N
xMG\_RUN
xMG_RUN、
x
M
1
_
O
F
F
xM1\_OFF
xM1_OFF、
x
L
_
O
N
xL\_ON
xL_ON、
x
M
2
_
O
F
F
xM2\_OFF
xM2_OFF、
x
M
1
_
P
R
O
N
xM1\_PRON
xM1_PRON、
x
M
1
_
R
O
N
xM1\_RON
xM1_RON和
x
M
1
_
P
R
O
F
F
xM1\_PROFF
xM1_PROFF表示,命名的方式参考数据类型+元件名+元件状元,
x
x
x表示字位类型数据。上述七种状态下的各种变量的情况如图2.1:
其中 x M 1 B xM1B xM1B、 x M 2 R xM2R xM2R、 x L xL xL、 T 37 _ I N T37\_IN T37_IN、 T 38 _ I N T38\_IN T38_IN、 T 39 _ I N T39\_IN T39_IN和 x M 1 R xM1R xM1R分别表示①号机的按钮信号、②号机的运行信号、指示灯的接通信号、定时器T37的使能信号、定时器T38的使能信号、定时器T39的使能信号和①号机的运行信号。需要注意的是当①号机开机时①号机按钮信号的上升沿将关闭①号机,①号机关机时①号机按钮信号的上升沿将开启①号机,类似于电脑的一键启停按钮i。剩下的六个变量都是通过电平控制相关元件,例如 x M 2 R = 0 xM2R=0 xM2R=0则②号机停机、 x M 2 R = 1 xM2R=1 xM2R=1则②号机开机。
3.顺序功能图
在绘制顺功能图前我们需要了解到,顺序设计的程序有许多不同的设计方式——普通线圈实现、置位/复位线圈实现、顺控指令实现、功能指令实现,根据不同的指令实现顺序功能图略有不同,这里博主采用最简单的普通线圈实现。在普通线圈实现时在不同状态中只需要考虑会置1的变量,故图2.1可以优先省略如图2.2:
根据五种不同情况的控制流程以及图2.2可以得到基于不同线圈的顺序功能图如下:
其中 x P O W xPOW xPOW表示总电源信号, S M 0.1 SM0.1 SM0.1表示PLC接通后第一个只在第一个扫描周期接通的触点, T 37 T37 T37、 T 38 T38 T38、 T 39 T39 T39表示以100ms为单位的延时接通定时器。以上变量都是电平变量,例如 T 37 = 0 T37=0 T37=0表示定时器未定时结束、 T 37 = 1 T37=1 T37=1表示定时器定时结束。
三、机组延时关机程序
首先根据顺序功能图得到状态转移公式:
x
M
G
_
R
U
N
=
(
S
M
0.0
+
x
M
2
_
O
F
F
×
x
P
O
W
↑
+
x
M
1
_
R
O
N
×
T
37
↑
+
x
M
G
_
R
U
N
)
×
x
M
1
_
O
F
F
‾
x
M
1
_
O
F
F
=
(
x
M
G
_
R
U
N
×
x
P
O
W
↓
+
x
M
1
_
P
R
O
F
F
×
T
39
↑
+
x
M
1
_
O
F
F
)
×
x
L
_
O
N
‾
×
x
M
1
_
P
R
O
N
‾
x
L
_
O
N
=
(
x
M
1
_
O
F
F
×
T
37
↑
+
x
L
_
O
N
)
×
x
M
1
_
P
R
O
N
‾
×
x
M
2
_
O
F
F
‾
x
M
2
_
O
F
F
=
(
x
L
_
O
N
×
T
38
↑
+
x
M
2
_
O
F
F
)
×
x
M
G
_
R
U
N
‾
x
M
1
_
P
R
O
N
=
(
x
M
1
_
O
F
F
×
T
37
‾
×
x
P
O
W
↑
+
x
L
_
O
N
×
T
38
‾
×
x
P
O
W
↑
+
x
M
1
_
P
R
O
N
)
×
x
M
1
_
R
O
N
‾
x
M
1
_
R
O
N
=
(
x
M
1
_
P
R
O
N
×
T
39
↑
+
x
M
1
_
R
O
N
)
×
x
M
G
_
R
U
N
‾
×
x
M
1
_
P
R
O
F
F
‾
x
M
1
_
P
R
O
F
F
=
(
x
M
1
_
R
O
N
×
T
37
‾
×
x
P
O
W
↓
+
x
M
1
_
P
R
O
F
F
)
×
x
M
1
_
O
F
F
‾
(1)
\begin{align} xMG\_RUN &=\left(SM0.0+{xM2\_OFF×xPOW\uparrow}+{xM1\_RON×T37\uparrow}+xMG\_RUN \right)×\overline{xM1\_OFF} \\ xM1\_OFF &=\left({xMG\_RUN×xPOW\downarrow}+{xM1\_PROFF×T39\uparrow}+xM1\_OFF\right)×\overline{xL\_ON}×\overline{xM1\_PRON} \\ xL\_ON &=\left({xM1\_OFF×T37\uparrow}+xL\_ON\right)×\overline{xM1\_PRON}×\overline{xM2\_OFF} \\ xM2\_OFF &=\left({xL\_ON ×T38\uparrow}+xM2\_OFF\right)×\overline{xMG\_RUN} \\ xM1\_PRON &=\left({xM1\_OFF×\overline{T37}×xPOW\uparrow}+{xL\_ON×\overline{T38}×xPOW\uparrow}+xM1\_PRON\right)×\overline{xM1\_RON} \\ xM1\_RON &=\left({xM1\_PRON×T39\uparrow}+xM1\_RON\right)×\overline{xMG\_RUN}×\overline{xM1\_PROFF} \\ xM1\_PROFF &=\left({xM1\_RON×\overline{T37}×xPOW\downarrow}+xM1\_PROFF\right)×\overline{xM1\_OFF} \end{align} \tag{1}
xMG_RUNxM1_OFFxL_ONxM2_OFFxM1_PRONxM1_RONxM1_PROFF=(SM0.0+xM2_OFF×xPOW↑+xM1_RON×T37↑+xMG_RUN)×xM1_OFF=(xMG_RUN×xPOW↓+xM1_PROFF×T39↑+xM1_OFF)×xL_ON×xM1_PRON=(xM1_OFF×T37↑+xL_ON)×xM1_PRON×xM2_OFF=(xL_ON×T38↑+xM2_OFF)×xMG_RUN=(xM1_OFF×T37×xPOW↑+xL_ON×T38×xPOW↑+xM1_PRON)×xM1_RON=(xM1_PRON×T39↑+xM1_RON)×xMG_RUN×xM1_PROFF=(xM1_RON×T37×xPOW↓+xM1_PROFF)×xM1_OFF(1)以及输出公式:
x
M
1
B
=
x
M
1
_
O
F
F
+
x
M
1
_
R
O
N
x
M
2
R
=
x
M
G
_
R
U
N
+
x
M
1
_
O
F
F
+
x
M
1
_
O
F
F
+
x
M
1
_
P
R
O
N
+
x
I
M
1
_
R
O
N
+
x
M
1
_
P
R
O
F
F
x
L
=
x
L
_
O
N
T
37
_
I
N
=
x
M
1
_
O
F
F
+
x
M
1
_
R
O
N
T
38
_
I
N
=
x
L
_
O
N
T
39
_
I
N
=
x
M
1
_
P
R
O
N
+
x
M
1
_
P
R
O
F
F
x
M
1
R
=
x
M
G
_
R
U
N
+
x
M
1
_
R
O
N
+
x
M
1
_
P
R
O
F
F
(2)
\begin{align} xM1B &=xM1\_OFF+xM1\_RON \\ xM2R &=xMG\_RUN+xM1\_OFF+xM1\_OFF+xM1\_PRON+xIM1\_RON+xM1\_PROFF \\ xL &=xL\_ON \\ T37\_IN &=xM1\_OFF+xM1\_RON \\ T38\_IN &=xL\_ON \\ T39\_IN &=xM1\_PRON+xM1\_PROFF \\ xM1R &=xMG\_RUN+xM1\_RON+xM1\_PROFF \end{align} \tag{2}
xM1BxM2RxLT37_INT38_INT39_INxM1R=xM1_OFF+xM1_RON=xMG_RUN+xM1_OFF+xM1_OFF+xM1_PRON+xIM1_RON+xM1_PROFF=xL_ON=xM1_OFF+xM1_RON=xL_ON=xM1_PRON+xM1_PROFF=xMG_RUN+xM1_RON+xM1_PROFF(2)随后基于乘号是触点串联、加号是触点并联、等号左边是线圈、等号右边是触点、取非是常闭触点、不取非是常开触点进行编程:
四、测试流程
程序编写后可以测试一下,针对上述的五个控制流程:
T
E
S
T
:
x
M
G
_
R
U
N
⟶
x
P
O
W
=
1
→
0
x
M
1
_
O
F
F
→
x
L
_
O
N
→
x
M
2
_
O
F
F
⟶
x
P
O
W
=
1
→
0
x
M
G
_
R
U
N
→
L
O
O
P
T
E
S
T
2
:
x
M
G
_
R
U
N
⟶
x
P
O
W
=
1
→
0
x
M
1
_
O
F
F
⟶
T
37
=
0
&
&
x
P
O
W
=
0
→
1
x
M
1
_
P
R
O
N
→
x
M
1
_
R
O
N
→
x
M
G
_
R
U
N
→
L
O
O
P
T
E
S
T
3
:
x
M
G
_
R
U
N
⟶
x
P
O
W
=
1
→
0
x
M
1
_
O
F
F
⟶
T
37
=
0
&
&
x
P
O
W
=
0
→
1
x
M
1
_
P
R
O
N
→
x
M
1
_
R
O
N
⟶
T
37
=
0
&
&
x
P
O
W
=
1
→
0
x
M
1
_
P
R
O
F
F
→
x
M
1
_
O
F
F
→
L
O
O
P
T
E
S
T
4
:
x
M
G
_
R
U
N
⟶
x
P
O
W
=
1
→
0
x
M
1
_
O
F
F
→
x
L
_
O
N
⟶
T
38
=
0
&
&
x
P
O
W
=
0
→
1
x
M
1
_
P
R
O
N
→
x
M
1
_
R
O
N
→
x
M
G
_
R
U
N
→
L
O
O
P
T
E
S
T
5
:
x
M
G
_
R
U
N
⟶
x
P
O
W
=
1
→
0
x
M
1
_
O
F
F
→
x
L
_
O
N
⟶
T
38
=
0
&
&
x
P
O
W
=
0
→
1
x
M
1
_
P
R
O
N
→
x
M
1
_
R
O
N
⟶
T
37
=
0
&
&
x
P
O
W
=
1
→
0
x
M
1
_
P
R
O
F
F
→
x
M
1
_
O
F
F
→
L
O
O
P
(3)
\begin{align} TEST:xMG\_RUN &\stackrel{xPOW=1→0}{\longrightarrow} xM1\_OFF \to xL\_ON \to xM2\_OFF \stackrel{xPOW=1→0}{\longrightarrow} xMG\_RUN \to LOOP \\ TEST2:xMG\_RUN &\stackrel{xPOW=1→0}{\longrightarrow} xM1\_OFF \stackrel{T37=0\&\&xPOW=0→1}{\longrightarrow} xM1\_PRON \to xM1\_RON \to xMG\_RUN \to LOOP \\ TEST3: xMG\_RUN &\stackrel{xPOW=1→0}{\longrightarrow} xM1\_OFF \stackrel{T37=0\&\&xPOW=0→1}{\longrightarrow} xM1\_PRON \\ &\to xM1\_RON \stackrel{T37=0\&\&xPOW=1→0}{\longrightarrow} xM1\_PROFF \to xM1\_OFF \to LOOP \\ TEST4:xMG\_RUN &\stackrel{xPOW=1→0}{\longrightarrow} xM1\_OFF \to xL\_ON \stackrel{T38=0\&\&xPOW=0→1}{\longrightarrow} xM1\_PRON \\ &\to xM1\_RON \to xMG\_RUN \to LOOP \\ TEST5:xMG\_RUN &\stackrel{xPOW=1→0}{\longrightarrow} xM1\_OFF \to xL\_ON \stackrel{T38=0\&\&xPOW=0→1}{\longrightarrow} xM1\_PRON \\ &\to xM1\_RON \stackrel{T37=0\&\&xPOW=1→0}{\longrightarrow} xM1\_PROFF \to xM1\_OFF \to LOOP \end{align} \tag{3}
TEST:xMG_RUNTEST2:xMG_RUNTEST3:xMG_RUNTEST4:xMG_RUNTEST5:xMG_RUN⟶xPOW=1→0xM1_OFF→xL_ON→xM2_OFF⟶xPOW=1→0xMG_RUN→LOOP⟶xPOW=1→0xM1_OFF⟶T37=0&&xPOW=0→1xM1_PRON→xM1_RON→xMG_RUN→LOOP⟶xPOW=1→0xM1_OFF⟶T37=0&&xPOW=0→1xM1_PRON→xM1_RON⟶T37=0&&xPOW=1→0xM1_PROFF→xM1_OFF→LOOP⟶xPOW=1→0xM1_OFF→xL_ON⟶T38=0&&xPOW=0→1xM1_PRON→xM1_RON→xMG_RUN→LOOP⟶xPOW=1→0xM1_OFF→xL_ON⟶T38=0&&xPOW=0→1xM1_PRON→xM1_RON⟶T37=0&&xPOW=1→0xM1_PROFF→xM1_OFF→LOOP(3)
注意,如图3.15的两部分第一部分是边沿触发,第二部分是电平触发,对应的是公式(1)中的第七个。如果将上述两个部分调换位置,则就编成所有变量都是边沿触发,就不是公式(1)中的第七个表达的含义了。博主在编程中一开始就是将第二部分放在了第一部分前面,导致测试的时候出现了不正确的流程:
x
M
G
_
R
U
N
⟶
x
P
O
W
=
1
→
0
x
M
1
_
O
F
F
⟶
T
37
=
0
&
&
x
P
O
W
=
0
→
1
x
M
1
_
P
R
O
N
→
x
M
1
_
R
O
N
→
x
M
1
_
P
R
O
F
F
→
x
M
1
_
P
R
O
N
→
S
T
O
P
(4)
\begin{align} xMG\_RUN &\stackrel{xPOW=1→0}{\longrightarrow} xM1\_OFF \stackrel{T37=0\&\&xPOW=0→1}{\longrightarrow} xM1\_PRON \\ &\to xM1\_RON \to xM1\_PROFF \to xM1\_PRON \to STOP \end{align} \tag{4}
xMG_RUN⟶xPOW=1→0xM1_OFF⟶T37=0&&xPOW=0→1xM1_PRON→xM1_RON→xM1_PROFF→xM1_PRON→STOP(4)
五、一些思考
这个案例也不算什么经典案例,但也确实是博主遇到的问题之一,在一开始只能想到正常的关机流程,完成编程以后开始思考如果关机信号是误动作,也就是有断开电源后的电源接通,该怎么办?
我们关闭①号机用的是一键启停式,如果按钮的高电平还没结束又需要一个上升沿,来满足①号机关机后的启动,那就需要先让①号机按钮信号回到低电平,再触发一个高电平,这也就是①号机重开机准备状态的作用——让①号机按钮信号恢复低电平,类似的①号机重关机准备状态也是处于这样的思考进行设计的。
当然也有其他的办法解决这个问题,博主这里限于自己的思考能力,只给出了上述的一种解决办法,有小伙伴有更好的思路欢迎交流。
总结
本文针对机组的延时关机程序的设计思路进行了整理,包括从设计要求、顺序功能图设计、程序编写、程序测试、后续思考五部分。