マルチロボットコンベヤー

Epson RC+は、複数の論理上のコンベヤーとロボットをサポートしています。1台のコンベヤーに複数のロボット、または複数のコンベヤーに複数のロボットを使用できます。

この章では、1台のコンベヤーに対してロボットを2台以上で使用するマルチロボットコンベヤーについて説明します。

マルチロボットの対応機種については、以下のマニュアルを参照してください。

"ロボットコントローラーマニュアル"

マルチロボットコンベヤーとは

下図のように1台のコンベヤーに2台以上のロボットを使用し、ロボット1 (上流側)が取りこぼしたワークをロボット2 (下流側)がピッキングするシステムです。

マルチロボットコンベヤーは、複数のロボットを使用しますが、カメラ (センサー), エンコーダー, コンベヤーの数は、1台です。

マルチロボットコンベヤーの使用方法

マルチロボットコンベヤーは、上流コンベヤー, 下流コンベヤーを設定します。マルチロボットコンベヤーの使用方法は、以下の通りです。

  1. 以下を参考にし、コンベヤー1とコンベヤー2を作成します。 (コンベヤー1に上流側のロボットを設定します。)

    プロジェクトのコンベヤー作成

  2. [エンコーダー], [ビジョンシーケンス]には、コンベヤー1, コンベヤー2とも同じ番号, シーケンスを設定します。

  3. コンベヤー1のキャリブレーションを行います。

  4. 以下のいずれかを参考にし、動作確認を行います。

  5. [下流コンベヤー]を"2"に設定します。

  6. コンベヤー2のキャリブレーションを行います。

  7. コンベヤー2の動作確認を行います。

    1. コンベヤーに現在登録されているキューデータを全て消去します。

      >Cnv_QueRemove 1,all
      >Cnv_QueRemove 2,all
      
    2. ビジョンサーチ領域にワークを置きます。

    3. プログラム"ScanConveyorStrobed"を実行し、キューを登録します。

    4. プログラム"ScanConveyorStrobed"を一時停止(HALT)し、ワークがコンベヤー1の追従開始領域に移動するまでコンベヤーを動かします。

    5. プログラム"ScanConveyorStrobed"を停止し、ワークがコンベヤー2の追従開始領域に移動するまでコンベヤーを動かします。

    6. 以下のコマンドを実行し、キューをコンベヤー1からコンベヤー2に移動します。

      >Cnv_QueMove 1,0
      
    7. ワークをハンドリングします。

      >Jump Cnv_Queget(2)
      
    8. ロボット2のハンドがワークの中心に移動していることを確認します。ロボット2のハンドがワークの中心に移動しない場合、キャリブレーションを再度行ってください。

    9. コンベヤーを動かしてロボットがワークを追従することを確認します。この時、ハンドがワークの中心からずれることがあります。これは、急なコンベヤーの速度変化に対して精度良く追従しない場合があるためです。しかし、基本的には時間がたてば正しく追従するので問題はありません。

    10. 追従を停止します。

     ```
     >Cnv_AbortTrack
     ```
    
  8. 以下にサンプルプログラムを示します。

Function main
  Xqt ScanConveyorStrobed 'キューを登録するタスク
  Xqt PickParts1 '上流のロボットがワーク (キュー)をトラッキングするタスク
  Xqt PickParts2 '下流のロボットがワーク (キュー)をトラッキングするタスク
Fend

Function ScanConveyorStrobed
  Integer i, numFound, state, trigger
  Real x, y, u
  Boolean found

  trigger = 10 'コントローラーI/Oのpin10を割りあてる
  Off trigger 'カメラのトリガーとエンコーダーラッチのI/Oをオフ
  Do

    'コンベヤー上のワークを撮像
    VRun FindParts
    On trigger ' カメラのトリガーとエンコーダーラッチのI/Oをオン
    Do
      VGet FindParts.AcquireState, state
    Loop Until state = 3
    VGet FindParts.Parts.NumberFound, numFound
    '撮像したワークをコンベヤー1のキューに登録
    For i = 1 To numFound
      VGet FindParts.Parts.CameraXYU(i), found, x, y, u
      Cnv_QueAdd 1, Cnv_Point(1, x, y)
    Next i
    Off trigger 'カメラのトリガーとエンコーダーラッチのI/Oをオフ
    Wait 0.1
  Loop
Fend

Function PickParts1
  OnErr GoTo ErrHandler
  Integer ErrNum

  Robot 1
  Motor On
  Power High
  Speed 30
  Accel 30, 30

  Jump P1

 WaitParts:
  Do
    'ワーク (キュー)が追従開始領域内に入るまで待機
    Wait Cnv_QueLen(1, CNV_QUELEN_PICKUPAREA) > 0

    'トラッキング開始
    '6軸ロボットを使用する場合
     Jump3 Cnv_QueGet(1):Z(0):U(90):V(0):W(180)
    'スカラロボットを使用する場合
    Jump Cnv_QueGet(1)
    Wait .1 'Wait時間だけ、ロボットはコンベヤーと等速度で移動します
    Jump P1 '指定した場所に移動
    'ピッキングしたワーク (キュー)の消去
    Cnv_QueMove 1, 0
  Loop
  ' コンベヤー1の追従開始領域より下流のワーク (キュー)をコンベヤー2に移動
  ErrHandler:
    ErrNum = Err
    If ErrNum = 4406 Then
      Cnv_QueRemove 1, 0
      EResume WaitParts
      'コンベヤートラッキングの動作範囲以外のエラーが発生した場合
      'そのエラーを表示
    Else
      Print "エラー発生!"
      Print "No.", Err, ":", ErrMsg$(Err, 1)
      Print "Line :", Erl(0)
      'ユーザーエラー発生
      Error 8000
    EndIf
Fend

Function PickParts2
  OnErr GoTo ErrHandler
  Integer ErrNum

  Robot 2
  Motor On
  Power High
  LoadPoints "robot2.pts"
  Speed 30
  Accel 30, 30

  Go P1

  WaitParts:
  Do
    'ワーク (キュー)が追従開始領域内に入るまで待機
    Wait Cnv_QueLen(2, CNV_QUELEN_PICKUPAREA) > 0
    'トラッキング開始
    '6軸ロボットを使用する場合
    Jump3 Cnv_QueGet(2):Z(0):U(90):V(0):W(180)
    'スカラロボットを使用する場合
    Jump Cnv_QueGet(2)
    Wait .1 'Wait時間だけ、ロボットはコンベヤーと等速度で移動します
    Jump P2 '指定した場所に移動
    'ピッキングしたワーク (キュー)の消去
    Cnv_QueRemove 2, 0
  Loop

  'ピッキングしたワーク (キュー)の消去

  'コンベヤー2の追従開始領域より下流のワーク (キュー)を消去
  'エラー「追従開始領域外のワークにトラッキング動作を行った」から自動復帰
  ErrHandler:
  ErrNum = Err
  If ErrNum = 4406 Then
    Cnv_QueRemove 2, 0
    EResume WaitParts
    'エラー「追従開始領域外のワークにトラッキング動作を行った」以外のエラーを
    '表示
  Else
    Print "エラー発生!"
    Print "No.", Err, ":", ErrMsg$(Err, 1)
    Print "Line :", Erl(0)
    'ユーザーエラー発生
    Error 8000
  EndIf
Fend