1. 总体框架图

2.框架能解决哪些问题?

  • 问题1:

自动化设备包含龙门架、机械手、伺服、步进等电机、IO控制、定位及纠偏、界面展示等部分。其中硬件(伺服、IO等)是需要更换的,硬件的更换不影响整套系统,不影响指:逻辑无影响、代码无编辑。

  • 解决思路:

1、面向接口编程,所有硬件及算法在业务逻辑层都是接口

2、接口自动依赖注入,所有接口通过manger层反射、注入方式实例化接口

3、变更硬件只新增对应接口实现即可,所有业务代码无需更改

  • 问题2:

一台机器有很多通用的组件,如皮带、升降、翻转等,重复的逻辑太多,怎么减少重复逻辑?

  • 解决办法:

1、组件化设计,把机器的皮带当成一个组件,升降为一个组件,一台机器是有N个独立组件构成,组件之间通过IO来交互(这部分思路参考一条整线有印刷机,贴片机、AOI等组成,机器之间通过IO来交互,机器内部也可以看做一条整线,由各个组件通过IO交互。只是交互是通过虚拟IO)

  • 问题3:

    组件抽象出来后,组件内部的编程模型怎么抽象,才能让编程更为简单方便?

  • 解决办法:

    有限状态机模型,组件内部定义为很多状态,每个状态下做指定的动作,满足条件后跳转到下一个状态。

3.案例

-下面是一个从升降台取载具到轨道上,然后从升降台取pcb放在载具上,最后流出的一个组件,里面包涵了下相机定位,载具定位,cpk扣合检测的组件代码(这是rock17框架下组件实现,rock18已引入状态机,后续博文会介绍基于状态机的组件编写)

    /// <summary>
/// 开线模式,从升降台取夹具,从升降台取pcb,扣合流出
/// </summary>
public class OpenLineModule : BasePlantModule
{
private enum Status
{
UnKnow,
WaitTakeFix,
TakeFix,
WaitPutFix,
PutFix,
WaitTakePcb,
TakePcb,
WaitPutPcb,
PutPcb,
/// <summary>
/// 扣合检测是否开启
/// </summary>
CheckCpk
}
/// <summary>
/// 夹具吸嘴
/// </summary>
public ICylinder FixSuction { get; set; }
/// <summary>
/// 取光板位置
/// </summary>
public Position TakeFixPoi { get; set; }
public Position PutFixPoi { get; set; } /// <summary>
/// 允许取夹具
/// </summary>
public IInputIoDevice AllowTakeFix { set; get; }
/// <summary>
/// 取夹具完成
/// </summary>
public IOutputIoDevice TakeFixCompelte { set; get; }
/// <summary>
/// 下位机要夹具
/// </summary>
public IInputIoDevice AllowPutFix { set; get; }
public IOutputIoDevice PutEmptyPcbCompelte { set; get; }
/// <summary>
/// 扩展轨道
/// </summary>
public ExtendTrackBaffleModule ExtendTrackBaffleModule { get; set; }
private Status RobotStatus = Status.UnKnow; protected override void argsInit()
{
if (this.FixSuction.IsOpen())
{
throw new Exception(String.Format("{0} have object", this.FixSuction.GetName()));
}
this.RobotStatus = Status.UnKnow;
this.TakeFixCompelte.Close();
this.PutEmptyPcbCompelte.Close();
this.FixSuction.Close();
base.argsInit();
}
protected override void handler()
{
switch (this.RobotStatus)
{
case Status.UnKnow: this.unKnow(); break;
case Status.WaitTakeFix: this.waitTakeFix(); break;
case Status.TakeFix: this.takeFix(); break;
case Status.WaitPutFix: this.waitPutFix(); break;
case Status.PutFix: this.putFix(); break;
case Status.WaitTakePcb: this.waitTakePcb(); break;
case Status.TakePcb:
this.takePcb();
this.RobotStatus = Status.WaitPutPcb; break;
case Status.WaitPutPcb: this.waitPutPcb(); break;
case Status.PutPcb: this.putPcb(); break;
case Status.CheckCpk: this.checkCpk(); break;
default: break;
}
base.handler();
}
private void unKnow()
{
this.RobotStatus = Status.WaitTakeFix;
}
private void waitTakeFix()
{
if (this.AllowTakeFix.IsOpen())
{
this.RobotStatus = Status.TakeFix;
}
}
private void takeFix()
{
this.FixSuction.Open();
this.Robot.GoToPosition(this.TakeFixPoi);
this.Sleep(100);
//到达上方一点
Position tempFixPoi= this.TakeFixPoi.Copy();
tempFixPoi.Z += 10;
this.Robot.GoToPosition(tempFixPoi);
this.GotoPoiUp(this.Robot, this.TakeFixPoi);
this.checkSuctionNozzle(this.FixSuction);
this.TakeFixCompelte.Open();
this.Robot.GoToPosition(this.SafePoi);
this.RobotStatus = Status.WaitPutFix;
}
private void waitPutFix()
{
if (this.AllowPutFix.IsOpen())
{
this.RobotStatus = Status.PutFix;
}
}
private void putFix()
{
this.Robot.GoToPosition(this.PutFixPoi);
this.FixSuction.Close();
this.Sleep(200);
this.GotoPoiUp(this.Robot, this.PutFixPoi);
this.ExtendTrackBaffleModule.SetStatusA();
this.Robot.GoToPosition(this.SafePoi);
this.RobotStatus = Status.WaitTakePcb;
}
private void waitTakePcb()
{
if (this.AllowTakeEmptyPcb.IsOpen())
{
this.RobotStatus = Status.TakePcb;
}
}
private void waitPutPcb()
{
this.RobotStatus = Status.PutPcb;
}
private void putPcb()
{
if (this.AllowPutEmptyPcb.IsOpen())
{
this.fixEmptyPcb();
this.RobotStatus = Status.CheckCpk;
}
}
private void checkCpk()
{
//光板cpk
this.emptyPcbCpk();
//放板完成
this.PutEmptyPcbCompelte.Open();
this.Robot.GoToPosition(this.SafePoi);
//到安全点为了给翻转组件留时间
this.PutEmptyPcbCompelte.Close();
this.RobotStatus = Status.WaitTakeFix;
}
public override bool Dispose()
{
this.TakeFixCompelte.Close();
this.PutEmptyPcbCompelte.Close();
return base.Dispose();
}
}
}

4.界面部分效果

主界面



点位调试,算法,轴,io与点位联动



io助手



算法调试

5.后续计划

  1. 组件配置的编写逻辑与注入实现
  2. 基于状态机的组件编写
  3. 系统暂停继续实现逻辑
  4. 异常报警继续实现逻辑
  5. 算法交互部分实现(矩形框的拖拽,缩放,等比例获取区域等)
  6. 配置热更新实现
  7. 。。。

Rock18框架之整体框架介绍的更多相关文章

  1. go微服务框架go-micro深度学习(一) 整体架构介绍

    产品嘴里的一个小项目,从立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以维护,后期的每次产品迭代上线都会牵一发而动全身.项目 ...

  2. Java 线程池(一):开篇及Executor整体框架介绍

    一.开篇 线程池.数据库连接池,在平时的学习中总能接触到这两个词,但它们到底是什么?和线程,数据库连接有什么关系?为什么需要“池”?“池”的概念及作用是什么?要弄清楚这些问题,就要深入到“池”的实现中 ...

  3. Duilib源码分析(一)整体框架

    Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...

  4. 基于Metronic的Bootstrap开发框架经验总结(8)--框架功能总体界面介绍

    在前面介绍了一系列的<基于Metronic的Bootstrap开发框架经验总结>的随笔文章,随笔主要是介绍各个知识点的内容,对框架的总体性界面没有很好的阐述,本篇随笔主要介绍这个Boots ...

  5. iOS学习——iOS 整体框架及类继承框架图

    整理自:IOS 整体框架类图值得收藏 一 整体框架 在iOS开发过程中,对iOS的整理框架的了解和学习是必不可少的一个环节,今天我们就好好来了解一下iOS的整体框架.首先贴一个关于iOS的框架介绍:i ...

  6. 关系型数据库工作原理-数据库整体框架(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

  7. Net分布式系统整体框架

    Net分布式系统之一:系统整体框架介绍 一.设计目的 从事.Net平台开发系统已有8年多了,一直思考搭建.Net分布式系统架构.基于window平台搭建的大型分布式系统不多,之前了解过myspace. ...

  8. Spring Framework(框架)整体架构 变迁

    Spring Framework(框架)整体架构 2018年04月24日 11:16:41 阅读数:1444 标签: Spring框架架构 更多 个人分类: Spring框架   版权声明:本文为博主 ...

  9. xmpp整理笔记:xmppFramework框架的导入和介绍

    一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...

随机推荐

  1. kubernetes网络排错思想

    Overview 本文将引入一个思路:"在Kubernetes集群发生网络异常时如何排查".文章将引入Kubernetes 集群中网络排查的思路,包含网络异常模型,常用工具,并且提 ...

  2. 彻底搞懂C#异步编程 async和await的原理

    1.前提 熟练掌握Task并行编程. 2.用Task并行解释async和await异步 因为控制台有多线程操作的优化,因此这里选择winform来做示例. 测试代码如下所示: 有三个textbox,一 ...

  3. VS2017Enterprise版本安装ImageWatch 2017问题解决

    按照Andrei给的方法并不一定能成功. 方法如下: 1. Download the extension (ImageWatch.vsix) and open it using WinRAR 2. F ...

  4. Linux配置bond模式 双网卡绑定步骤

    什么是bond 网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术.Kernels 2.4.12及以后的版本均供bonding模块,以前 ...

  5. 集成 Redis & 异步任务 - SpringBoot 2.7 .2实战基础

    SpringBoot 2.7 .2实战基础 - 09 - 集成 Redis & 异步任务 1 集成Redis <docker 安装 MySQL 和 Redis>一文已介绍如何在 D ...

  6. 践行初心|方正璞华爱心捐赠人脸识别测温系统WelComID

    近日,方正璞华向金鸡湖社区卫生服务中心捐赠了人脸识别测温系统.该设备集人员识别.体温检测等功能于一体,在人员进出的时候完成体温的检测,从而判断是否有异常人员等问题,有效节省人力成本.减少人员接触风险, ...

  7. Windows Server体验之升级安装

    由于Windows Server的版本是每半年更新的,而微软对于产品的支持周期又是有限的.比如Windows Server 1803的主流支持只到2019年11月12日.也就是说,最多1年半,就需要更 ...

  8. Kubernetes(K8S)是什么?

    概述 Kubernetes,又称为 k8s(首字母为 k.首字母与尾字母之间有 8 个字符.尾字母为 s,所以简称 k8s)或者简称为 "kube" ,是一种可自动实施 Linux ...

  9. docker的cmd命令详解-前后台理解

    CMD 指令的格式和 RUN 相似,也是两种格式: shell 格式:CMD <命令> exec 格式:CMD ["可执行文件", "参数1", & ...

  10. Beats processors

    文章转载自:https://elasticstack.blog.csdn.net/article/details/111321105 我们通常的做法是使用 Elasticsearch 的 ingest ...