代码改变世界

封闭的一个多月,老菜鸟的 机械手和AGV 自动搬运小项目总结

2022-04-25 10:20  贺臣  阅读(2782)  评论(1编辑  收藏  举报

  

    最近上海疫情严重,闲赋在家无事可做,手机里不断的推送一些无脑的谩骂声音,索性找点事情做,将3月份实施的一个自动搬运小项目做一个简单的汇总,便于今后项目实施中积累一些经验。项目需求非常简单,因为能力有限也做不了大项目,弄点小项目赚点零花钱。

 

    一.  自动搬运需求

 

      (1)车间有多条生产线,要实现在生产线上实现料架的自动搬运,以其中两条生产线未例。(此应用场景在生产车间应该是属于比较常见的场景,布局示意图如下图)

        (2)   A-1,A-2,B-2,B-1 属于一条生产线,C-1,C-2,D-2,D-1 属于一条生产线,其中A-1,A-2,C-1,C-2 是码垛处(将物料将机械手装载到料架上) ,B-2,B-1,D-2,D-1 工台(消耗物料处)

        (3)   A-1,A-2 共用一个机械手用于左右两边码垛,B-2,B-1 共用一个机械手用于左右两边码垛

        (4)   两条生产线共用一台AGV,用于搬运料架往返码垛区和工台区

        (5)   B-2,B-1,D-2,D-1 工作台处各有一个实体按钮,用于呼叫AGV搬运

        (6)   如果人工按 实体按钮 则将指令发给AGV将对应的工台位的空料架搬运到码垛区 进行码垛, 机械手码垛完成之后将满料架自动搬运到工台处进行作业

        (7)   AGV 使用海康的潜伏式AGV,机械手使用汇川机械手

        (8)  A-1,A-2 ,C-1,C-2   AGV 进入都有光栅控制,进入料架底部时需要控制光栅亮,离开时光栅关闭

    

  二. 需求分析

 

  潜伏式AGV:海康,数量1台,RCS控系统下发基本调度,一台主控服务器, B-2,B-1,D-2,D-1  处各有一个实体按钮,用于下发指令给AGV搬运

  A-1,A-2 中间机械手: 汇川,数量1台,汇川PLC控制,Modbus 协议 , TCP/IP

       C-1,C-2 中间机械手: 汇川,数量1台,汇川PLC控制,Modbus 协议 , TCP/IP

     料架:两条线各有两个料架 (设计是每条线有三个料架,最终只使用了两个),料架底部有固定二维码

  搬运通道:搬运通道只允许单台AGV 行走

  光栅:A-1,A-2 , C-1,C-2  与通道交接之处有光栅,其开启/关闭状态由对应的机械手PLC控制,进出信号由AGV给到PLC

 

  现实问题:

  (1)  实体按钮只能发起对AGV的移动指令,只能执行明确的移动指令,比如 P1点 到 P2点, 或者P1点,P2点,P3点,假设由B-1 发起搬运空料架到码垛区 A-1,A-2 , AGV是无法知道哪个地方是空的,所以实体按钮无法明确最终目标点。注:实体按钮只能配置固定的搬运点

  (2)  机械手在码垛状态(工作状态) AGV是不能进入的,需要机械手和AGV有一个比较完善的交互机制

    (3)  海康AGV公开的接口中,只有配置的运行模板关键位置点才有回传,并非所有的坐标点都可以回传数据(可能有其他的方式可以获取,打算个人没有找到)。

  (4)  机械手码垛完成之后,AGV自动将码垛完成的料架搬回到工台的空位,同样面料的(1)问题,需要管理位置的空满状态

  (5)  AGV 控制运动模板中有几个回传参数可以自定义: 开始任务,结束任务,走出储位,继续任务   四个重要的回传信息,也可以通过一些其他的参数来交互,目前还没有理解的很深

  (6)  海康AGV中要明确的区分任务号和请求号,这个给了我不少的困扰

 

  

  AGV运行轨迹分析:

  (1)  未解决空料架,满料架,空库位,满库位的问题,则需要一套统一的控制系统来协调机械手与AGV,假设系统名为 C系统(为了后续文章中的统一称呼)

  (2)  在地图上设定了三个重要的交互点,P1,P2,P3 

  (3)  B-2,B-1,D-2,D-1  实体按钮 按下,AGV统一搬运对应的空料架统一到 P1 (算完成一个搬运任务),到了P1之后然后由C系统判断 A-1,A-2 ,C-1,C-2  哪个点有空位,然后在P1点重新发起一个新的搬运任务

  

 

 

  (4)  以 P1,P2, A-2 为例: P1 开始搬运任务,然后经过P2(通知光栅亮),最终到达A-2 , 在A-2 放下空料架之后回到 P2(通知光栅关闭),同时告知机械手开始码垛。 当此任务完成之后,判断A-1,C-1,C-2 哪个地方有已经满了的货架,则自动开启下一个满料架的搬运任务, 否则会一直在P2等待。以此类推其他四个位置的搬运也是如此。

 

  (5)   判断满料架,仍然接着上面一个示例,假设A-1 区码垛完成,则行走的路径是: P2,P3,A-1,P3,B-2(或B-1)  ,  说明一下料架只能同线搬运,不能混线搬运。在这里我们需要将这个任务拆解为两个任务: P2,P3,A-1 以及 P3,B-2 

  

  (6)  总之增加P1,P2,P3三个点,P1 是为了判断码垛区哪个地方是空位,P2,P3是为了控制光栅的关闭。 但是要注意一点,当A-1,B-2 回程过程中 P2 交互点是必须经过的,但是此时P2点是不能有信号触发的。

 

    根据搬运的轨迹循环在此基础上设计了10个搬运模型模板:

    路线一:B-1(B-2) 到P1 ,使用T01模板,由按钮发起搬运动作   回传参数配置:btnStartOne,btnEndOne

    路线二:D-1(D-2) 到P1 ,使用T02模板,由按钮发起搬运动作 回传参数配置:btnStartTwo,btnEndTwo

    路线三:P1,P2,A-2 (自动回到P2) ,使用模板T03模板,由C系统自动发起 回传参数配置:btnStartThree, btnContinueThree, btnEndThree

    路线四:P1,P3,A-1(自动回到P3) ,使用模板T04模板,由C系统自动发起 回传参数配置:btnStartFour, btnContinueFour, btnEndFour

    路线五:P1,P2,C-2(自动回到P2)  ,使用模板T05模板,由C系统自动发起 回传参数配置:btnStartFive, btnContinueFive, btnEndFive

    路线六:P1,P3,C-1(自动回到P3)  ,使用模板T06模板,由C系统自动发起 回传参数配置:btnStartSix, btnContinueSix, btnEndSix

    路线七:A-2[省略],P2,P3,A-1 (或者A-1[省略],P3,P2,A-2) ,使用模板S01, 由C系统自动发起  回传参数配置:btnStartSeven, btnContinueSeven, btnEndSeven

    路线八:C-2[省略],P2,P3,C-1 (或者C-1[省略],P3,P2,C-2) ,使用模板S02, 由C系统自动发起  回传参数配置:btnStartEight, btnContinueEight, btnEndEight

    路线九:A-2,P2,B-2(B-1) 【或者A-1,P3,B-2(B-1)】,使用模板S03, 由C系统自动发起 回传参数配置:btnStartNine, btnContinueNine, btnEndNine

    路线十:C-2,P2,D-2(D-1) 【或者C-1,P3,D-2(D-1)】,使用模板S04, 由C系统自动发起 回传参数配置:btnStartTen, btnContinueTen, btnEndTen

 

    其中 路线一,路线二 属于同一个类型,任务的发起是由实体按钮发起; 路线三,路线四,路线五,路线六 属于同一种类型,用于搬运空料架到码垛区;  路线七,路线八属于同一种类型,用于AGV到码垛区区满料架; 路线九 ,路线十 是属于同一种类型,用于将满料架搬运到工台

 

    机械手控制点说明(点位明细不详细讲解,能够理解大致的意思就行)

    机械手控制逻辑:A-1(C-1) 左边光栅 ,A-2(C-2) 右边光栅

    (1)    如果空料架搬入A-1(C-1) 判断A-2(C-2)码垛是否完成, 如果码垛完成下发指令机械手开始左边的码垛,否则机械手不做任何改变;

       如果 [D1309]=[ D1310] ,则写入PLC [D1291]=1

       如果 [D1309]!=[ D1310] ,则不做任何动作

    (2)    如果空料架搬入A-2(C-2) 判断A-1(C-1)码垛是否完成, 如果码垛完成下发指令机械手开始右边的码垛,否则机械手不做任何改变;

       如果 [D1307]=[ D1308] ,则写入PLC [D1291]=2

       如果 [D1307]!=[ D1308] ,则不做任何动作

     (3)    AGV进入左边A-1(C-1) 搬运满料架,判断机械手的状态,如果机械手的码垛不在左边工作且码垛数量完成即可进行搬运,否则不能进行搬运;

       如果 [D1307]=[ D1308] && [D1307]>0 && [D1306]!=1 , 则AGV则进入搬运

      AGV搬运开启之后,则需要将PLC中的[D1307]值设置为0

     (4)    AGV进入左边A-2(C-2) 搬运满料架,判断机械手的状态,如果机械手的码垛不在右边工作且码垛数量完成即可进行搬运,否则不能进行搬运;

       如果 [D1309]=[ D1310] && [D1309]>0 && [D1306]!=2 , 则AGV则进入搬运

      AGV搬运开启之后,则需要将PLC中的[D1309]值设置为0

       (5)    如果机械手A-1(C-1) 码垛完成, PLC寄存值:[D1307]=[ D1308] && [D1307]>0 ,且[D1306]!=1

    (6)    如果机械手A-2(C-2) 码垛完成, PLC寄存值:[D1309]=[ D1310] && [D1309]>0 ,且[D1306]!=2

 

    三. 技术问题

    (1) 海康提供了RCS控制系统,对外协议是HTTP协议,所以这个对接就比较方便了。其中几个重要的接口: 下发搬运任务指令,继续任务指令,获取了解与坐标之间的对应关系,同时关于回传的参数设定, 此处对接是比较简单的,一般做web开发的基本不会有问题

    

    (2) 汇川机械手对接,使用Modbus协议,TCP/IP  ,在没有使用真机操作之间可以使用Modbus模拟器 (Modbus Poll,Modbus Slave 软件),网上可以下载。 模拟器上成功了到设备上十有八九就成功了。(关于Modbus以及这个软件的使用可以网上搜索资料,还比较多)。 目前我使用Modbus的通讯组件是HSL(付费,相对较便宜,也就几千块钱),也可以网上找其他的组件。 当然也可以使用KepServer 这个软件,这个是我们在PLC通讯交互中使用最多的软件,有点不必说,缺点就是 贵 

           

    

    

    (3) 因为做硬件的对接所以用的CS程序,但是海康AGV回传又是HTTp协议,所以使用了 Microsoft.Owin 组件做了一个 Web容器的管理,使得CS程序也可以使用浏览器访问其内部。

/// <summary>
        /// 开启API服务
        /// </summary>
        public void Start()
        {
            try
            {
                string baseAddress = ResourceManager.GetSettingEntity("API_URL").Value;
                Microsoft.Owin.Hosting.WebApp.Start<Startup>(baseAddress);
                log.Info("API程序已启动,按任意键退出");
                Console.ReadLine();
            }
            catch (Exception e)
            {
                log.Error("启动API服务异常:"+e.Message);
            }
        }
CS托管API服务

   

    源代码共享地址: https://github.com/hechenqingyuan/gitwcs 

     

    (4) 技术问题汇总

      1. 当前市面出现的智能设备越来越多,很多人都说搞硬件对接,其实当前情况下硬件对接很多都是转化为了HTTP协议对接,还有一些MQTT,MQ等 ,所以对于大部分程序员来说已经完全没有难度,所以对于初学者来说上手也非常快,比如海康的RCS系统对接

      2. 在PLC对接过程中,少不了的 OPC协议 以及 Modbus协议, 这两种协议在PLC对接过程中用的非常多,一般纯软件开发人员接触的相对较少

      3. 协议的转换的重要性,在硬件对接过程中我们一般使用CS端程序,天然的特性决定了其优势,但是当前万物互联的时代,HTTP协议才是最普遍的,所以要想将更多的终端串联在一起,将OPC协议,Modbus 协议的数据转换为HTTP 协议也是非常重要的,极大降低对接难度

      4. 另外市面上就是MQTT协议使用“泛滥”,这个也是在做硬件集成过程中必不可少的,当然还有很多其他的协议,要学习的东西不少

 

    四. 实施总结

      (1)  因为疫情才有了时间记录一下这次项目,项目开发大概花了10天左右的时间,1次/天 实体机模拟测试(主要是信号的模拟),然后4天现场施工调试(没法出门远程支持),然后其他时间就是在协调各种资源推进项目,协调资源施工计划的时间是远大于开发时间的。

 

      (2)  前期的模式非常重要,如果前期不模拟各种信号,真正到真机测试的时候问题会比较多。

 

      (3)  跳出自己的技能圈,虽然都是开发,但是和单纯的软件开发还是有点不一样,这几年主持施工过30多个工厂,跨领域的知识懂的越多,越有助于你在现场工作。

 

      (4)  关于控制部分的心得就是一定要分解各种动作,越精细越好,在施工之前一定要分解动作然后再组合,否则你会感激这样也对那样也对,真正工作起来这也不对那也不对,最关键你还没法改,因为改动的代价太大了。

 

      (5)  心中一定要有一张图,是一张整体的布局图,设备运转流程图,想办法画出你心中的图。如果你不能描绘出这张图,你会感觉非常的掣肘,软件开发技术和设备控制技术都要懂一点才好。

 

      (6) 现场放低你的姿态,你只有和施工人员处在同一个级别他们才会给你说真正的问题,不要以为自己是什么高级技术人员,否则一个焊桩,一个螺丝就搞死你,一顿饭一瓶水可以解决你很多你解决不了的问题,尊重是顺利实施的一个重要手段。

 

      (7)  总结经验,整体来说这个项目非常简单,但是感觉又很复杂,各种情况都有,比如简单的库存管理,光栅卷帘门的控制,按钮的呼叫,自动搬运调度,机械受PLC的对接,Web技术和CS程序的融合,多种通讯协议,难者不会会者不难,所以积累的经验很重要。

 


作者:情缘
出处:http://www.cnblogs.com/qingyuan/
关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
联系方式: 个人QQ  821865130 ; 仓储技术QQ群 88718955,142050808 ;
吉特仓储管理系统 开源地址: https://github.com/hechenqingyuan/gitwms