サンプルプログラム

ビジョンコンベヤーのプログラミング

通常、ビジョンコンベヤーを操作するのに2つのタスクが使われます。

1つのタスクは、ワークをビジョンシステムで認識して、それをコンベヤーキューに加えます。

もう1つのタスクは、コンベヤーキューにある追従開始領域内のワークをチェックします。ワークが追従開始領域内にあるとき、ロボットはワークをハンドリングします。その後、ハンドリングしたワークを指定された場所に置きます。

次の例は、"main"ファンクションからXqtを使用して2つのタスクを実行するサンプルプログラムです。

  • 1つ目のタスク: "ScanConveyorStrobed"ファンクション
  • 2つ目のタスク: "PickParts"ファンクション

以下に対応したプログラムです。

ビジョンコンベヤートラッキングシステムの配線例

このサンプルプログラムは、ハードウェアトリガーの構成で、コントローラーのI/Oを使ってカメラのトリガーとエンコーダーのラッチを行っています。

以下は、コンベヤー番号が"1"のときのサンプルプログラムです。

サンプルプログラムは、ロボットが追従開始領域外のワークをトラッキングした場合も、自動で復帰する仕様となっています。

Function main
  Motor On
  Power High

  Speed 30
  Accel 30, 30

  Xqt ScanConveyorStrobed  'キュー登録するタスク
  Xqt PickParts            'ワーク (キュー) をトラッキングするタスク
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
    '撮像したワークをキューに登録
    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 PickParts
  OnErr GoTo ErrHandler
  Integer ErrNum
  Cnv_Mode 1,1             'トラッキングモードを選択
  WaitParts:
  Do
    'ワーク (キュー)が追従開始領域内に入るまで待機
    Wait Cnv_QueLen(1, CNV_QUELEN_PICKUPAREA) > 0
    'トラッキング開始
    'スカラロボットを使用する場合
    Jump Cnv_QueGet(1)
    Wait 0.1               'Wait時間だけ、ロボットはコンベヤーと等速度で移動します
    Jump P1                '指定した場所に移動
    Cnv_QueRemove 1, 0     'ピッキングしたワーク (キュー)の消去
  Loop
  '追従開始領域より下流のワーク (キュー)の消去
  'エラー「追従開始領域外のワークにトラッキング動作を行った」から自動復帰
  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

キーポイント


ソフトウェアトリガーの場合、"ScanConveyorStrobed"は、以下になります。

ソフトウェアトリガーを使う場合は、FindPartsシーケンスのRuntimeAcquireプロパティを"Stationary"に設定してください。

Function ScanConveyorNonStrobed
  Integer i, numFound
  Real x, y, u
  Boolean found
  Do
    'コンベヤー上のワークを撮像
    VRun FindParts
    Cnv_Trigger 1          'ソフトウェアトリガーでエンコーダーをラッチ
    VGet FindParts.Parts.NumberFound, numFound
    'ワークをキューに登録
    For i = 1 to numFound
      VGet FindParts.Parts.CameraXYU(i), found, x, y, u
      Cnv_QueAdd 1, Cnv_Point(1, x, y)
    Next i
    Wait 0.1
  Loop
Fend

センサーコンベヤーのプログラミング

通常、センサーコンベヤーを操作するのに2つのタスクが使われます。1つのタスクは、ワークがセンサーを作動させるのを待ち、ワークをコンベヤーキューに加えます。もう1つのタスクは、コンベヤーキューにある追従開始領域内のワークをチェックします。ワークが追従開始領域内にあるとき、ロボットはワークをハンドリングします。その後、ハンドリングしたワークを指定された場所に置きます。

サンプルプログラムは、ロボットが追従開始領域外のワークをトラッキングした場合も、自動で復帰する仕様となっています。

Function main
  Motor On
  Power High

  Speed 30
  Accel 30, 30

  Xqt ScanConveyor               'キューを登録するタスク
  Xqt PickParts                  'ワーク (キュー)をトラッキングするタスク
Fend

Function ScanConveyor
  Double lpulse1                 '1つ前のラッチパルス
    lpulse1 = Cnv_LPulse(1)      'ラッチパルスをlpulse1に登録
    Do
      'ワークがセンサーを通過した場合のみ、キューに登録
      If lpulse1 <> Cnv_LPulse(1) Then
        Cnv_QueAdd 1, Cnv_Point(1, 0, 0)
        lpulse1 = Cnv_LPulse(1)  'lpulse1を更新
      EndIf
    Loop
Fend

Function PickParts
  OnErr GoTo ErrHandler
  Integer ErrNum
  Cnv_Mode 1,1                   'トラッキングモードを選択
  WaitParts:
  Do
    'ワーク (キュー)が、追従開始領域内に入るまで待機
    Wait Cnv_QueLen(1, CNV_QUELEN_PICKUPAREA) > 0
    'トラッキング開始
    'スカラロボットを使用する場合
    Jump Cnv_QueGet(1)
    Wait 0.1                     'Wait時間だけ、ロボットはコンベヤーと等速度で移動します
    Jump P1                      '指定した場所に移動
    Cnv_QueRemove 1, 0           'ピッキングしたワーク (キュー)の消去
  Loop
  '追従開始領域より下流のワーク (キュー)の消去
  'エラー「追従開始領域外のワークにトラッキング動作を行った」から自動復帰
  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