使用西门子博图SCL语言和factoryio软件来编写应用案例——装配流水线模拟控制项目
文章目录
目录
前言
一、应用:装配流水线模拟控制
1.控制要求
2.完善控制要求和场景
1.布置场景(factoryio)
2.控制要求
3.变量表(I/O分配)
3.编写程序
1.编写准备
2.编写
3.完整程序图
前言
读万卷书,行万里路;
前面几章学过了SCL指令的使用部分,这一章我们通过应用案例(装配流水线模拟控制)来继续学习SCL语言;理论和实践相辅相成,两者相结合可以更好的掌握我们学习的知识!
这里仿真调试会用到博图仿真和factoryio(虚拟工厂) 的模拟仿真来实现整体效果。
下面进入正文:
一、应用:装配流水线模拟控制
1.控制要求
I/O分配:
输入 | 输出 | ||||
---|---|---|---|---|---|
名称 | 作用 | 地址 | 名称 | 作用 | 地址 |
ON | 启动 | I0.0 | A | A操作 | Q0.0 |
OFF | 停止 | I0.1 | B | B操作 | Q0.1 |
C | C操作 | Q0.2 | |||
D | D传送带 | Q0.3 | |||
E | E传送带 | Q0.4 | |||
F | F传送带 | Q0.5 | |||
G | G传送带 | Q0.6 | |||
H | H仓库 | Q0.7 |
具体运行动作:
题目要求大概就是,有一个工件在环形传送带上(由DEFG4节传送带组成),运行1圈后,进行A操作;运行2圈后,进行B操作;第3圈是C操作,最后再运行1圈放入仓库。
2.完善控制要求和场景
这个题也用梯形图编写过,但是整体效果有缺失,题目要求1圈后A操作,但并没有时间限制,到最后进入仓库也是没有要求,以及如何将工件放到操作台上,题目里没有细说;
在前面使用虚拟工厂来布置环境时,为了整体效果加上了一个机械臂,操作台和仓库,完成效果很好!所以本篇所写的是改进后的 装配模拟控制项目应用;原题可以参考前面梯形图写过的那篇。
1.布置场景(factoryio)
具体的场景布置如图:4个2m的传送带,4个1/4圆的环形传送带(2个1组,代表题目中的1条传送带),1个机械臂, 1个三色灯,3个传感器,1个配电箱2个按钮;
2.控制要求
大概控制流程:按下启动按钮,传送带依次运行将工件运至G传感器位置,机械臂将料放到操作台,第1次进行A操作,时间到后,再将工件放到传送带进行传送,第2次进行B操作,然后第3次C操作;当运行第4次时,机械臂将工件放到仓库传送带,传送带运行让工件消失,机械臂回到原位,停止。在运行时按下停止按钮,根据当前状态进行不同停止。
(以下要求是我自己设置的,大家可以根据自己设置的来编写)
具体控制要求:
1. 启动部分:
1. 按下启动按钮,D传送带运行,2s后E传送带运行,4s后F传送带运行D传送带停止,F运行2s后G传送带运行,E传送带停止,G运行2S后,D传送带再次运行,当碰到G传感器后,传送带全部停止;碰到传感器后,吸盘得电,1s后机械手下降,延时0.5s,时间到后机械手缩回,计时1.5s,1.5s时间到后,机械臂左转,再1.5s后 机械手下降,并计时1.5s ,时间到后,吸盘失电,机械手缩回,料到位传感器得电,1s后工件开始进行A操作,计时加工6s,时间到后指示灯灭,吸盘得电,计时1s,1s后,机械手下降,计时1.5s,1.5s后机械手缩回,缩回1s后,机械臂右转,计时1s机械手下降,下降1s后,吸盘失电,机械手缩回,再次计时1.5s后,传送带部分再次运行,进行B、C操作;
2. 当工件ABC操作加工后,机械手再次吸起工件然后左转,延时1s后,机械臂伸出,计时2.5s,1s后机械手下降,当仓库传感器得电后,仓库传送带运行,然后机械臂,机械手缩回,计时2s,2s后机械臂回到原位,仓库停止,至此工作流程完成。
2. 停止部分:当按下停止按钮后,系统判断当前状态,根据不同的状态来停止
第一种情况:工件还在传送带内,按下停止后,系统将工件运回原位后停止,并且不影响下次启动;
第二种情况:机械手在搬运工件或在搬运的途中,或者工件正在加工,按下停止后,机械臂等待工件加工完成,并将工件放在初始位,然后机械臂返回初始位停止,不影响下次启动;
第三种情况:机械手要将工件放入仓库时或运行途中,按下停止,机械并应先运行完当前工作并返回初始位后停止,不影响下次启动。
3.变量表(I/O分配)
分配变量时,可以先写在虚拟工厂里面的,写好后导出文件,在博图变量表里面导入就可以了!
I/O分配:
输入 | 输出 | ||||
---|---|---|---|---|---|
名称 | 作用 | 地址 | 名称 | 作用 | 地址 |
ON | 启动 | I0.0 | D传送带 | 传送 | Q0.0 |
OFF | 停止 | I0.1 | E传送带1 | 传送 | Q0.1 |
仓库传感器 | 传感器 | I0.2 | E传送带2 | 传送 | Q0.2 |
左转右转传感器 | 传感器 | I0.3 | F传送带 | 传送 | Q0.3 |
料到位传感器 | 传感器 | I0.4 | G传送带1 | 传送 | Q0.4 |
G传感器 | 传感器 | I0.5 | G传送带2 | 传送 | Q0.5 |
机械手伸出到位传感器 | 传感器 | I0.6 | A操作指示灯 | 指示灯 | Q0.6 |
机械手下降上升传感器 | 传感器 | I0.7 | B操作指示灯 | 指示灯 | Q0.7 |
C操作指示灯 | 指示灯 | Q1.0 | |||
ABC操作台 | 操作台 | Q1.1 | |||
仓库 | 传送 | Q1.2 | |||
吸盘 | 吸盘 | Q1.3 | |||
机械手伸出 | 伸出 | Q1.4 | |||
机械臂伸出 | 伸出 | Q1.5 | |||
机械臂右转 | 右转 | Q1.6 | |||
机械臂左转 | 左转 | Q1.7 |
factoryio变量:
3.编写程序
1.编写准备
1.博图软件建立新项目,写入I/O变量;2.创建factoryio软件新项目,布置场景并放置变量;3.博图仿真和factoryio进行连接。
2.编写
1.启动部分:
1. 按下启动按钮,D传送带运行,2s后E传送带运行,4s后F传送带运行D传送带停止,F运行2s后G传送带运行,E传送带停止,G运行2S后,D传送带再次运行,
看下题目可以发现,前3次都是相同的,是在做同一个动作,那么我们只要写一次流程,再循环三次,分别判断一下是第几次,然后亮不同颜色的指示灯就可以了。
这里可以直接使用if语句,再接定时器,来实现前面的要求,但是写到后期会很乱,定时器很多!再者还要循环3次,所以这里我们可以果断选择case of语句,传不同的数给变量进行不同的操作,在循环时会比较方便。
首先要在数据块DB中建一个变量流程步(int类型),流程步为0时,如果按下ON,就传1,传送带启动运行,使用定时器和输出点来进入下一步,这样一步一步走下来,4节传送带部分就完成了!
CASE "数据块_1".流程步 OF
//第0步,按下启动按钮,流程步为1,并将定时器输出和变量进行初始化;
0:
IF "ON" THEN
"数据块_1".流程步 := 1;
END_IF;
//第1步,D传送带运行,2s后流程步为2;
1:
"D传送带" := 1;
"IEC_Timer_0_DB_9".TON(IN := "D传送带" & NOT "G传送带1",
PT := T#2s,
Q => "输出点1");
IF "输出点1" THEN
"数据块_1".流程步 := 2;
END_IF;
//第2步,E传送带运行,4s后流程步为3;
2:
"E传送带1" := 1;
"E传送带2" := 1;
"IEC_Timer_0_DB_10".TON(IN := "E传送带1",
PT := T#4s,
Q => "输出点2");
IF "输出点2" THEN
"数据块_1".流程步 := 3;
END_IF;
//第3步,F传送带运行D传送带停止,F运行2s后G传送带运行,E传送带停止,
//G运行2S后,流程步为4;
3:
"F传送带" := 1;
"D传送带" := 0;
"IEC_Timer_0_DB_11".TON(IN := "F传送带",
PT := T#2s,
Q => "输出点3");
IF "输出点3" THEN
"G传送带1" := 1;
"G传送带2" := 1;
"E传送带1" := 0;
"E传送带2" := 0;
END_IF;
"IEC_Timer_0_DB_12".TON(IN := "G传送带1",
PT := T#2s,
Q => "输出点4");
IF "输出点4" THEN
"数据块_1".流程步 := 4;
END_IF;
//第4步,D传送带再次运行,当碰到G传感器后,传送带全部停止,流程步为5;
4:
"D传送带" := 1;
//限制,当按下停止时,此传感器不得电
IF "数据块_1".变量J=0 THEN
"F_TRIG_DB_1"(CLK := "G传感器",
Q => "下降沿1");
END_IF;
IF "下降沿1" THEN
"D传送带" := 0;
"E传送带1" := 0;
"E传送带2" := 0;
"F传送带" := 0;
"G传送带1" := 0;
"G传送带2" := 0;
"数据块_1".流程步 := 5;
END_IF;
然后再看下面的控制要求:
当碰到G传感器后,传送带全部停止;碰到传感器后,吸盘得电,1s后机械手下降,延时0.5s,时间到后机械手缩回,计时1.5s,1.5s时间到后,机械臂左转,再1.5s后 机械手下降,并计时1.5s ,时间到后,吸盘失电,机械手缩回,料到位传感器得电,1s后工件开始进行A操作,计时加工6s,时间到后指示灯灭,吸盘得电,计时1s,1s后,机械手下降,计时1.5s,1.5s后机械手缩回,缩回1s后,机械臂右转,计时1s机械手下降,下降1s后,吸盘失电,机械手缩回,
当碰到传感器后,传送带停止,就要进行机械手部分的控制,这里就是按着要求来进行计时机械手伸出或下降等等。到这里第一个A操作加工流程就完成了!
//第5步,吸盘得电,1s后机械手下降,用机械手伸出到位传感器接通0.5s延时;
5:
"吸盘" := 1;
"IEC_Timer_0_DB".TON(IN := "吸盘",
PT := T#1s,
Q => "输出点5");
IF "输出点5" THEN
"机械手伸出" := 1;
END_IF;
"IEC_Timer_0_DB_1".TON(IN := "机械手伸出到位传感器",
PT := T#0.5s,
Q => "输出点6");
IF "输出点6" THEN
"数据块_1".流程步 := 6;
END_IF;
//第6步,时间到后机械手缩回,计时1.5s;
6:
"机械手伸出" := 0;
"中继3" := 1;
"IEC_Timer_0_DB_2".TON(IN := "中继3",
PT := T#1.5s,
Q => "输出点7");
IF "输出点7" THEN
"数据块_1".流程步 := 7;
"中继3" := 0;
END_IF;
//第7步,1.5s时间到后,机械臂左转,1.5s后到流程步8;
7:
"中继4" := 1;
"机械臂左转" := 1;
"IEC_Timer_0_DB_4".TON(IN := "机械臂左转",
PT := T#1.5s,
Q => "输出点9");
IF "输出点9"THEN
"中继4" := 0;
"数据块_1".流程步 := 8;
END_IF;
//第8步,机械手下降,计时1.5s
8:
"中继6" := 1;
"机械手伸出" := 1;
"中继5" := 0;
"IEC_Timer_0_DB_3".TON(IN := "机械手伸出",
PT := T#1.5s,
Q => "输出点10");
IF "输出点10" THEN
"数据块_1".流程步 := 9;
END_IF;
//第9步,时间到后,吸盘失电,机械手缩回,1s后进行工件加工;
9:
"吸盘" := 0;
"中继7" := 1;
"中继6" := 0;
"机械手伸出" := 0;
"IEC_Timer_0_DB_5".TON(IN := "中继7",
PT := T#1s,
Q => "输出点11");
IF "输出点11" THEN
"中继7" := 0;
"A操作指示灯" := 1;
"数据块_1".流程步 := 10;
END_IF;
END_CASE;
//第10步,工件加工6s
10:
"IEC_Timer_0_DB_6".TON(IN := "A操作指示灯",
PT := T#6s,
Q => "输出点12");
IF "输出点12" THEN
"数据块_1".流程步 := 11;
END_IF;
//第11步,时间到后指示灯灭,吸盘得电,计时1s
11:
"C操作指示灯" := 0;
"B操作指示灯" := 0;
"A操作指示灯" := 0;
"吸盘" := 1;
"IEC_Timer_0_DB_7".TON(IN := "吸盘",
PT := T#1s,
Q => "输出点13");
IF "输出点13" THEN
"数据块_1".流程步 := 12;
END_IF;
//第12步,1s后,机械手下降,计时1.5s
12:
"机械手伸出" := 1;
"IEC_Timer_0_DB_8".TON(IN:="机械手伸出",
PT:=T#1.5s,
Q=>"输出点14");
IF "输出点14" THEN
"数据块_1".流程步 := 13;
END_IF;
//第13步,1.5s后机械手缩回,1s后,机械臂右转,计时1s
13:
"机械手伸出" := 0;
"中继8" := 1;
"IEC_Timer_0_DB_13".TON(IN:="中继8",
PT:=T#1s,
Q=>"输出点15");
IF "输出点15" THEN
"机械臂右转" := 1;
END_IF;
"IEC_Timer_0_DB_14".TON(IN := "机械臂右转",
PT := T#1s,
Q => "输出点16");
IF "输出点16" THEN
"数据块_1".流程步 := 14;
"中继8" := 0;
END_IF;
//第14步,机械手下降,计时1s,吸盘失电,1.5s后进行下一步
14:
"机械手伸出" := 1;
"IEC_Timer_0_DB_15".TON(IN := "机械手伸出",
PT := T#1s,
Q => "输出点17");
IF "输出点17" THEN
"中继9" := 1;
"吸盘" := 0;
"机械手伸出" := 0;
END_IF;
"IEC_Timer_0_DB_16".TON(IN := "中继9",
PT := T#1.5s,
Q => "输出点18");
IF "输出点18" THEN
"数据块_1".流程步 := 15;
"中继9" := 0;
END_IF;
这里我们可以连接虚拟工厂来看一下效果:(GIF有点模糊,但大致流程是可以看到的)
第1个流程做好之后,后面两次只要循环就好了!看要求:
再次计时1.5s后,传送带部分再次运行,进行B、C操作;
时间到之后,再进行BC操作;那么这里我们要在流程里面加一些条件来判断当前是第几个循环 ,然后每个循环进行不同的操作。
进入第15步后,将机械臂左转右转清零 ,再将上面使用过的定时器复位,这里用到定时器复位指令 RESET_TIMER()括号中是要清零的定时器,最后再将流程步赋值为1,进行循环;
15:
"机械臂右转" := 0;
"机械臂左转" := 0;
RESET_TIMER("IEC_Timer_0_DB");
RESET_TIMER("IEC_Timer_0_DB_1");
RESET_TIMER("IEC_Timer_0_DB_2");
RESET_TIMER("IEC_Timer_0_DB_3");
RESET_TIMER("IEC_Timer_0_DB_4");
RESET_TIMER("IEC_Timer_0_DB_5");
RESET_TIMER("IEC_Timer_0_DB_6");
RESET_TIMER("IEC_Timer_0_DB_7");
RESET_TIMER("IEC_Timer_0_DB_8");
RESET_TIMER("IEC_Timer_0_DB_9");
RESET_TIMER("IEC_Timer_0_DB_10");
RESET_TIMER("IEC_Timer_0_DB_11");
RESET_TIMER("IEC_Timer_0_DB_12");
RESET_TIMER("IEC_Timer_0_DB_13");
RESET_TIMER("IEC_Timer_0_DB_14");
RESET_TIMER("IEC_Timer_0_DB_15");
RESET_TIMER("IEC_Timer_0_DB_16");
"数据块_1".流程步 := 1;
在循环中我们要加入相应判断:在第7步时,用左转右转传感器来对变量I进行+1操作,如果变量I<=3,就继续向下走,当变量=4时就跳入16,进行其他操作;
//第7步,1.5s时间到后,机械臂左转,1.5s后到流程步8;
7:
"中继4" := 1;
"机械臂左转" := 1;
//用左转右转传感器对变量I进行加数
"R_TRIG_DB"(CLK := "左转右转传感器",
Q => "上升沿4");
IF "上升沿4" THEN
"数据块_1".变量I := "数据块_1".变量I + 1;
END_IF;
"IEC_Timer_0_DB_4".TON(IN := "机械臂左转",
PT := T#1.5s,
Q => "输出点9");
//如果变量I<=3次,就接着到第8步,如果变量等于4就到第16步
IF "输出点9"&"数据块_1".变量I<=3 THEN
"中继4" := 0;
"数据块_1".流程步 := 8;
ELSIF "输出点9" & "数据块_1".变量I=4 THEN
"中继4" := 0;
"数据块_1".流程步 := 16;
END_IF;
当运行到第9步时,如果变量<=3,就进入一个小的case语句,第1次A操作,第2次B操作,然后C操作,完成之后进行下一步;当变量=4的时候,就跳出进行其他操作;
//第9步,时间到后,吸盘失电,机械手缩回,1s后进入case语句中,判断次数进行工件加工;
9:
"吸盘" := 0;
"中继7" := 1;
"中继6" := 0;
"机械手伸出" := 0;
"IEC_Timer_0_DB_5".TON(IN := "中继7",
PT := T#1s,
Q => "输出点11");
//第4次跳出,到流程步17
IF "数据块_1".变量I = 4 THEN
"数据块_1".流程步 := 17;
END_IF;
//前3次对工件进行加工,并亮不同的指示灯
CASE "数据块_1".变量I OF
//A操作
1:
IF "输出点11" THEN
"中继7" := 0;
"A操作指示灯" := 1;
"数据块_1".流程步 := 10;
END_IF;
//B操作
2:
IF "输出点11" THEN
"中继7" := 0;
"B操作指示灯" := 1;
"数据块_1".流程步 := 10;
END_IF;
//C操作
3:
IF "输出点11" THEN
"中继7" := 0;
"C操作指示灯" := 1;
"数据块_1".流程步 := 10;
END_IF;
END_CASE;
前面3次完成后,我们接着往下看:
2. 当工件ABC操作加工后,机械手再次吸起工件然后左转,延时1s后,机械臂伸出,计时2.5s,1s后机械手下降,当仓库传感器得电后,仓库传送带运行,然后机械臂,机械手缩回,计时2s,2s后机械臂回到原位,仓库停止,至此工作流程完成。
当ABC都完成后,第4次要放入仓库传送带上,就要用到机械臂,机械手还是和上面相同。
在第7步时,变量=4,就进入第16步;
机械臂伸出,时间到后再回到第8步,进行机械手的伸出和缩回;
//第16步,当变量I=4时,跳到这一步,机械臂伸出,计时2.5s ,并跳到第8步
//让机械手伸出放工件,然后缩回;
16:
"机械臂伸出" := 1;
"IEC_Timer_0_DB_17".TON(IN:="机械臂伸出",
PT:=T#2.5s,
Q=>"输出点20");
IF "输出点20" THEN
"数据块_1".流程步 := 8;
END_IF;
回到第8步进行机械手伸出和缩回,到第9步后,判断变量=4,就跳入第17步;
8:
"中继6" := 1;
"机械手伸出" := 1;
"中继5" := 0;
"IEC_Timer_0_DB_3".TON(IN := "机械手伸出",
PT := T#1.5s,
Q => "输出点10");
IF "输出点10" THEN
"数据块_1".流程步 := 9;
END_IF;
//第9步,时间到后,吸盘失电,机械手缩回,1s后进入case语句中,判断次数进行工件加工;
9:
"吸盘" := 0;
"中继7" := 1;
"中继6" := 0;
"机械手伸出" := 0;
"IEC_Timer_0_DB_5".TON(IN := "中继7",
PT := T#1s,
Q => "输出点11");
//第4次跳出,到流程步17
IF "数据块_1".变量I = 4 THEN
"数据块_1".流程步 := 17;
END_IF;
在17步时,通过仓库传感器来让传送带运行,机械臂缩回,2s后右转到原位,再将仓库和变量复位为零。
//第17步,如果仓库传感器得电,仓库传送带运行,然后机械臂缩回,计时2s,2s后机械臂右转;
17:
"中继11" := 1;
IF "仓库传感器" THEN
"仓库" := 1;
END_IF;
"机械臂伸出" := 0;
"IEC_Timer_0_DB_18".TON(IN:="中继11",
PT:=T#2s,
Q=>"输出点21");
IF "输出点21" THEN
"中继11" := 0;
"机械臂右转" := 1;
"数据块_1".流程步 := 18;
END_IF;
//第18步,右转后,仓库停止,并将输出点、左转右转、变量、机械手下降次数、流程步复位清零;
18:
"仓库" := 0;
RESET_TIMER("IEC_Timer_0_DB_17");
RESET_TIMER("IEC_Timer_0_DB_18");
"机械臂右转" := 0;
"机械臂左转" := 0;
"数据块_1".变量I := 0;
"数据块_1".机械手下降次数 := 0;
"数据块_1".流程步 := 0;
写到这里,4次流程都可以运行了!我们看下效果怎样:前三次都基本相同,从第4步开始。
2.停止部分:
启动流程完成后,我们已经完成一大半啦!最后就是停止部分了。
在实际运行中,传送带停止不会太随意,一般按下停止后会回到初始位,或者立即停止,在上电后回到初始位;这道题也是这样,不是立即停止;
下面我们看要求:
第一种情况:工件还在传送带内,按下停止后,系统将工件运回原位后停止,并且不影响下次启动;
第一种情况比较简单,首先我们要判断工件是否还在传送带内,然后按下停止,等运行到初始位时,停止;
这里我们还是用case语句来进行编写;按下OFF后,判断是否在传送带上;如果 IF "D传送带" OR "E传送带1" OR "F传送带" OR "G传送带1" 这4个传送带有1个为1,就将变量J赋值为1,进行下一步;
//当按下停止按钮后,判断当前状态,根据不同的状态来停止
CASE "数据块_1".变量J OF
0:
IF "OFF" THEN
IF "D传送带" OR "E传送带1" OR "F传送带" OR "G传送带1" THEN
"数据块_1".变量J := 1;
END_IF;
当变量J=1时,或许一个G传感器下降沿,当条件满足,将传送带全部停止,输出点、变量和流程步复位;并且不影响下次启动。
//停止的第一种情况:工件还在传送带内,按下停止后,将工件运回原位后停止,
//不影响下次启动。
1:
"F_TRIG_DB"(CLK:="G传感器",
Q=>"下降沿3");
IF "下降沿3" THEN
"D传送带" := 0;
"E传送带1" := 0;
"E传送带2" := 0;
"F传送带" := 0;
"G传送带1" := 0;
"G传送带2" := 0;
RESET_TIMER("IEC_Timer_0_DB_9");
RESET_TIMER("IEC_Timer_0_DB_10");
RESET_TIMER("IEC_Timer_0_DB_11");
RESET_TIMER("IEC_Timer_0_DB_12");
"数据块_1".流程步 := 0;
"数据块_1".变量I := 0;
"数据块_1".变量J := 0;
END_IF;
OK!第一种停止情况解决!
下面看第二种情况:
第二种情况:机械手在搬运工件或在搬运的途中,或者工件正在加工,按下停止后,机械臂等待工件加工完成,并将工件放在初始位,然后机械臂返回初始位停止,不影响下次启动;
这种是要先找到机械手运行部分的条件来判断是不是第2种情况,我们找到像吸盘得电或机械手下降这些都可以证明是机械手运行部分的条件就可以了;
这里我将所有有关的都写了进去,像机械手下降次数(是防止机械手在下降的途中被按下停止),还有变量I<=3(是防止在机械臂左转的时候按下停止),料到位传感器和操作指示灯(是防止在放料和加工料是按下停止);当第二种情况成立时,将变量J赋值为2,进入下面;
ELSIF "吸盘" OR "吸盘" & "机械手伸出" OR "吸盘" & "机械手伸出到位传感器" OR
"数据块_1".机械手下降次数<>0 OR "数据块_1".变量I<=3 & "吸盘" OR
"料到位传感器" OR "A操作指示灯"OR "B操作指示灯"OR "C操作指示灯" THEN
"数据块_1".变量J := 2;
进到第2步后,我们要等到机械臂运行到初始位置是来进行停止;输出点12是操作加工6s后的输出;还有料到位、输出点17(是机械手机械手缩回的输出)和机械臂右转;
初始位条件成立后,将定时器输出、流程步、变量等等都清零,让我们能够再次重新启动。
//按下停止的第2种情况:机械手在搬运工件或在搬运的途中,或者工件正在加工;按下停止后返回
//初始位,传送带停止;
2:
IF "输出点12"& "料到位传感器"=0 & "机械臂右转" & "输出点17" THEN
RESET_TIMER("IEC_Timer_0_DB");
RESET_TIMER("IEC_Timer_0_DB_1");
RESET_TIMER("IEC_Timer_0_DB_2");
RESET_TIMER("IEC_Timer_0_DB_3");
RESET_TIMER("IEC_Timer_0_DB_4");
RESET_TIMER("IEC_Timer_0_DB_5");
RESET_TIMER("IEC_Timer_0_DB_6");
RESET_TIMER("IEC_Timer_0_DB_7");
RESET_TIMER("IEC_Timer_0_DB_8");
RESET_TIMER("IEC_Timer_0_DB_9");
RESET_TIMER("IEC_Timer_0_DB_10");
RESET_TIMER("IEC_Timer_0_DB_11");
RESET_TIMER("IEC_Timer_0_DB_12");
"机械臂右转" := 0;
"机械臂左转" := 0;
"数据块_1".机械手下降次数 := 0;
"数据块_1".流程步 := 0;
"数据块_1".变量I := 0;
"数据块_1".变量J := 0;
END_IF;
最后就是第3种停止情况:
第三种情况:机械手要将工件放入仓库时或运行途中,按下停止,机械并应先运行完当前工作并返回初始位后停止,不影响下次启动。
这个停止情况是运行到第4时,按下停止;和上面基本相同,就找第4次运行时的动作来做条件;
机械手下降次数和左转右转次数以及机械臂等等。
ELSIF "吸盘" & "数据块_1".机械手下降次数=4 OR "数据块_1".变量I=4 & "吸盘" OR
"机械臂伸出" OR "输出点20" OR "仓库传感器" THEN
"数据块_1".变量J := 3;
END_IF;
当第3种条件成立,(输出点21是机械臂缩回时间的输出;机械臂右转得电;输出点17是机械手缩回的输出)也将定时器输出点复位,变量,流程步等都复位。
//按下停止的第三种情况:机械手要将工件放入仓库时,先运行完当前工作,然后停止。
3:
IF "输出点21" & "机械臂右转" & "输出点17" THEN
RESET_TIMER("IEC_Timer_0_DB");
RESET_TIMER("IEC_Timer_0_DB_1");
RESET_TIMER("IEC_Timer_0_DB_2");
RESET_TIMER("IEC_Timer_0_DB_3");
RESET_TIMER("IEC_Timer_0_DB_4");
RESET_TIMER("IEC_Timer_0_DB_5");
RESET_TIMER("IEC_Timer_0_DB_6");
RESET_TIMER("IEC_Timer_0_DB_7");
RESET_TIMER("IEC_Timer_0_DB_8");
RESET_TIMER("IEC_Timer_0_DB_9");
RESET_TIMER("IEC_Timer_0_DB_10");
RESET_TIMER("IEC_Timer_0_DB_11");
RESET_TIMER("IEC_Timer_0_DB_12");
RESET_TIMER("IEC_Timer_0_DB_13");
RESET_TIMER("IEC_Timer_0_DB_14");
RESET_TIMER("IEC_Timer_0_DB_15");
RESET_TIMER("IEC_Timer_0_DB_16");
RESET_TIMER("IEC_Timer_0_DB_17");
RESET_TIMER("IEC_Timer_0_DB_18");
"机械臂右转" := 0;
"机械臂左转" := 0;
"数据块_1".机械手下降次数 := 0;
"数据块_1".流程步 := 0;
"数据块_1".变量I := 0;
"数据块_1".变量J := 0;
END_IF;
到这里停止部分就完成了,我们随便试一下,看效果怎么样:
好的!那么这个传送带模拟控制程序到这里就完成啦!
3.完整程序图
下图是完整的程序编写:
总结
上面就是 《装配流水线模拟控制》的内容;大概看一下流程还是很多的,主要是我将每个动作都细分为流程步了,一步一步写的;大家在编写此程序是可以将多步合在一起,整体也会简便许多的;关于这个应用案例,写得不是特别详细,像上升沿下降沿和定时器复位指令;这些可以自己代入项目应用一下,基本上就可以掌握了;最主要的是想通过这个应用项目让大家在写程序时有一个自己的思路,这样编写起来会好很多;这个案例用if语句很不好写(自己的感觉),在编写时写到第4步就感觉很乱了,后面想了想:在梯形图编时,我一般会用传送指令来写,那在这里怎么就不行了呢!上面代码和思路可供大家参考一下!下面的一个应用是 使用scl来写 交通灯模拟控制这个应用,大家可以写写!