研华智能设备控制器 MAS控制器

MAS控制器

MAS控制器

简单高效

20分钟使用框架开发 XYZ锁螺丝机

272


20分钟使用框架开发 XYZ锁螺丝机





    



   


说明

这个教程可以学习到如何使用框架开发设备.   原本需要一天时间来开发, 使用框架可以缩短到30分钟或更短的时间. 根据我们的经验还能大幅减少误动作的发生. 當您掌握此單工位專案開發技巧後, 您會發現開發雙工位程序也是如此的簡單!

請您花20分鐘耐心的學習此教程!


注意!  

1. 此例程HMI(U/I) 界面使用框架内建的OneTable HMI 调适应用程序.

2.   此例程使用内建4轴虚拟控制器

3.   文章最后有完整代码


框架

使用框架开发程序首先要清楚1)框架已具备那些功能?   2)如何扩展功能?   因此如果您还不了解, 请先参考模版框架快速入門‍說明.

 

简单的理解:

1. 框架就是毛坯房, 主结构已经好了, 但要成精装修房, 使用者需要依照自己的需求对毛坯房进行施工

2. 框架是積木(模塊)架構, 可以彈性組合.   每個模塊是獨立任務, 獨立運行, 透過信號交互!

3.   主模块负责: 1)系統按钮处理 2)状态切换 3)错误处理 4)参数存档, 主模块不参与轴控制,而是透过内部讯号发命令给子模块(Table), 让子模块处理。

4.   子模块负责:   1)btn_RUN运行按钮与用户自定义按钮处理 2)接收到主模块发出的讯号后,对轴与IO动作控制


Snipaste_2020-04-28_20-00-43.png


框架檔案內部結構如下圖, 黃色是我們要添加的部分(btn_XXX手動測試動作可以暫不處理)

注意! 其他顏色部分, 框架已有預設處理流程與動作, 我們沿用框架, 如果不符合需求您可再自行修改.

訊號與檔案關係.png

需求规划

配置
说明
轴数
3轴,   X1(0), Y1(1), Z1(2)
使用框架预设值
DO
DO 0: 取螺丝汽缸


DO 1: 螺丝批头开/关

DI (以VR模拟)
回原点按钮: VR(10)
btn_home, 使用框架预设值

进入自动模式: VR(11)
btn_Auto, 使用框架预设值

启动按钮: VR(12)
btn_RunSL, 使用框架预设值

清除错误按钮: VR(13)
btn_ClearErr, 使用框架预设值

存档按钮: VR(14)
btn_SaveFile, 使用框架预设值

暂停按钮: VR(15)
btn_Pause, 使用框架预设值

回复按钮: VR(16)
btn_Resume, 使用框架预设值

停止按钮: VR(17)
btn_Stop, 使用框架预设值



鎖螺絲機动作流程规划

Table機頭一開始先到等待位置, 等到啟動按鈕按下後, 依序取螺絲並鎖付到工件上. 左圖為主流程, 並會調用右圖2個子流程.







螺絲動作示意.png


   

工具/原料

  1. Motion Studio v1.9.6.0

  2. Motion Runtime v1.9.6.0


開發步驟

从最后结果来看,使用框架开发鎖螺絲機我们总共做了2件事:

1. 第一件事:删除框架的范例代码  (可参考:如何删除模板框架内的范例动作代码

2.第二件事:在Table子模块增加4个函式 

    a. actAutoRun_TB(): 自动运行锁螺丝的函式  

    b. actWaitPos_TB():   机头到等待位置的子函式 , 被a调用

    c. actGetScrew_TB():   机头到取螺丝位置, 并取螺丝的函式 , 被a调用

    d. actDoScrew_TB():   机头将取得的螺丝锁付到工件上的函式 , 被a调用


如果您想要快速驗證結果, 可以刪除框架中的範例代碼後, 將文中的4個函式貼到模版中(別忘了ProjectDefine.bi), 就可以驗證.

接下來透過下面4個步驟來完成這個練習:

步骤一    選擇OneTable框架

步骤二    修改鎖螺絲機 Table子模块

步骤三  将步骤二增加的函式与VR在bi宣告

步骤四  运行调试

注意!     開發基本技巧請參考: 框架3大規則與2大技巧


步骤一 Table框架

选择 OneTable框架

    


擴展方法

選擇OneTable後, 會看到左下的專案樹, 依目前XYZ鎖螺絲機需求, 我们只需在1個模塊的2个档案增加鎖螺絲機的動作

Note: 开始前请先删除框架内示范动作 (可参考:如何删除模板框架内的范例动作代码


Snipaste_2020-05-23_18-24-18.png

   


步骤二 修改鎖螺絲機 Table子模块


注意!   

1. 面有提到,主模塊不負責處理機台動作,只有子模塊(Table)負責處理機台動作。因為我們不增加按鈕,也不改變狀態機處理方式,因此只需對子模塊(Table)進行編程。

2. 开始前请先删除框架内示范动作 (可参考:如何删除模板框架内的范例动作代码

下面我們就開始對子模塊(Table)進行程。

  1. 编写鎖螺絲機Table模塊自动运行流程

       


請先删除actAutoRun_TB( ) 的范例动作内容, 留下CASE, 其他内容删除

        


参照规划的动作流程, 编写actAutoRun_TB( ) 如下

用到的变量 ( 提示: 未说明的变量都是框架预设的变量)

     1. btn_Run 量, 等待启动按钮 (请在 ProjectDefine.bi 宣告)

     2. ScrewNum 变量, 锁付的螺丝数量 (请在 ProjectDefine.bi 宣告)

另外,   為了讓代碼更加結構化, 我們將3個細部動作封裝程子函式, 放到下一個步驟處理

1. actWaitPos_TB():   负责实现机头到等待位置

2. actGetScrew_TB():   负责实现机头到取螺丝位置, 并取螺丝

3. actDoScrew_TB():   负责实现机头将取得的螺丝锁付到工件上


Function actAutoRun_TB() AS I16

Select Case Cint(AutoStep_TB)

    

   CASE 0   滑台到等待位置                      

    IF actWaitPos_TB()=1 THEN AutoStep_TB=10

   CASE 10   锁付螺丝数量ScrewNum归0

    ScrewNum=0   

    AUTOSTEP_TB=20

   CASE 20   机头到取螺丝位置并取螺丝

    IF actGetScrew_TB()=1 THEN AutoStep_TB=30

   CASE 30 机头到工件的螺丝孔位置锁螺丝

    IF actDoScrew_TB()=1 THEN AutoStep_TB=40

   ‘将锁付螺丝数量加1, 如4颗螺丝没锁完将步骤切到CASE 20 继续锁下一颗,   

如锁完切换到 CASE StepDone 完成流程动作.

   CASE 40                              

    ScrewNum=ScrewNum+1                 

    IF ScrewNum<4 THEN AutoStep_TB=20         

    IF ScrewNum=4 THEN AutoStep_TB=50

   CASE 50   滑台到等待位置                      

    IF actWaitPos_TB()=1 THEN AutoStep_TB=StepDone

   CASE StepDone   完成, 将AutoStep_TB置0, 并回传1

    AutoStep_TB= 0                      

    Return 1                                   

    End Select

return 0

End Function




2. 编写3个运行子函式

    


上个步骤的Table_AutoRun.bas中, 有3个子函式未完成, 下面我们在Table_Sub.bas 中实现.


1). 实现actWaitPos_TB(): 机头到等待位置   

负责实现机头到等待位置.   为了动作不会撞机, 我们先让Z轴往上移动, 再移动XY轴.

使用的变量如下(未说明的变量都是框架预设的变量)

  • WaitPosZ变量来当作 Z1轴等待位置 (请在 ProjectDefine.bi 宣告)

  • WaitPosX, WaitPosY变量来当作 X1, Y1轴等待位置 (请在 ProjectDefine.bi 宣告)

改好后actWaitPos_TB()如下


Function actWaitPos_TB()AS I16

    Select Case Cint(TBStep)

    case 0

        IF AXISREADY(Z1) THEN MOVEABS AX(Z1),WaitPosZ   

        IF AXISREADY(Z1) THEN TBStep= 10

    case 10

        BASE X1, Y1

        IF AXISREADY(X1,Y1) THEN MOVEABS WaitPosX, WaitPosY   

        IF AXISREADY(X1,Y1) THEN TBStep= StepDone

    case StepDone

        TBStep = 0

        Return 1

    End Select

    return 0

End Function

    



2). 实现actGetScrew_TB():机头到取螺丝位置取螺丝   

负责实现机头到取螺丝位置, 并取螺丝.

使用的变量如下, 请在ProjectDefine.bi 宣告 (未说明的变量都是框架预设的变量)

  • GetScrewPosX, GetScrewPosY : VR变量, X1, Y1轴取螺丝位置

  • GetScrewPosZ : VR变量, Z1轴取螺丝位置

  • T1: TMR对象变量, 延迟计数器

  • WaitPosZ : VR变量, Z1轴等待位置


改好后actGetScrew_TB()如下


Function actGetScrew_TB() AS I16

    Select Case Cint(TBStep)

    

    case 0    X1, Y1轴移动到取螺丝位置

        BASE X1, Y1

        IF AXISREADY(X1,Y1) THEN MOVEABS GetScrewPosX, GetScrewPosY

        IF AXISREADY(X1,Y1) THEN TBStep = 10

    case 10 Z1下降到取螺丝位置

        IF AXISREADY(Z1) THEN MOVEABS AX(Z1),GetScrewPosZ

        IF AXISREADY(Z1) THEN TBStep = 20

    case 20   机头取螺丝, 用DOUT0控制汽缸, 使用T1延时, 并先重置T1

        DOUT(0)=1

        T1.Reset()

        TBStep = 30

    case 30   延迟0.5秒

        IF T1.On(500) THEN TBStep = 40

    case 40 机头Z1上升

        IF AXISREADY(Z1) THEN MOVEABS AX(Z1),WaitPosZ   

        IF AXISREADY(Z1) THEN TBStep = StepDone

    case StepDone 完成, 将 TBStep 重置0, 并回传1

        TBStep = 0

        Return 1

    End Select

    return 0

End Function




3). 实现actDoScrew_TB(): 机头将螺丝锁付到工件

负责实现机头将取得的螺丝锁付到工件上. 这个动作可分为5个小动作,

  1. 机头X1,Y1移动到工件锁螺丝位置上方

  2. 机头Z1下降到启动位置

  3. 机头Z1锁螺丝(DO1)动作, 并下降锁付长度

  4. 关闭DO1

  5. 机头Z1上升到等待位置


使用的变量如下, 请在 ProjectDefine.bi 宣告(未说明的变量都是框架预设的变量)
  • StartScrewPosZ: VR变量, Z1轴准备开始锁螺丝位置

  • ScrewLen: VR变量, Z1轴锁螺丝的深度

  • WaitPosZ : VR变量, Z1轴等待位置

  • P_Array(4): PT变量, 锁付螺丝4个点的位置

    


我们在这个函式使用了P_Array(4) 来存放要锁付螺丝4个点的位置

P_Array(0)=Pt(30,200)        '位置点 P0

P_Array(1)=Pt(130,200)       '位置点 P1

P_Array(2)=Pt(130,150)       '位置点 P2

P_Array(3)=Pt(30,150)        '位置点 P3


改好后actDoScrew_TB()如下


Function actDoScrew_TB() AS I16

   Select Case Cint(TBStep)

    

   case 0   X1,Y1直线差补移动到P1点上方

    BASE X1,Y1

    IF AXISREADY(X1,Y1) THEN LINEABS P_Array(ScrewNum)

    IF AXISREADY(X1,Y1) THEN TBStep= 10

   case 10 Z1下降到启动位置

    IF AXISREADY(Z1) THEN MOVEABS AX(Z1), StartScrewPosZ   

    IF AXISREADY(Z1) THEN TBStep= 20

   case 20   锁螺丝(DO1)动作, 并机头Z1下降锁付长度

    DOUT(1)=1

    IF AXISREADY(Z1) THEN MOVEABS AX(Z1), StartScrewPosZ+ScrewLen

    IF AXISREADY(Z1) THEN TBStep= 30

   case 30   关闭DO1(停止螺丝披头), 并切换到下一步骤

    DOUT(1)=0

    TBStep=40

   case 40 机头Z1上升到等待位置

    IF AXISREADY(Z1) THEN MOVEABS AX(Z1),WaitPosZ   

    IF AXISREADY(Z1) THEN TBStep= StepDone

   case StepDone 完成, 将 TBStep重置0, 并回传1代表结束!

    TBStep= 0

    Return 1

   End Select

   return 0

End Function





步骤三 開發收尾

在原有的ProjectDefine.bi檔案最下面, 增加在步骤二編寫的函式与VR定義

' ---------------------------------------------------------------------

' ----------------------锁螺丝新增的定义--------------------------------

' ---------------------------------------------------------------------

DIM SHARED as TMR T1                              'TMR对象变量, 延迟计数器

DIM SHARED as PT P_Array(4)                       'PT变量, 锁付螺丝4个点的位置


Declare Function actWaitPos_TB()    AS I16       '机头到待机位

Declare Function actGetScrew_TB()    AS I16       '机头取螺丝

Declare Function actDoScrew_TB()    AS I16       '机头锁螺丝


#DEFINE WaitPosX          VR(1000)   'Table模塊X等待位置

#DEFINE WaitPosY          VR(1001)   'Table模塊Y等待位置

#DEFINE WaitPosZ          VR(1002      'Table模塊Z等待位置

#DEFINE GetScrewPosX      VR(1003)    'Table模塊X取螺丝位置

#DEFINE GetScrewPosY      VR(1004)    'Table模塊Y取螺丝位置

#DEFINE GetScrewPosZ      VR(1005)    'Table模塊Z取螺丝位置

#DEFINE ScrewNum          VR(1006)   'Table模塊 锁付的螺丝数量

#DEFINE StartScrewPosZ    VR(1007)   'Table模塊 Z1轴准备开始锁螺丝位

#DEFINE ScrewLen          VR(1008)   'Table模塊 Z1轴锁螺丝的深度




在bi檔添加完後,

1. 再將定義也填入VR表, 這樣才能方便調適, 並能與HMI對接(透過Modbus位址)

2 並將初始值填入 VR表 初始值欄位 (配合下一步)

    


最後在 Table_Sub.bas 裡面的 actInit_TB( ), 添加 VRRESET(1000, 10). 這樣上一步驟在VR工具填入的初始值, 在VRRESET指令執行後, 就會載入到 VR(1000)-VR(1010)

提示1 框架在開始執行時會調用 actInit_TB()

提示2 VRRESET(起始VR編號, VR長度)   

        




步骤四 运行调试

编译运行后, 可以开启Motion Studio框架内建的对应OneTable HMI 调适应用程序.

  • 其中右边的7个按钮是框架的基本按钮, 可以直接点击来测试.

  • 如果有添加手动动作, 可以开启Visual Studio源代码自行修改添加手动按钮.

    


提示

運行OneTable HMI调适应用程序時, 會出現下面錯誤, 這是正常現象!

原因是因為我們將框架內建的手動動作參數相關的VR刪除了. 如您希望HMI能具備參數管理功能, 請用Visual Studio開啟OneTable HMI專案並修改.