Rock18框架之整体框架介绍
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.后续计划
- 组件配置的编写逻辑与注入实现
- 基于状态机的组件编写
- 系统暂停继续实现逻辑
- 异常报警继续实现逻辑
- 算法交互部分实现(矩形框的拖拽,缩放,等比例获取区域等)
- 配置热更新实现
- 。。。
Rock18框架之整体框架介绍的更多相关文章
- go微服务框架go-micro深度学习(一) 整体架构介绍
产品嘴里的一个小项目,从立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以维护,后期的每次产品迭代上线都会牵一发而动全身.项目 ...
- Java 线程池(一):开篇及Executor整体框架介绍
一.开篇 线程池.数据库连接池,在平时的学习中总能接触到这两个词,但它们到底是什么?和线程,数据库连接有什么关系?为什么需要“池”?“池”的概念及作用是什么?要弄清楚这些问题,就要深入到“池”的实现中 ...
- Duilib源码分析(一)整体框架
Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...
- 基于Metronic的Bootstrap开发框架经验总结(8)--框架功能总体界面介绍
在前面介绍了一系列的<基于Metronic的Bootstrap开发框架经验总结>的随笔文章,随笔主要是介绍各个知识点的内容,对框架的总体性界面没有很好的阐述,本篇随笔主要介绍这个Boots ...
- iOS学习——iOS 整体框架及类继承框架图
整理自:IOS 整体框架类图值得收藏 一 整体框架 在iOS开发过程中,对iOS的整理框架的了解和学习是必不可少的一个环节,今天我们就好好来了解一下iOS的整体框架.首先贴一个关于iOS的框架介绍:i ...
- 关系型数据库工作原理-数据库整体框架(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- Net分布式系统整体框架
Net分布式系统之一:系统整体框架介绍 一.设计目的 从事.Net平台开发系统已有8年多了,一直思考搭建.Net分布式系统架构.基于window平台搭建的大型分布式系统不多,之前了解过myspace. ...
- Spring Framework(框架)整体架构 变迁
Spring Framework(框架)整体架构 2018年04月24日 11:16:41 阅读数:1444 标签: Spring框架架构 更多 个人分类: Spring框架 版权声明:本文为博主 ...
- xmpp整理笔记:xmppFramework框架的导入和介绍
一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...
随机推荐
- 记录第一次给开源项目提 PR
本文是深入浅出 ahooks 源码系列文章的第八篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 本篇文章算是该系列的一个彩蛋篇,记录一下第一次给开源项目提 PR ...
- CF1528C Trees of Tranquillity(图论,数据结构)
题面 有两棵 n n n 个点的有根树 T 1 T_1 T1, T 2 T_2 T2,根是 1 1 1 ,共用编号 1 1 1~ n n n.求最大的点集 S S S 满足每个点在 T 1 T_1 ...
- 【C++】实现D3D9 的 Inline hook
[C++]实现D3D9 的 Inline hook 简单介绍一下HOOK原理: 函数调用的过程大致是 先push 参数 进去,再执行 call 函数地址 ,进入函数.此时将所调用的函数的前五个字节 ...
- 【c#】仅1600行代码 2D魔方游戏源码-纯WinForm
想起以前高三的时候写过一个很无脑的程序,那个时候.net5.0都还没影儿呢,,现在分享一下.一个平面展开的魔方游戏. 这个是1.0版本,有些许bug. 比如左边的格子操作不了. 「2d cube.ex ...
- 第八十篇:Vue购物车(一) 购物车基本框架
好家伙,又是购物车 来吧,这是参照黑马的课程写的一个购物车 目录结构如下: 1.首先组件导入, Counter.vue <template> <div class="num ...
- KingbaseFlySync delete语句WHERE条件缺失的解析出错问题处理思路
KingbaseFlySync delete语句WHERE条件缺失的解析出错问题处理思路 关键字: KingbaseFlySync.Linux.x86_64.mips64el.aarch64.Java ...
- Java开发学习(三十三)----Maven私服(一)私服简介安装与私服分类
一.私服简介 团队开发现状分析 (1)张三负责ssm_crm的开发,自己写了一个ssm_pojo模块,要想使用直接将ssm_pojo安装到本地仓库即可 (2)李四负责ssm_order的开发,需要用到 ...
- 解决swiper组件autoplay报错问题
最近在自定义一个swiper 插件 发现引用之后不定时一直在报错 Uncaught TypeError: Cannot read properties of undefined (reading 'a ...
- vscode-jupyter快捷键
运行本单元 ctrl + enter 运行本单元,新建一个单元 shift + enter 运行本单元,在其下方新建一个单元 alt + enter 在上方插入一个新单元 a 在下方插入新单元 b 复 ...
- Django ORM 实现数据的多表 增删改查
一.创建模型和表 假定下面这些概念.字段与关系: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,手机号,家庭住址信息. 作者详情模型 和 作者模型之间是一对一的关系(one- ...
