实现虚拟工厂场景之一的智能仓储实验
注:本文仅供参考
目录
引
入仓部分
1.上料部分
1.效果
2.实现
2.入仓部分
1.效果
2.实现
3.入仓扩展
1.行列控制和优先级
2.入仓优化和完善
出仓部分
1.出仓
2.后传送带
3.出仓效果
1.效果
2.优先级
3.完善
总结
末
使用的软件是博图V16和factoryio;场景是软件中布置好的场景;仓储是使用的坐标控制(右键仓储--配置----选择Analog)。
引
本篇文章我们来一起实现虚拟工厂中的仓储场景;要实现具体功能: 入仓、出仓和优先级控制。
场景如图所示:
这里大家可以先跟着自己的思路看一看如何实现(以实现具体功能为主) ;
好!下面我们一起来看!
入仓部分
根据场景可以简单分为两部分,上料部分和入仓存储部分,这里我们一个一个来看;
1.上料部分
1.效果
2.实现
上料:(要求:第一个传感器控制料源,2个传感器控制传送带运行和停止)
实现:
首先看料是否在传送带上,如果传送带上没有料,料源开始上料,上过后就断开(这里的传感器是NPN型,没有触发时是得电状态,触发后断开)同时传送带1和传送带2运行(因为料到位传感器还没触发,所以一直得电,BZ3就一直得电,传送带就运行)当碰到料到位传感器,停止;然后这里加了一个延时,当前面的料被拿走之后,延时一段时间传送带再继续运行。
后面这里我们给一个料到位信号,当变量为1时代表料已经到位了,可以进行下面的动作了;
这里上料部分就完成了,下面我们看入仓!!!
2.入仓部分
入仓我们所要实现的功能就是把传送带上的料,准确的放在货架上就可以了!
1.效果
2.实现
入仓 :(要求:准确的将料放在货架上)
思路:
在场景配置中我们使用的是坐标控制,在编写程序时,我们只要找到每个货架位置的坐标,然后将坐标执行就可以了!
实现:
动作:当上料完成后,气叉伸出将料抬起,然后缩回,缩回后,再根据坐标运行到指定货架位置,气叉伸出将料放置在货架上,缩回,回原点,然后循环执行。
这个货架是6*9 ,也就是6行9列,我们只要找到第1行和第1列的坐标,其它就知道了。
图1: 坐标
我们建立两个数组,来存放X轴和Y轴的坐标,将图1的坐标填在两个数组的起始值里面,后面我们将料准确的运送到货架位置就是根据这个坐标,例如:第1个(第一行第一列)坐标就是0.7,1.42,如图2 就是两个轴嘛;X轴控制左右移动,Y就控制上下高度。
图2:
动作实现:
流程1:
按下启动,置位中继1,传送1给变量SS,然后启动上料。
流程2:
中继1和变量SS得电,判断料是否到位,到位后气叉左伸到第2步,在第2步接收一个气叉左伸到位信号,将上升值给Y轴 上升一定高度(这上升值是提前设置好的,上升0.7);然后判断是否上升到位(是用Y轴的当前值和上升值来比较),上升到位后,气叉缩回,走下一步;
注意:
图3 上面是Y轴要走的坐标,下面是当前值也是实时值,当实时值等于坐标值,那就代表运行到位,我们就可以进行下一步。
图3
注意:
坐标值会和当前值会有一定的误差,并不是完全相等的;
这里试一下,坐标1.1,但实际的当前位置时1.093681;所以还不能够直接用,我们就转换一下,乘10 取整 再除10,就可以了。
将Y轴当前值乘10,然后取整,最后再除10,得到Y轴 的一个取整值,再和我们设置的上升初始值进行比较判断是否到达位置,到达后准备下一步动作;注意:这里要确定是几位小数,如果是1位就乘10取整再除10,如果是2位小数,那就是乘100,这里我们的坐标值是两位小数,所以是乘100的;
流程3:
到第3步后,判断气叉是否缩回到位,到位后将X轴Y轴数组内存放的坐标传送给X轴Y轴;(注:数组下标使用的是变量,后续在执行下一个坐标时,只需要对变量+1就可以了)
流程4:
第4步,看X轴Y轴是否到位,到位后,气叉右伸,右伸到位,气叉要下降一些来使料能够落在货架上(其中数据块_1.XJ是提前计算好的一个值,在第四步将Y轴执行坐标减去0.4也就是下降0.4,结果给数据块_1.XJ)
然后再判断Y轴是否下降到位,到位后将气叉缩回,中间有一个延时(可以不要);
注意!!! 这里不能直接使用这一个计算后的结果,它们虽然看着是相等的,但实际不是,前面也说到坐标值和它实际的当前值是有一定误差的(就像坐标0.7,但实际是走了0.6956),这里也是,所以这里也要将算出的下降值转换一下再使用;
转换值
流程5:
到第5步,当右伸气叉缩回到位将X轴Y轴清零,回到原位;
流程6:
第6步就是回到原位后对变量M进行+1,流程步赋值为1(执行新的流程),下面再进行一个判断看一列9个是否放完,放完后对N进行+1,开始第2行,以此类推,直到6行9列都执行完,回到原位停止。(这里判断时N=7 M=10,因为当N=6 M=9 时,还正在执行入仓动作,不能停)。
那么简单入仓部分就完成了!!!
3.入仓扩展
1.行列控制和优先级
行列控制:
控制变量M和N就可以了,如果是3行4列,那么判断条件就是M=5 N=4;
优先级:
这里我们先用9列来举例;上面程序是M初始为1,然后执行完+1,顺序就是1,2,3,4....;如果我们要倒着放料,就将M初始值变为9,然后执行完-1,那么顺序就是9,8,7,6,5.....
控制行数也是一样的,颠倒一下!
2.入仓优化和完善
优化:
使用上面的程序可以将我们的料都准确的放在货架上,完成上料任务;但是哈但是我们怎么能够知道我们的料放在这里了呢?也就是说料放上去之后,没有一个完成信号来告诉我们这个料放上去了;当然一般仓储上会有相应的传感器或者限位什么的,然后我们使用限位就可以知道是否放上去了,但是这个场景里面并没有,咱总不能再给54个货架上都装上传感器(当然后面自己可以装几个来试一试);那么我们怎么这种效果呢?另外我们需要这个信号的目的是什么呢?目的是,放料上去之后,让程序知道这里有料了,就不再放这里;另外如果有外部因素把我们放的料弄掉了,再按下启动,需要它把缺的料补上,但是我们目前写的程序会再重新给每个位置上料,这是不行的;还有在后面进行出仓时,我们就可以根据这一个信号来进行出仓! 效果我们就先通过数组来模拟实现一下!
思路:
货架一共是6行9列54个位置,我们分别来给这54个位置对应一个输入点(也就是I点,I点是来判断当前位置是否有料;这里使用的是数据块,并不是真实的I点),按下启动后,检查这54个位置哪一个有料哪一个没料,有料就不再上料,没有料就上料 。
实现(SCL):
我们建立一个对应的2维数组,来表示这54个位置; 然后通过遍历这54个位置找到没有料的位置,再将这个料的坐标提取出来(例:第1行第4个,那么坐标就是(1,4),我们根据坐标找到前面设置的X,Y轴的起始值),然后执行坐标位置,就可以了!
这里使用for循环来执行此动作,上面程序只做稍微修改就可以了。
流程1:
建立2维数组;
流程2:
使用For循环来遍历数组,找到哪一个不为真,就将当前的X,Y 赋值给变量M 和 N ,然后通过ex跳出循环,执行相应坐标。
FOR #Y := 1 TO #行 BY 1 DO
FOR #X := 1 TO #列 BY 1 DO
IF "数据块_1".数组[#Y, #X] <> TRUE THEN
"数据块_1".M := #X;
"数据块_1".N := #Y;
#BZ[10] := 1;
EXIT;
END_IF;
END_FOR;
IF #BZ[10] THEN
#BZ[10] := 0;
EXIT;
END_IF;
END_FOR;
流程3:
当料放上去之后(气叉右伸缩回后),代表料已经放上去了,我们让变量条件1为1;
当条件1为1是,我们将X,Y对应的数组元素置为1,代表放料完成;
IF "数据块_1".条件1 = 1 THEN
"数据块_1".数组[#Y, #X] := 1;
"数据块_1".条件1 := 0;
END_IF;
流程4:
最后判断是否循环完,如果循环完,全部上料完成了,变量连接1赋值为1;
IF #X = #列+1 & #Y = #行+1 THEN
"数据块_1".连接1 := 1;
END_IF;
当等于1时,将流程步清零,程序停止。
修改后的程序:
效果:
完善:
这里我们将程序完善一下,前面启动有了,那么停止和急停是少不了的;
停止:按下后,执行完当前正在进行的一个,回到原点后停止;
这里我们在按下停止后,给一个变量传一个数,在回到原点时判断这个变量是否等于传的数值,如果是就清零停止,就可以了。
急停:按下后,立即停止;
可以给主程序加一个常闭,按下后,给程序断电;但是在执行X轴,Y轴坐标时,无法立即停止(实际中的话会停止),那就用一个按钮控制虚拟工厂中的暂停键,来达到急停目的。
出仓部分
下面我们来实现出仓,出仓和入仓相反,入仓是找哪里没有料,出仓则是找哪里有料;
找到料后,再执行气叉部分,将料运至后方的传送带就可以了。
1.出仓
执行动作:
按下出库按钮后 ,给变量连接1 传送1,复位中继1(中继1控制上料部分停止);
流程1:
按下按钮后,等待变量SS为0(在入仓时按下出仓按钮,则要等入仓完成后再执行出仓)
当回到原点后,for循环遍历数组,看哪一个为真(有料),找到后将坐标先赋值给入仓的XY坐标(避免入仓和出仓冲突,造成程序无法运行),然后将相应的存放坐标给X轴和Y轴执行;然后跳出循环,将出仓步赋值为2,进行下一步。
IF "数据块_1".连接1=1 THEN
IF "数据块_1".SS = 0 THEN
FOR #出仓Y := 1 TO 6 DO
FOR #出仓X := 1 TO 9 DO
IF "数据块_1".数组[#出仓Y, #出仓X] = true THEN
#X := #出仓X;
#Y := #出仓Y;
#X轴坐标 := "数据块_1".X存放坐标[#出仓X];
#Y轴坐标 := "数据块_1".Y存放坐标[#出仓Y];
#WR := 1;
EXIT;
END_IF;
END_FOR;
IF #WR = 1 THEN
#WR := 0;
EXIT;
END_IF;
END_FOR;
"数据块_1".出库步 := 2;
END_IF;
END_IF;
流程2:
找到位置后,执行,等待执行到位,到位后变量清零,到第3步,下降一定高度,气叉右伸出;伸出到位后,上升一定高度,将料抬起,抬起到位后,气叉缩回;缩回到位 回原点,到原点后,上升一定高度,抬起料,气叉右伸出,到位后下降;将料放置在传送带上,气叉缩回;
另外在执行到第7步时(气叉将料抬起),将数组对应位置清零,代表这里料被取走了。
IF "数据块_1".出库步 = 7 THEN
"数据块_1".数组[#出仓Y, #出仓X] := 0;
END_IF;
流程3:
当气叉缩回到位后,判断货架的料有没有出完,如果没有出完就将变量连接1 赋值为1,继续寻找下一个需要出料的位置进行出料,如果出仓X 和Y 等于10 和7 代表料出完,将出库步 清零,停止出仓。
其中变量HH是来判断,在出仓时是否按下入仓按钮,如果按下就在出仓结束将连接1 清零,变量SS赋值为1,进行入仓操作。
流程4:
对入仓按钮和出仓按钮加以限制:
按下入仓启动后,数据块_SS为1,开始执行入仓;同时入仓启动不再被触发(防止入仓运行时,又按下入仓,导致数据块_SS又为1,程序会出错),另外数据块_SS 只有在按下出仓按钮后,入仓完成后才会清零;当出仓在运行时 数据块_出库步<>0,如果这时按下启动入仓,触发HH为1,在出仓执行完后进行入仓;
2.后传送带
出仓的料会放在后传送带上;具体动作就是,当传感器检测到料后,传送带运行,把料传送至消料处。
实现:
3.出仓效果
1.效果
2.优先级
出仓优先级和入仓基本相同;将初始值和结束值颠倒一下就可以改变它的出仓顺序;(颠倒Y是控制上下顺序,颠倒X是控制左右顺序)
3.完善
1.停止
按下停止时有两种情况:一是刚启动,传送带在运行,入仓部分还没有运行;这时按下停止,只 要把传送带停止就好,按下启动后再次启动。
二是已经完全启动,传送带和入仓都在运行,这时按下停止,要执行完 当前一个流程后,回到原点停止,可以再次启动。
实现:
按下停止,判断SS是否=1,如果=1,代表传送带正在运行;我们把中继1停掉,传送带停止,并且把SS清0,让它可以再次启动;
如果SS>1,那么代表气叉已经运行了,我们就传送一个1给停止变量;在回到原位时,来判断是否按下了停止,如果是就不在运行。
出仓停止和入仓一样:
当出库步<>0时,代表出库按钮按下,这时按下停止,我们也给停止变量传1,到回到原位停止运行。
入仓:
出仓:
效果:
2.急停
按下后立即停止,这里因为断电后坐标值还会执行,所以可以使用虚拟工厂中的暂停按钮;
在驱动执行器中找到下图这个,给它分配一个Q点,然后我们控制这个Q点,就能控制工厂暂停了。 注:不能使用工厂内的按钮了,只能用一个plc内部M点来控制。
实现:
3.注释
最后,我们再给程序写上注释,就大功告成了!
总结
注: 本文仅个人思路,仅供参考!如有错误,还望指出!
1.急停实现不了(大家有没有什么好的办法?可以和我说一下。)
2.按照思路一步一步来实现,如果程序出现错误,要先找到是哪里出现了错误,找到后再想办法解决,最后调试!(要相信,办法总比困难多!)
3.程序要多调试几遍,有些问题可能会在调试多遍后才出现。
4.记得写注释!(时间久可能会忘记)
5.程序每写好一点,都要记得保存!保存!保存!
以上就是本文的所有内容了!
末
完结撒花!!!!!!!
拜拜喽!