從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攝影機,必須使用外接閃光燈。
若未使用閃光燈,攝影機會以滾動快門模式運作,將無法正確辨識移動物體。