PF_AccessFeeder

PF_AccessFeederは、複数ロボット/1台フィーダーのシステムで、ロボット同士の衝突を防ぐために使用します。このコマンドは、2台のロボットが同時に同じフィーダーを共有している場合に必要です。PF_AccessFeederは、フィーダーにアクセスするロボットのロックを取得します。
すでにロックが取得されているときは、PF_AccessFeederはロックが解放されるまで、または、指定したタイムアウト (オプション)に達するまで、タスクを一時停止します。
ロボットがフィーダーの使用を終了した後、他のロボットにフィーダーを解放するために、PF_ReleaseFeeder文を使用してロックを解除します。
詳細は、以下を参照してください。
PF_ReleaseFeeder

例:
タスク1でPF_AccessFeeder 1を実行する。タスク1は続行する。
タスク2でPF_AccessFeeder 1を実行すると、タスク2は一時停止する。
タスク1でPF_ReleaseFeeder 1を実行すると、タスク2は再開する。

本コマンドは、マルチロボット構成で排他制御に使用します。

書式
PF_AccessFeeder フィーダー番号/フィーダー名[, タイムアウト]

パラメーター

  • フィーダー番号
    フィーダー番号を式、または数値 (整数値1~4)で指定します。
  • フィーダー名
    フィーダーラベル (文字列)を指定します。
  • タイムアウト
    ロック解放待ちのタイムアウト (秒)を、式または数値 (整数)で指定します。省略可能です。

戻り値
なし

解説
タイムアウトが指定された場合は、TW 関数の戻り値で結果を判断できます。
詳細は以下のマニュアルを参照してください。
"Epson RC+ 8.0 SPEL+ ランゲージリファレンス - TW 関数"

  • ロックが解放された、または、ロックを取得した (False)
  • タイムアウトに達した (True)

フィーダーの動作は、ロックの取得/解放の影響を受けません。
タスク終了時は、そのタスクで取得したロックは自動的に開放されます。
同じタスクで、同じフィーダーに対して2回連続でPF_AccessFeederを実行するとエラーになります。
仮想コントローラーおよびコマンドウィンドウからは実行できません。

使用例
2つのロボットで1つのフィーダー上のパーツをピックする例です。
ロボット1がフィーダー上のパーツを取得し、ポイントplace1に移動します。
ロボット1が移動経路の50%に達したところで、ロボット2がパーツを取得するための移動を開始します。

Function Main

    MemOff PartsToPick

    Motor On

    PF_Start 1

    Xqt Robot1PickPlace
    Xqt Robot2PickPlace
Fend

Function Robot1PickPlace
    Robot 1
    Do
        If MemSw(PartsToPick) = On Then
            If PF_QueLen(1) > 0 Then
                PF_AccessFeeder 1
                P0 = PF_QueGet(1)
                PF_QueRemove 1
                Jump P0 /R
                On 5
                Wait 0.5
                Jump Place ! D30; PF_ReleaseFeeder 1 !
                Off 5
                Wait 0.25
            Else
                MemOff PartsToPick
            EndIf
        EndIf
        Wait 0.1
    Loop
Fend

Function Robot2PickPlace
    Robot 2
    Do
        If MemSw(PartsToPick) = On Then
            If PF_QueLen(2) > 0 Then
                PF_AccessFeeder 1
                P0 = PF_QueGet(2)
                PF_QueRemove (2)
                Jump P0 /R
                On 5
                Wait 0.5
                Jump Place ! D30; PF_ReleaseFeeder 1 !
                Off 5
                Wait 0.25
            Else
                MemOff PartsToPick
            EndIf
        EndIf
        Wait 0.1
    Loop
Fend

Function PF_Robot(PartID As Integer) As Integer
    Select PartID
        Case 1
            MemOn PartsToPick
            Wait MemSw(PartsToPick) = Off
        Case 2
            MemOn PartsToPick
            Wait MemSw(PartsToPick) = Off
    Send
    PF_Robot = PF_CALLBACK_SUCCESS
Fend