使用scl来编写实虚拟工场中的一个机械手加盖应用项目
文章目录
目录
文章目录
前言
1.机械手加盖场景
2.了解各部分功能
3.命名变量找出输入输出
4.在博图建立变量
二、编写思路
1.分析
2.使用小模块化来编写
3.确定编程思路
三、编程
1.上料部分
2.机械手部分
3.对块进行连接
4.完整流程
四、完善和效果
1.停止,复位,急停
2.加数,模式切换
3.效果
总结
前言
这章我们来编写一下虚拟工厂软件中的一个仿真应用——机械手加盖模块,本篇文章主要分为下面几个部分 :1.场景分析 2.编程思路 3.实现方法 4.编写控制程序 5.完善优化和总结。下面我们就通过这些步骤一步一步将应用案例完成,并对所学习的scl语言编程进行巩固和强化!
一、场景部分
打开factoryio(虚拟工厂)软件,找到里面自带的一些工程场景,我们找到机械手加盖这一个。
1.机械手加盖场景
2.了解各部分功能
打开场景后,尽快熟悉各个部位的功能和动作,传送带和传感器比较好理解,机械手的x,y,z轴和气动的一个挡块可以打开实训强制执行器来看一下是如何动作的;或者将上面的英文翻译一下,意思应该都差不多;总之熟悉各部分元件的功能。
3.命名变量找出输入输出
各功能了解后,给它们写上相应的变量名称:
名字写好后,在驱动中找到PLCSIM 将相应的输入输出拖拽上去:
4.在博图建立变量
上面做好后,这里就将博图变量建一下;注:博图建变量时先确定是实际参数还是形式参数,如果是实际参数,在驱动底部将变量导出,然后在博图变量中导入就可以了;如果是形式参数就在FB块中建立变量。
这里是用的形参:
二、编写思路
场景和变量做好后,下面就是编写思路部分了!
1.分析
这是一个标准的加盖场景,这个场景中有一个控制台,两个传送带和两个气动挡块,还有一个机械手;虽然没有具体的控制要求,但是传送带,机械手和挡块这些部分是有基本控制的,就像传送带,要么运行要么停止;机械手也一样,基本的控制就是伸出缩回,下降上升,吸盘得电失电等。所以在这里我们基本可以知道一个大概的流程是什么样的啦!
这里并不是一定要有具体的控制要求才能写程序,只要有基本控制是一样可以的!
2.使用小模块化来编写
简单分析过之后,我们的基本流程是:按下启动后,传送带进行上料,当料到达挡块位置后,传送带停止;机械手夹起料,伸出机械臂将料盖放在料的底座上,同时挡块抬起,让加过盖子的料继续传送,到达指定的地方;一个基本的流程就是这样了。
那我们要怎样进行编写呢!不错,和小标题一样 使用小模块化,具体就是将机械手写成一个块,传送带一个块,或者其他的一些写成一个块;最后根据具体化的控制流程在一个主程序里面按照要求来将各个块连接起来,完成要求!
3.确定编程思路
分析好之后,我们这里使用块来编写,机械手的控制时一个函数块,传送带是一个函数块,还有函数块是将它们联系起来,最后完成我们的加盖控制要求!
三、编程
按照上面的思路我们建立相应的程序块:第一个是和虚拟工厂仿真连接的一个fc块,第二个和第四个是来写机械手后上料控制的块,第三个是实现具体控制的一个块。
1.上料部分
我们根据场景来看上料部分(传送带部分)的一个简单流程:按下启动后,两个传送带要开始运行,当运行到传感器位置后,传送带停止,这时挡块得电将两个料摆好,就完成了。
(注:相应的变量是在块_1中建立的,所以这里使用的是块_1的背景数据,如果感觉这样很乱的话可以使用全局变量来编写)
程序如下:
变量A是一个触发条件,触发后执行下面的程序。
CASE "块_1_DB".A OF
1:
"块_1_DB".#传送带1 := 1;
"块_1_DB".#传送带2 := 1;
"块_1_DB".A := 2;
2:
IF "块_1_DB".PF[0].Q THEN
"块_1_DB".传送带1 := 0;
"块_1_DB".ZJ1 := 1;
END_IF;
IF "块_1_DB".PF[1].Q THEN
"块_1_DB".传送带2 := 0;
"块_1_DB".ZJ2 := 1;
END_IF;
IF "块_1_DB".ZJ1 & "块_1_DB".ZJ2 THEN
"块_1_DB".ZJ1 := 0;
"块_1_DB".ZJ2 := 0;
"块_1_DB".A := 3;
END_IF;
3:
"块_1_DB".挡块1 := 1;
"块_1_DB".挡块2 := 1;
IF "块_1_DB".挡块到位信号1 THEN
"块_1_DB".挡块1 := 0;
"块_1_DB".ZJ5 := 1;
END_IF;
IF "块_1_DB".挡块到位信号2 THEN
"块_1_DB".挡块2 := 0;
"块_1_DB".ZJ6 := 1;
END_IF;
IF "块_1_DB".ZJ5 & "块_1_DB".ZJ6 THEN
"块_1_DB".I := 1;
"块_1_DB".ZJ5 := 0;
"块_1_DB".ZJ6 := 0;
"块_1_DB".A := 0;
END_IF;
END_CASE;
上料效果:
这里可来简单看一下!
2.机械手部分
上料部分完成后,下面就是机械手动作部分了(前面文章也写过的),这里就简单说一下基本控制:料到位后,机械手下降抓取料,然后上升,机械手伸出,伸出后下降,将料放进去,然后机械手上升,回到原位,就好了!
程序如下:
这里只用到了机械手的x轴后z轴,还是比较简单的。
#TT[0].TON(IN := #BZ1,
PT := T#1s);
#TT[1].TON(IN := #BZ2,
PT := T#1s);
#TT[2].TON(IN := #BZ3,
PT := T#1s);
#TT[3].TON(IN := #BZ4,
PT := T#1s);
#TT[4].TON(IN := #BZ5,
PT := T#1s);
CASE "块_1_DB".W OF
0:
;
1:
"块_1_DB".吸盘 := 1;
"块_1_DB".机械手Z轴 := 1;
IF "块_1_DB".抓取到位 THEN
#BZ1 := 1;
"块_1_DB".W := 2;
END_IF;
2:
IF #TT[0].Q THEN
"块_1_DB".机械手Z轴 := 0;
#BZ2 := 1;
#BZ1 := 0;
END_IF;
IF #TT[1].Q THEN
#BZ2 := 0;
"块_1_DB".W := 3;
END_IF;
3:
"块_1_DB".机械手X轴 := 1;
IF "块_1_DB".伸出缩回信号 THEN
#BZ3 := 0;
ELSE
#BZ3 := 1;
END_IF;
IF #TT[2].Q THEN
#BZ3 := 0;
"块_1_DB".W := 4;
END_IF;
4:
"块_1_DB".机械手Z轴 := 1;
IF "块_1_DB".下降上升信号 THEN
#BZ4 := 0;
ELSE
#BZ4 := 1;
END_IF;
IF #TT[3].Q THEN
"块_1_DB".吸盘 := 0;
"块_1_DB".机械手Z轴 := 0;
#BZ5 := 1;
#BZ4 := 0;
"块_1_DB".W := 5;
END_IF;
5:
IF #TT[4].Q THEN
"块_1_DB".机械手X轴 := 0;
#BZ5 := 0;
"块_1_DB".W := 6;
END_IF;
6:
"块_1_DB".M := 1;//机械手部分完成信号
"块_1_DB".W := 0;
END_CASE;
机械手效果:
3.对块进行连接
这两个块完成后,我们通过一个块_1来进行连接,按下启动后触发上料部分,上料完成后延时1s给一个信号,触发机械手部分。
IF #启动 THEN
#A := 1;
END_IF;
//I为1时代表上料完成,可以进行下一步
IF #I = 1 THEN
#BZ1 := 1;
END_IF;
//上料完成后延时1s,触发机械手部分
//w为1是触发条件
IF #T[0].Q THEN
#W := 1;
#I := 0;
#BZ1 := 0;
END_IF;
//M为1是机械手完成信号
IF #M = 1 THEN
#A := 1;
#M := 0;
END_IF;
4.完整流程
机械手后上料完成后,我们还有一个挡块抬起让完成的料继续传送的动作,如果没有这一个后面就没法继续运行了。
我们来看场景进行分析,在机械手缩回的那一步的同时,我们要让挡块2抬起,传送带2继续运行,直到走过料传感器3,我们再将挡块放下,那么这才是一个完整的流程。
在机械手的第5步,我们让x轴缩回的同时,让挡块抬起,然后再触发传送带(上料部分),在上料部分中再加一个判断,当料到第3个传感器位置时,再让挡块落下。
机械手第5步:
5:
IF #TT[4].Q THEN
"块_1_DB".机械手X轴 := 0;
"块_1_DB".挡块抬起2 := 1;
#BZ5 := 0;
"块_1_DB".W := 6;
END_IF;
上料部分判断:
2:
//判断是否到达第3个传感器
IF "块_1_DB".PF[2].Q THEN
"块_1_DB".挡块抬起2 := 0;
END_IF;
一个流程效果:
四、完善和效果
这里我们对程序进行一个完善。
1.停止,复位,急停
场景的控制台中给我们了4个按钮,1个模式切换,还有一个计数的模拟器。
下面我们来实现一下这几个按钮。
启动我们已经完成了,这里复位和停止我做了一个功能,按下后运行完这次后停止;急停是立即停止,松开后继续运行。
代码:
将急停放在主程序的最前面就可以了。
//复位按钮和停止按钮
IF #复位 THEN
#E := 1;
END_IF;
IF #停止 THEN
;
ELSE
#E := 1;
END_IF;
当E=1的时候,在机械手里面进行一个判断,然让他们不循环就好了。
2.加数,模式切换
加数功能就是,每做好一个完整的料,就对一个变量进行加1,就可以了。
在上料部分进行加1。
2:
//判断是否到达第3个传感器
IF "块_1_DB".PF[2].Q THEN
"块_1_DB".计件器 := "块_1_DB".计件器 + 1;
"块_1_DB".挡块抬起2 := 0;
END_IF;
模式切换功能就是,手动时是按一次启动按钮,系统执行一次;自动就是按一下启动按钮,系统一直执行。
在主程序进行一个选择,然后再机械手里面进行一个判断:
//模式切换部分
//有自动和手动两个
IF #手动 THEN
#Z := 1;
ELSIF #自动 THEN
#Z := 2;
END_IF;
6: //判断是自动模式还是手动模式
IF "块_1_DB".Z = 1 OR "块_1_DB".E = 1 THEN
"块_1_DB".W := 8; //手动模式
ELSIF "块_1_DB".Z = 2 THEN
"块_1_DB".W := 7; //自动模式
END_IF;
7:
"块_1_DB".M := 1;//机械手部分完成信号
"块_1_DB".W := 0;
;
8:
"块_1_DB".传送带2 := 1;
IF "块_1_DB".PF[2].Q THEN
"块_1_DB".计件器 := "块_1_DB".计件器 + 1;
"块_1_DB".挡块抬起2 := 0;
"块_1_DB".传送带2 := 0;
"块_1_DB".E := 0;
"块_1_DB".W := 0;
END_IF;
END_CASE;
3.效果
总结
最后的最后,我们简单来总结一下吧!先说思路,这种分成小模块然后再组装的方法是很不错的,对于一些较大的案例或者有很多设备的项目会很有效果,要比全部写在一起好很多,如果程序哪里出了问题,我们只要找控制部分就可以了,前提是小模块必须是正确的!
然后关于这一个加盖小案例,只要保证两个小的功能块不出问题,那么程序就很容易啦!还有一点我在编写急停时,急停无法停掉两个传送带,不知道大家是不是这样,我暂时还没有找到好的方法!
好了,以上就是今天的内容啦,感谢大家的阅读!