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. CF662C Binary Table (快速沃尔什变换FWT)

    题面 题解 我们会发现,如果单独的一列或一行,它的答案是O1确定的,如果确定了每一行是否变换,那么最后的答案也就简单了许多, 如果确定了行的变换状压下来是x(即x的i位表示第i行是否变换,理解就行), ...

  2. IDEA整合Docker

    创建项目 1.使用 IDEA 构建一个 SpringBoot 项目 2.编写一个helloController @RestController public class HelloController ...

  3. 再谈NULL和nullptr(C++11)区别

    在谈NULL和nullptr区别之前,我们先看段代码: #include "stdafx.h" #include <iostream> using namespace ...

  4. Javascript实现base64的加密解密方法

    1 function Base64() { 2 // private property 3 _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl ...

  5. FreeSql 导入数据的各种场景总结 [C#.NET ORM]

    前言 导入数据这种脏活.累活,相信大家多多少少都有经历,常见的场景有: 同服务器从A表导数据到B表 批量导入新数据 批量新增或更新数据 跨服务器从A表导数据到B表 每种场景有自己的特点,我们一般会根据 ...

  6. ESX添加过时的硬件

    昨天遇到了个ESX上有旧的qlogic的FC卡无法识别的问题.无法识别也就无法连接存储,整个ESX就基本无法使用了.所以,需要检查硬件.一开始,在查了很多资料各种命令检查,走了很多弯路.这里我总结一下 ...

  7. Traefik开启监控,日志,追踪需要的参数

    监控 官方文档地址:https://doc.traefik.io/traefik/observability/metrics/overview/ 可以使用多种监控软件,比如Datadog,Influx ...

  8. 使用mysql5.7版本的mysqldump备份mysql8.0版本的数据库报错解决办法

    使用mysql5.7版本的mysqldump命令执行备份mysql8.0版本的数据库时会报错: mysqldump: Couldn't execute 'SET SQL_QUOTE_SHOW_CREA ...

  9. kvm使用桥接的方法

    什么是桥接 桥接就是把物理机的网卡模拟成交换机,虚拟机的网卡直接连在虚拟的网桥即交换机上.这样kvm虚拟机分配的IP地址,就应该和物理机在同一网段,可以对外进行服务. 在KVM下运行的VM默认的网卡采 ...

  10. 第三章:模版层 - 2:Django内置模板标签

    Django内置标签总览 可以查询下表来总览Django的内置标签: 标签 说明 autoescape 自动转义开关 block 块引用 comment 注释 csrf_token CSRF令牌 cy ...