從SPEL+執行視覺序列:VRun

您可以使用VRun指令,從SPEL+程式在目前的專案中執行任何視覺序列。

Function VisionTest  
  
  VRun seq1  
Fend  

上列的簡單程式將會執行稱為「seq1」的序列,並依據程式啟動的地方,在Run視窗或Operator視窗中顯示圖形結果。
VRun所採取的動作,將依RuntimeAcquire序列屬性而異。此屬性會判定是否在處理序列之前拍攝照片,或是否使用閃光燈觸發器。下列表格顯示針對不同的RuntimeAcquire設定值執行VRun時所發生的情況。

RuntimeAcquire VRun動作 使用方式
0 - None

不拍攝照片。

使用之前的照片。

執行每個序列步驟。

可以在相同的圖片上執行一個以上的序列。通常,在 RuntimeAcquire 設置為Stationary(固定)時,由第一個序列拍照。接著其餘的序列就不會拍攝照片。
1 - Stationary

拍攝新照片。

執行每個序列步驟。

預設。這是最常使用VRun的方式。拍攝照片並執行序列。
2 - Strobed

等候閃光輸入。

拍攝新照片。

執行每個序列步驟。

搭配閃光輸入使用。VRun將立即回傳,接著,系統將會在拍攝照片及執行序列之前等候閃光觸發。

當序列屬性AsyncMode為True(真)時,VRun會在攝影機曝光後回傳,並繼續在背景中完成影像抓取,然後處理序列。相同序列的下一個視覺指令,例如VGet,將自動等待處理完成。
當RuntimeAcquire設為Strobe時,VRun會強制觸發,然後回傳。系統會在背景等待觸發開始並抓取影像,然後再處理序列。
在擷取序列結果之前,您可等待抓取完成。您可藉由檢查AcquireState序列結果來執行。

Function VisionTest  
Integer state  
Boolean passed  
VRun strobedSequence  
' 等待抓取影像  
Do  
  VGet strobedSequence.AcquireState, state  
Loop Until state = 3  
' 立即擷取結果  
VGet strobedSequence.AllPassed, passed  
Fend  

如果您利用RuntimeAcquire = Strobe執行VRun,則您需執行第二個視覺指令,例如VGet,且無需等待AcquireState =3,接著,第二個指令將等候至收到觸發及執行序列為止。如果一直未收到觸發,則必須中止SPEL+工作。
當您執行多個執行視覺序列的SPEL+工作時,若攝影機不同,則會同時抓取影像及處理序列。
若多個SPEL+工作皆使用相同的攝影機,且RuntimeAcquire設為Strobe,則您必須使用SyncLock和SyncUnlock,一次只允許處理一個序列。在以下範例中,序列seq1和seq2皆使用攝影機1。

Function visTask1  
  Integer state  
  Do  
    SyncLock 1 ' 鎖定存取攝影機1  
    VRun seq1  
    Do  
      VGet seq1.AcquireState, state  
    Loop Until state = 3  
    VGet <some results here>  
    SyncUnlock 1 ' 解鎖攝影機1存取  
Fend  
  
Function visTask2  
  Integer state  
  Do  
    SyncLock 1 ' 鎖定存取攝影機1  
    VRun seq2  
    Do  
      VGet seq2.AcquireState, state  
    Loop Until state = 3  
    VGet <some results here>  
    SyncUnlock 1 ' 解鎖攝影機1存取  
Fend  

若想了解SyncLock和SyncUnlock的詳情,請參考 SPEL+ Language Reference Manual。

提示


若想在閃光模式(外部觸發模式)使用ac2500-14gm/gc GigE攝影機,必須使用外接閃光燈。

若未使用閃光燈,攝影機會以滾動快門模式運作,將無法正確辨識移動物體。