【factoryio】虚拟仓储实现(入仓出仓)

news2025/1/11 18:39:20

实现虚拟工厂场景之一的智能仓储实验

注:本文仅供参考

目录

 引

入仓部分

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.程序每写好一点,都要记得保存!保存!保存!

以上就是本文的所有内容了!



末 

 完结撒花!!!!!!!

拜拜喽! 

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux时间服务器(ntp)

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 一.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 1、软件安装 [rootl…

高速前行的低代码,其能力边界到底在哪?

最近半年&#xff0c;有好些来自不同岗位、不同立场的人开始问同一个问题&#xff1a;低代码平台的边界是什么&#xff1f;低代码无所不能吗&#xff1f; “全民开发”、“人人都是开发者”这样的口号愈演愈烈&#xff0c;“低代码能力有没有边界”、“边界在哪”&#xff0c;这…

数据要素化全面提速,数据复制将迎来春天?

数据复制市场将迎来真正的春天&#xff1f; 目前看的确如此。近日&#xff0c;国家发改委密集发文&#xff0c;从产权、分配、流通、安全等多个角度解读“数据二十条”&#xff08; 《中共中央国务院关于构建数据基础制度更好发挥数据要素作用的意见》&#xff0c;简称“数据二…

算法的时间复杂度和空间复杂度(1)

1.算法效率 2.时间复杂度 3.空间复杂度 1.算法效率 如何衡量一个算法的好坏&#xff1f; 比如对于以下斐波那契数列&#xff1a; long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2)&#xff1b; } 斐波那契数列的递归实现方式非常简洁&#xff0c;但…

SOFA Weekly|SOFA 开源五周年来自社区家人的祝福、社区本周贡献 issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

《程序员面试金典(第6版)》面试题 10.05. 稀疏数组搜索(二分法,分治算法入门题目,C++)

题目描述 稀疏数组搜索。有个排好序的字符串数组&#xff0c;其中散布着一些空字符串&#xff0c;编写一种方法&#xff0c;找出给定字符串的位置。 示例1: 输入: words [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s “t…

2023有哪些便宜好用的蓝牙耳机?性价比最高的无线耳机排行

不管入手什么东西&#xff0c;性价比永远能成为人们入手的最重要的参考要素之一。那么&#xff0c;在蓝牙耳机市场中&#xff0c;有哪些便宜好用的蓝牙耳机&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比最高的无线耳机&#xff0c;一起来看看吧。 一、南卡小音…

采购系统是如何管理供应商的?

随着数字化的推进&#xff0c;企业面临着越来越多的供应商管理问题。企业采购数字化转型已经成为大势所趋&#xff0c;对于采购数字化转型而言&#xff0c;供应商管理是重要一环。 供应商准入管理 在供应商准入阶段&#xff0c;企业需要从供应商资质、财务能力、信誉能力、管理…

vite 安装腾讯im组件TUIKit问题记录

按照vue3ts要求安装依赖包 即时通信 IM Web & H5-含 UI 集成方案&#xff08;荐&#xff09;-文档中心-腾讯云 (tencent.com) 这个版本的文档采用全局安装sass&#xff1a; npm install -g sass sass-loader10.1.1 实际安装后遇到无法解析sass的错误提示&#xff0c;使用…

JumpServer堡垒机部署+基本使用

文章目录JumpServer 堡垒机一、理论知识&#xff1a;1、堡垒机与跳板机的区别2、JumpServer4A认证二、实践实验:1、初始化环境准备2、MySQL数据库部署3、Python3.6 程序部署4、Redis数据库部署5、Core组件部署6、Koko组件部署7、Guacamole组件部署1、安装FFmpeg2、安装Guacamol…

socket 及 字节序转换(嵌入式学习)

socket 及 字节序转换socket简介Socket为什么需要Socket&#xff1f;socket类型Socket通信模型字节序主机字节序到网络字节序网络字节序到主机字节序IP地址转换socket简介 1、1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口 2、1986…

SAP MDG —— 使用DIF导入物料主数据 Part2 配置和应用

文章目录关于使用DIF处理物料主数据的相关信息配置定义数据传输对象类型 Object Types文件源和存档目录Web Dynpro 应用导入选项MDG_BS_FILE_IMPORT 的选择项本章小结关于使用DIF处理物料主数据的相关信息 配置 定义数据传输对象类型 Object Types 路径&#xff1a; MDGIMG-…

读懂AUTOSAR :DiagnosticLogAndTrace DLT(四)-- API解析

一、周期调用的函数&#xff1a;Dlt_TxFunction 根据参数DltGeneralTrafficShapingSupport&#xff0c;决定如何去发送DLT消息。如果为TRUE&#xff0c;那需要参考参数DltLogChannelTrafficShapingBandwidth为每个Log通道设置发送带宽&#xff1b;如果为FALSE&#xff0c;那么…

《LKD3粗读笔记》(9)内核同步介绍

文章目录1、临界区和竞争条件2、 加锁3、死锁4、争用和扩展性实现内核同步的意义是什么&#xff1f; 目前内核支持SMP&#xff0c;所以共享资源一定要防止并发访问&#xff0c;如果多个执行线程同时访问和操作数据&#xff0c;就可能发生各线程之间相互覆盖共享数据情况&#x…

ABeam News | 松下家电(中国)生产销售一体化SAP S/4HANA项目正式启动

近日&#xff0c;由德硕管理咨询&#xff08;上海&#xff09;有限公司参与实施的松下家电&#xff08;中国&#xff09;生产销售一体化SAP S/4HANA项目正式上线&#xff0c;松下集团代表董事全球副总裁本间哲朗先生及ABeam大中华区董事长兼总经理中野洋辅先生出席了项目启动会…

【实验报告】实验二 图像空间域频率域滤波

一&#xff0e;实验目的&#xff1a; 1. 模板运算是空间域图象增强的方法&#xff0c;也叫模板卷积。 &#xff08;1&#xff09;平滑&#xff1a;平滑的目的是模糊和消除噪声。平滑是用低通滤波器来完成&#xff0c;在空域中全是正值。 &#xff08;2&#xff09;锐化&…

【超全总结】集成环信消息推送注意事项(华为、oppo、vivo等)

环信即时通讯 IM 支持集成第三方厂商的消息推送服务&#xff0c;为 Android 开发者提供低延时、高送达、高并发、不侵犯用户个人数据的离线消息推送服务。 当客户端应用进程被关闭等原因导致用户离线&#xff0c;环信即时通讯 IM 服务会通过第三方厂商的消息推送服务向该离线用…

鸿蒙Service Ability的前世今生--进阶篇

二、SA的配置 ​ SA的运行需要配合多个配置项&#xff0c;此节专门对此进行说明。 ​ OpenHarmony中SA一般由两个配置文件和一个so组成。上一章节已介绍了生成so中代码。此节描述下另外两个配置文件(.cfg或.rc、xml)。 ​ SA的启动一般采用.cfg或.rc .xml libxxx.z.so方式…

Python 编程必不可少的unittest测试框架

一段表面看起来平平无常的代码&#xff0c;很可能暗藏很多bug无法一眼看透&#xff0c;没有经过测试的代码是不可靠的代码。上一篇讲过pytest测试框架这次我们换个框架。 unittest 是一个单元测试框架&#xff0c;单元测试完成对一个模块、一个类或一个函数的运行结果进行检验…

SpringSecurity之注销与自动登录

前言 前面我们讲解了用户的登录以及用户授权的过程。今天我们看一下&#xff0c;系统中常用的注销与自动登录各功能&#xff01; 注销操作 注销操作&#xff0c;首先需要在我们的配置类中添加上我们的注销路径。主要配置详见下方标红处代码&#xff0c;标记了退出的路径以及…