サンプルプログラム
ビジョンコンベヤーのプログラミング
通常、ビジョンコンベヤーを操作するのに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