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

2023-11-12

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

注:本文仅供参考

目录

 引

入仓部分

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

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



末 

 完结撒花!!!!!!!

拜拜喽! 

 


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【factoryio】虚拟仓储实现(入仓&出仓) 的相关文章

随机推荐

  • (七)Mybatis当中#{}和${}的区别详解

    这篇文章主要讲述Mybatis当中 和 的区别 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来一起学习学习吧 和 的区别 key 获取参数的值 预编译到SQL中 安全 key 获取参数的值 拼接到SQL中 有SQL注
  • 【FPGA】十三、Vivado MIG IP核实现DDR3控制器(1)

    文章目录 前言 一 DDR3基础知识 二 MIG IP核的配置 三 DDR3 IP核用户端接口时序 1 DDR3 IP核接口说明 2 DDR3 IP核读写时序 写命令时序 写数据时序 读数据时序 总结 前言 我们在进行FPGA开发应用当中
  • 利用Opencv提供的imencode和imdecode进行图像视频传输(发送端支持Linux和Windows双系统)

    关于网络图像传输 网上大多数都是基于像素访问进行传输 传输的大小是图像的分辨率以及他的通道数 一般普通摄像头拍摄到图像大小的分辨率是640480 也就是说单通道灰度图像 一次要传输的数据量大小是640480 307200个字节 如果是彩色3
  • k8s服务无法访问

    无法访问k8s服务问题分析过程 1 查看pod是否正常 2 查看service是否正常 3 查看endpoints是否绑定 4 检查配置文件 从过程3可以看出问题出在endpoints的绑定上面 通过仔细检测配置文件发现是pod的配置中ap
  • STM32HAL库-移植mbedtls开源库示例(一)

    目录 概述 一 使用方法 二 STM32CubeMx配置 三 Examples 四 运行结果 五 总结 概述 本篇文章介绍如何使用STM32HAL库 移植mbedtls开源库支持mqtt证书加密示例 GitHub https github
  • 剑指 Offer 43. 1~n整数中1出现的次数 思路整理

    题目描述 输入一个整数 n 求1 n这n个整数的十进制表示中1出现的次数 例如 输入12 1 12这些整数中包含1 的数字有1 10 11和12 1一共出现了5次 原题链接 https leetcode cn com problems 1n
  • 【腾讯云 Cloud Studio 实战训练营】用于编写、运行和调试代码的云 IDE泰裤辣

    文章目录 一 引言 二 什么是腾讯云 Cloud Studio 三 Cloud Studio优点和功能 四 Cloud Studio初体验 注册篇 五 Cloud Studio实战演练 实战篇 1 初始化工作空间 2 安装 antd mob
  • kaggle资源

    2019 03 07 这里记录几个认为比较好的kaggle kernel 有些是数据分析 有些是针对算法 1 COMPREHENSIVE DATA EXPLORATION WITH PYTHON 这个kernel通过对变量分析 他的数据集都
  • (Java)leetcode-23 Merge k Sorted Lists(合并K个排序链表)

    题目描述 合并 k 个排序链表 返回合并后的排序链表 请分析和描述算法的复杂度 示例 输入 1 gt 4 gt 5 1 gt 3 gt 4 2 gt 6 输出 1 gt 1 gt 2 gt 3 gt 4 gt 4 gt 5 gt 6 思路1
  • Vue项目点击侧边栏展开与折叠功能

    注 带这个符号必须要有的 路由配置 path App name App component gt import App vue 首页App vue
  • 交叉编译(全志)

    文章目录 一 交叉编译概念 二 香橙派交叉编译 3 带WiringPi库的交叉编译 一 交叉编译概念 交叉编译 就是 在一种平台上编译 编译出来的程序 是放到别的平台上运行即编译的环境 和运行的环境不一样 属于交叉的 例 在进行嵌入式开发时
  • 程序员或IT从业者笔记软件大观

    苹果 橘子 梨 好多啊 呵呵 哦不对 我要说的 不是种种水果 而是各式各样的笔记软件 你会不会陷入选择恐惧症呢 不过道理是差不多的 那就是 青苹果 红苹果 或者烂苹果 在选择的过程中 除了传统的Word WPS 其它的你可能也都会尝一尝 好
  • 云原生架构体系

    云原生 Cloud Native 的概念在国内提及的越来越多 但大部分人对云原生的认识仅限于容器 微服务 DevOps等内容 把容器 微服务 DevOps就等同于云原生 这显然是不对的 CNCF从其自身的角度定义了云原生技术 云原生技术使企
  • Windows下安装Android Studio

    一 下载Android Studio 官网地址 http www android studio org 个人也推荐使用官网推荐的 可以省去一定的步骤跟麻烦 二 安装Android Studio 这里选择下路径 当然也可以不用进行修改 因为我
  • java开发不会找错怎么办_Java开发中常见错误及规避技巧

    原标题 Java开发中常见错误及规避技巧 在开发Java软件时可能会遇到许多类型的错误 但大多数可以避免 我们列举了50个最常见的Java软件错误 其中包含代码示例和教程 以帮助您解决常见的编码问题 编译器错误 编译器错误消息在Java软件
  • webAR涉及的技术

    1 技术体系 1 1技术体系整理 其中绿色底色的代表Demo中表现出的能力比较成熟 可以直接应用 脑图地址 http naotu baidu com file 3392a895a903972520b2f65fda12ee3c token 5
  • C++模板特化与部分特化(偏特化)

    模板即是对类型的一种泛化 当我们的模板对某种特定类型有特定的实现时 模板特化即是一个很好的解决方案 一 模板特化 template
  • Python Web执行迁移文件命令

    在 Python 中执行迁移文件的命令通常是使用 Django 的 migrate 命令 要使用 migrate 命令 首先需要确保你已经在 Django 项目的根目录下 然后运行以下命令 python manage py migrate
  • C语言%lld、%llu无法正常输出比long long长整数小的数

    lld和 llu是长整型变量long long的格式化字符 用来输出有符号和无符号长整型数据 printf longlong max lld min lld LLONG MAX LLONG MIN printf nunsigned long
  • 【factoryio】虚拟仓储实现(入仓&出仓)

    实现虚拟工厂场景之一的智能仓储实验 注 本文仅供参考 目录 引 入仓部分 1 上料部分 1 效果 2 实现 2 入仓部分 1 效果 2 实现 3 入仓扩展 1 行列控制和优先级 2 入仓优化和完善 出仓部分 1 出仓 2 后传送带 3 出仓