最近上海疫情严重,闲赋在家无事可做,手机里不断的推送一些无脑的谩骂声音,索性找点事情做,将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 自动搬运小项目总结的更多相关文章

  1. 一个老菜鸟所理解的UX及产品流

    从事前端开发到目前为止已经有4年多的时间了,从一个小菜鸟一路依靠自学,到目前总算一个老菜鸟了.当然了,从事前端的工作,是免不了要对产品以及用户体验有些许了解的.最近谈论起这方面的内容,就按照自己的想法 ...

  2. 一个老菜鸟的年度回忆 & 智能工厂奋斗的第三年,可能有你值得借鉴的

    岁月蹉跎,寒冬的夜晚仍伏案疾书,见论坛中有诸多大神已经开始了一年的总结,突然安奈不住心中的躁动,也想为这今年的奋斗留下只言片语,没有年初的目标总结,没有未来的展望,就想作为一篇日记记录今年项目精力,为 ...

  3. 经过一个多月的等待我有幸成为Spring相关项目的Contributor

    给开源项目尤其是Spring这种知名度高的项目贡献代码是比较难的,起码胖哥是这么认为的.有些时候我们的灵感未必契合作者的设计意图,即使你的代码十分优雅. 我曾经给Spring Security提交了一 ...

  4. (译)Windows Azure的7月更新:SQL数据库,流量管理,自动缩放,虚拟机

    Windows Azure的7月更新:SQL数据库,流量管理,自动缩放,虚拟机 今早我们释出一些很棒的Windows Azure更新.这些新的提升包括:SQL数据库:支持SQL自动导出和一个新的高级层 ...

  5. 一个asp.net小项目总结

    写这篇文章之前先吐槽一下,最近换了一个公司,是给一个国企做外包,有两个月了,感觉这里的气氛有点不爽,还有点怀念以前的公司.具体听我说来,这里有几个团队,.net,java,手机开发,.net只有6个人 ...

  6. 一个vue练手的小项目

    编程路上的菜鸟一枚 : 最近接触了vue 然后写了一个练手的项目 使用vue-cli脚手架来搭建了的项目 技术: vue2  + vue-router  + ES6 + axios 框架有 mint- ...

  7. 最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/

    最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/,帮忙找找bug,网站里有源码地址 网站说明 甲壳虫社区(Beetle Community) 一个开源 ...

  8. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  9. Extjs6(一)——用sencha cmd建立一个ExtJs小项目

    本文基于ext-6.0.0 一.用sencha cmd建立一个ExtJs小项目 首先,需要一个命令行工具.进入extjs所在目录. 然后,输入:sencha -sdk [ExtJs6.0文件夹地址] ...

随机推荐

  1. 12.8 typora快捷键

    Markdown学习 标题: n个#号 字体 粗体:要加粗的字两边加两个** 如 ** 粗体** 斜体:两边一个*号 斜体加粗: 两边三个*号 删除线:两边两个波浪号 引用 github 左边一个大于 ...

  2. Java基础 (下)

    泛型 Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符? Java 泛型(generics) 是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时 ...

  3. ::before和:after中的的双冒号和单冒号有什么区别及这两个伪元素的作用

    ::before和:after中的的双冒号和单冒号有什么区别及这两个伪元素的作用 单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素(伪元素由双冒号和伪元素名称组成),为了兼容已有的伪元素 ...

  4. Chrome的安装卸载 以及 chromedriver配置

    1终端 将下载源加入到列表 sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ ...

  5. Java中的引用类型

    强引用(Strong) 就是我们平时使用的方式 A a = new A();强引用的对象是不会被回收的 软引用(Soft) 在jvm要内存溢出(OOM)时,会回收软引用的对象,释放更多内存 弱引用(W ...

  6. js技术之拖动table标签

    一.js技术之拖动table标签 起因:前几天公司,突然安排一个任务 任务描述:要求尺码table列表要像Excel表中一样可以直接移动整行尺码到任意行位置 技术点:采用ui的sortable技术来h ...

  7. c、c++中-int型以float或者float型以int输出问题

    1.将浮点型以整形的类型输出问题 用VC6.0,会把以整形输出形式的浮点数输出为0: 1 #include"stdio.h" 2 int main() 3 { 4 float x= ...

  8. 纯CSS实现柱形图

    CSS在处理排版之强大,没有做不到,只有想不到.下面我们将一同实现一个柱状图. 先打好一个具体的框架.我们利用无序列表做整体,里面的东西我们根本选择内联无素span,strong,em来填充. < ...

  9. 学习HTML5 history API

    html5 在 history 对象上添加几个新的方法.事件.属性,用以增强开发者对于浏览器历史记录的控制.大体上说,新的API可以帮助我们在无刷新的情况下改变浏览器的url,新增或者替换之前的历史记 ...

  10. ES6-11学习笔记--Iterator

    迭代器 Iterator 是一种接口机制,为各种不同的数据结构提供统一访问的机制 主要供for...of消费 一句话:不支持遍历的数据结构"可遍历"   具备Symbol.iter ...