封闭的一个多月,老菜鸟的 机械手和AGV 自动搬运小项目总结
最近上海疫情严重,闲赋在家无事可做,手机里不断的推送一些无脑的谩骂声音,索性找点事情做,将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服务
(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程序的融合,多种通讯协议,难者不会会者不难,所以积累的经验很重要。
封闭的一个多月,老菜鸟的 机械手和AGV 自动搬运小项目总结的更多相关文章
- 一个老菜鸟所理解的UX及产品流
从事前端开发到目前为止已经有4年多的时间了,从一个小菜鸟一路依靠自学,到目前总算一个老菜鸟了.当然了,从事前端的工作,是免不了要对产品以及用户体验有些许了解的.最近谈论起这方面的内容,就按照自己的想法 ...
- 一个老菜鸟的年度回忆 & 智能工厂奋斗的第三年,可能有你值得借鉴的
岁月蹉跎,寒冬的夜晚仍伏案疾书,见论坛中有诸多大神已经开始了一年的总结,突然安奈不住心中的躁动,也想为这今年的奋斗留下只言片语,没有年初的目标总结,没有未来的展望,就想作为一篇日记记录今年项目精力,为 ...
- 经过一个多月的等待我有幸成为Spring相关项目的Contributor
给开源项目尤其是Spring这种知名度高的项目贡献代码是比较难的,起码胖哥是这么认为的.有些时候我们的灵感未必契合作者的设计意图,即使你的代码十分优雅. 我曾经给Spring Security提交了一 ...
- (译)Windows Azure的7月更新:SQL数据库,流量管理,自动缩放,虚拟机
Windows Azure的7月更新:SQL数据库,流量管理,自动缩放,虚拟机 今早我们释出一些很棒的Windows Azure更新.这些新的提升包括:SQL数据库:支持SQL自动导出和一个新的高级层 ...
- 一个asp.net小项目总结
写这篇文章之前先吐槽一下,最近换了一个公司,是给一个国企做外包,有两个月了,感觉这里的气氛有点不爽,还有点怀念以前的公司.具体听我说来,这里有几个团队,.net,java,手机开发,.net只有6个人 ...
- 一个vue练手的小项目
编程路上的菜鸟一枚 : 最近接触了vue 然后写了一个练手的项目 使用vue-cli脚手架来搭建了的项目 技术: vue2 + vue-router + ES6 + axios 框架有 mint- ...
- 最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/
最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/,帮忙找找bug,网站里有源码地址 网站说明 甲壳虫社区(Beetle Community) 一个开源 ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- Extjs6(一)——用sencha cmd建立一个ExtJs小项目
本文基于ext-6.0.0 一.用sencha cmd建立一个ExtJs小项目 首先,需要一个命令行工具.进入extjs所在目录. 然后,输入:sencha -sdk [ExtJs6.0文件夹地址] ...
随机推荐
- linux的一些sao东西
1.sys命令的目录 /usr/include/asm-generic
- lombok的使用。
今天学习spring event,无意中看到lombok插件,以前也见同事用过,特此看了下用法.觉得还挺好用,记录下. 网上找到的一个比较术语化的解释:lombok是一个基于LGPL的开源J2EE综合 ...
- github 编写README时常用的写法
参考:https://github.com/HeTingwei/ReadmeLearn#%E7%BC%96%E5%86%99readme%E6%97%B6%E5%B8%B8%E7%94%A8%E7%9 ...
- 一个注解@Recover搞定丑陋的循环重试代码
使用背景 在实际项目中其中一部分逻辑可能会因为调用了外部服务或者等待锁等情况下出现不可预料的异常,在这个时候我们可能需要对调用这部分逻辑进行重试,代码里面主要就是使用for循环写一大坨重试的逻辑,各种 ...
- ACM - 最短路 - AcWing 849 Dijkstra求最短路 I
AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...
- Robinhood基于Apache Hudi的下一代数据湖实践
1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...
- java模板设计
- 《基于.NET Core构建微服务》系列文章(更新至第6篇,最新第7篇,已发布主页候选区)
原文:Building Microservices On .NET Core – Part 1 The Plan 时间:2019年1月14日 作者:Wojciech Suwała, Head Arch ...
- 一套Vue的单页模板:N3-admin
趁着周末偷来一点闲,总结近期的工作和学习,想着该花点心思把N3-admin这套基于N3-components的单页应用模板简单的给介绍一下. 首发于个人博客:blog.lxstart.net项目路径: ...
- Jquery中each的3种遍历方式
学习目标: 参考博文: https://blog.csdn.net/honey_th/article/details/7404273 一.Jquery中each的几种遍历方法 1. 选择器+遍历 &l ...