ID : 2223
長尺ワークに対するプログラミング例
センサトラッキングする際のプログラミング例を以下に示します。
トラッキング範囲を超える長さのワークが対象になります。
長尺ワークの場合、総ワーク長をトラッキング範囲長で分割したN個の分割領域に対して、それぞれ、通常ワークに対するセンサトラッキングを行っていきます。
このプログラミング例はVer1.10.*から使用可能です。
用例
長尺ワークのセンサトラッキングは、通常ワークと同様、以下の3つのプログラムで実現することができます。
-
「メインプログラム」
コンベアトラッキングに関する初期化処理を行うプログラムです。
-
「ワーク検出プログラム」
ワーク位置の検出とコンベアトラッキングバッファへの保存を行うプログラムです。
-
「トラッキング動作プログラム」
検出したワークの位置をトラッキングバッファより読み出し、トラッキング・ピックアップ動作を行うプログラムです。
1. メインプログラム(SensorTracking.pcs (PCS:265B))
コンベア1のトラッキングバッファをクリアし、センサからの信号のトリガ検出を開始します。
TrackInitialize 1, 0
ワーク検出プログラム、トラッキング動作プログラムを並列実行させます。
Run Sensor
Run Tracking
2. ワーク検出プログラム(Sensor.pcs (PCS:2KB))
立ち上がりエッジを検出します。
Wait IO[48] = OFF
Wait IO[48]
最新のセンサの検出座標(エンコーダ値)をN個分トラッキングバッファに追加します。
下記の図のように、総ワーク長1500[mm]のワークをトラッキング範囲長300[mm]で5分割するような場合は、"N=5"になります。
TrackSetSensor 1, I[10], arrayUser
3. トラッキング動作プログラム(Tracking.pcs (PCS:3KB))
TrackStartコマンドで、コンベアトラッキングを開始する前にホームポジションへ移動します。
コンベアトラッキング中に、Moveコマンドなどの通常動作コマンドを実行すると、トラッキング動作を中断してしまうので注意してください。
Move P, P[50]
ワークが検出される度に、トラッキング・ピックアップ動作を行うためのメインループです。
ループを途中で終了できるように、内部I/OのON信号をループの継続条件に設定しています。
長尺ワークの場合、1つのワークをN個に領域分割しているので、1回のセンサ検出ごとにN回ループを回すことになります。
何個目の分割領域を処理しているかを判断するために、ローカル変数でループ回数を保持しておく必要があります。
Dim divCount As Integer
divCount = 0
Do
divCount = divCount + 1
If (divCount > I[10]) Then
divCount = 1
End If
P[10] = TrackTargetPos(1, -1, -1, 4)
...
TrackApproach P, P[10], 50
...
LOOP UNTIL IO[128] = ON
ループ内の処理です。
まず、コンベアトラッキングバッファからワークのデータを取り出し、トラッキング対象ワークに設定します。
ワーク未検出の場合、ワークが検出され、コンベアトラッキングバッファにデータが積まれるまで、この行で待機します。
P[10] = TrackTargetPos(1, -1, -1, 4)
下記の図のように、分割した作業領域内の(2)以降の領域に対してセンサトラッキングを行う場合、ワーク先端はすでにトラッキング範囲下流限界を越してしまっているため、トラッキング対象ワークとして認識されません。
(2)以降の領域を認識させるためには、TrackTargetPosのモード設定(第4引数)のモード3を有効にする必要があります。
「TrackTargetPos」コマンドでトラッキング対象ワークに設定しただけの状態では、ロボットは、上記の図の(1)の領域にあるワーク先端位置に対してトラッキング動作を行います。そのため、トラッキング対象ワークを、現在の分割領域に応じて、反コンベアベクトル方向にオフセットさせる必要があります。コンベアベクトルはTrackConveyorVectorコマンドで取得できます。オフセット量は、TrackCurStarAreaコマンドで取得できるトラッキング範囲長と現在のループ回数を使って計算します。
Dim curDivNo As Integer
curDivNo = (divCount - 1)
Dim trckArea As Variant
Dim trckRange As Integer
trckArea = TrackCurStartArea(1)
trckRange = (trckArea(1) - trckArea(0))
P[10] = P[10] - (convVec * (curDivNo * trackRange))
トラッキングモードの開始を指示します。このコマンドを実行した段階では、ロボットはまだ移動を開始しません。
TrackApproachコマンド等のトラッキング動作コマンドを実行して初めて移動を開始します。
トラッキング対象ワークがトラッキング範囲下流限界を越した場合、デフォルトではエラーが発生します。
TrackStart 1, 2
上記の図で説明したように、分割した作業領域内の(2)以降の領域に対してセンサトラッキングを行う場合、ワーク先端はすでにトラッキング範囲下流限界を越してしまっているため、TrackStartコマンドのオプション設定(第2引数)でオプション2を有効にし、このエラー発生を無効にしておく必要があります。
トラッキング対象ワークの各分割領域の先頭位置が、トラッキング範囲内に入るまで待ちます。
Wait TrackInRange(1, (-trckRange * curDivNo)), 10000, timeoutFlg
「TrackInRange」コマンドは、デフォルトではトラッキング対象ワークの先頭位置に対して判定を行います。各分割領域の先頭位置に対して判定されるようにするためには、オフセット量(第2引数)に各分割領域の先頭位置までのオフセット量を随時設定する必要があります。オフセット量は、TrackCurStarAreaコマンドで取得できるトラッキング範囲長と現在のループ回数を使って計算します。
コンベアと等速になるように追従動作を行いながら、トラッキング対象ワークから50mm上空のアプローチ位置へ移動します。
TrackApproach P, P[10], 50
コンベアと等速になるように追従動作を行いながら、トラッキング対象ワークへ近づきます。
TrackMove L, P[10]
コンベアと等速になるように追従動作を行いながら、ワーク上に四角形を描きます。
TrackMove L, P[10] + P(0, 50, 0)
TrackMove L, P[10] + P(-100, 50, 0)
TrackMove L, P[10] + P(-100, -50, 0)
TrackMove L, P[10] + P(0, -50, 0)
TrackMove L, P[10]
コンベアと等速になるように追従動作を行いながら、トラッキング対象ワークから50mm上空へ離れます。
TrackDepart P, 50
トラッキングモードの終了を指示します。コンベアへの追従動作を終了して減速停止します。
TrackStop
ピックアップしたワークを排出位置へ搬送します。
Approach P, P[52], 50
ID : 2223