PF_Vision

お客様が、撮像処理(照明制御, ビジョンの実行, SPELプログラム処理)を記述したい場合に使用します。ビジョンの実行だけでは、パーツの検出や姿勢(表裏など)の判別が困難な場合に使用します。本機能を使用するには、Epson RC+ 8.0メニュー - [ツール] - [Part Feeding] - [Vision]で、[PF_Vision callbackでビジョン処理を行う]を選択してください。

書式
Function PF_Vision(パーツID As Integer, ByRef numBack As Integer) As Integer
' (ビジョン処理)
Fend

パラメーター

  • パーツID
    パーツID (整数値1~32)が入ります。
    マルチパーツ動作時は、アクティブパーツが入ります。
  • numBack
    ピック不能なパーツ (裏向きなど)の個数が代入されます。(ByRef指定されています。)
    この値は、Part Feedingプロセスが、フリップ要否の判定に使用します。
    表裏のないパーツの場合は、“0”を設定します。

戻り値
処理を継続したい場合、PF_CALLBACK_SUCCESSを設定してください。
エラー処理を行いたい場合、ユーザー定義エラー番号 (8000 - 8999)を設定してください。
この値はPF_Statusコールバック関数の引数として渡されます。

解説
この関数は、複数のビジョンシーケンスと、外部照明制御を組み合わせてパーツ座標を検出する場合に使用します。以下のような処理をお客様が記述します。

  • カスタム照明制御
  • ビジョン実行 (VGet ステートメントの実行)
  • パーツ座標キューの管理(初期化、およびポイントデータの登録)

プログラム例
次のプログラムは、2つのビジョンシーケンスVSeq1 (Geomオブジェクト1つを含む)、およびVSeq2 (Geomオブジェクト1つを含む)を使用してパーツを検出する例です。VSeq1は、カスタム照明1とともに使用し、パーツの位置を検出しますが、姿勢が判定できません。VSeq2は、カスタム照明2とともに使用し、表パーツのみを検出します。
検出したパーツの座標 (ローカル番号1とする)は、PF_QueAddコマンドで座標キューに入れます。このときZ座標は、以下で得た値を代入します。
ティーチウィンドウ
フリップを有効にする場合は以下を参照してください。
全般
[パーツビジョンシーケンス]にVSeq2を指定し、カスタム照明2を点灯させます。以下を参照してください。
ビジョン
フリップのキャリブレーションを行います。以下を参照してください。
キャリブレーション

' ** IO Label (Output) **
' O_FrontLight1 カスタム照明1
' O_FrontLight2 カスタム照明2
Function PF_Vision(partID As Integer, ByRef NumBack As Integer) As Integer

    Boolean found
    Integer i, numFound
    Real PX_X, PX_Y, PX_U
    Real RB_X, RB_Y, RB_U, RB_Z

    ' ピックZ座標
    RB_Z = -80.0

    ' 座標キューを初期化
    PF_QueRemove partID, All

    ' カスタム照明1点灯
    On O_FrontLight1

    ' パーツを検出(UsrVisionSeq1実行)
    VRun VSeq1
    VGet VSeq1.Geom01.NumberFound, numFound

    ' カスタム照明1消灯
    Off O_FrontLight1
    ' カスタム照明2点灯
    On O_FrontLight2

    numBack = 0
    For i = 1 To numFound
        ' VSeq1.Geom01で検出したパーツのXYピクセル座標を取得し
        ' そのパーツを囲むようにVSeq2.Geom01のサーチウィンドウを設定
        ' パーツサイズ = 100 × 100 p × l
        VGet VSeq1.Geom01.PixelXYU(i), found, PX_X, PX_Y, PX_U
        VSet VSeq2.Geom01.SearchWinLeft, (PX_X - 50)
        VSet VSeq2.Geom01.SearchWinTop, (PX_Y - 50)

        ' VSeq2実行
        VRun VSeq2
        VGet VSeq2.Geom01.Found, found

        If found = True Then
            ' 検出できたら表パーツなので座標キューに登録
            ' ローカル番号は1
            VGet VSeq1.Geom01.RobotXYU(i), found, RB_X, RB_Y, RB_U
            PF_QueAdd partID, XY(RB_X, RB_Y, RB_Z, RB_U) /1

        Else
            ' 検出できなかったら裏パーツ
            numBack = numBack + 1

        EndIf

    Next

    ' 外部照明2消灯
    Off O_FrontLight2

    PF_Vision = PF_CALLBACK_SUCCESS

Fend