Rock18框架之整體框架介紹

1. 總體框架圖

Rock18框架之整體框架介紹

文章插圖
2.框架能解決哪些問題?
  • 問題1:
【Rock18框架之整體框架介紹】自動化設備包含龍門架、機械手、伺服、步進等電機、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(){//光板cpkthis.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();}}}

推薦閱讀