發布日期:2022-04-25 點擊率:84
關鍵詞:正運動技術,PLC,機器視覺
摘要:前幾期課程,我們講述了PLC的梯形圖語言的基本知識,并與大家分享了使用ZDevelop軟件的ZPLC語言調用ZVision視覺指令的方法。
前幾期課程,我們講述了PLC的梯形圖語言的基本知識,并與大家分享了使用ZDevelop軟件的ZPLC語言調用ZVision視覺指令的方法。
本期課程我們將通過使用ZPLC語言實現識別條形碼的視覺功能的程序示例,進一步帶領大家去了解PLC玩轉機器視覺的實現方法。
一檢測原理
(一)識別條形碼
條形碼是由不同的寬度、不同的反射率的條(黑色)和空(白色)組成的,根據特定的編碼規則編制,用于表達一組數字、字母信息的圖形標識符。機器視覺在進行條形碼識別的過程中,將采集到的條形碼信息二值化為黑白條,并根據條形碼的編碼規則輸出對應的存儲內容。
(二)PLC玩轉視覺
在《會PLC也能玩轉機器視覺(一)》的推文中,我們介紹了使用ZPLC編程語言調用ZBasic語言的方法,即EXE @BASIC指令。本期課程我們將和大家分享另一種調用方法,即使用ZPLC編程語言調用BASIC子程序。
二軟件演示
(一)檢測要求
使用ZDevelop軟件的ZBASIC編程語言編寫程序,用于識別軟件所在目錄的flash文件夾下命名為“code”文件夾下的條形碼內容。再使用ZPLC編程語言調用BASIC程序的主任務,進行循環檢測識別。
(二)實例演示
1.打開ZDevelop軟件:新建項目→新建HMI文件→新建main.bas文件→新建global_variable.bas文件→新建Plc1.plc文件,用于編寫PLC執行程序→文件添加到項目。
2.設計HMI界面。
3.在global_variable.bas文件中添加全局變量。
'''''全局變量大部分使用數組結構'''''
''注:basic編程中很多函數會以TABLE(系統的數據結構)做為參數
''table 說明 table 說明
''1~7 矩形roi控件坐標數據 24 數據碼類型
''11~12 鼠標操作時獲取的坐標 26 數據碼結果
'主任務狀態
'0 - 未初始化
'1 - 停止
'2 - 運行中
'3 - 正在停止
GLOBAL DIM main_task_state
main_task_state = 1
' 任務號劃分, 主任務id - 10
GLOBAL DIM main_task_id
main_task_id = 10
'定義圖像變量
GLOBAL ZVOBJECT grabImg
'識別消耗時間
GLOBAL DIM d_identfy_time
d_identfy_time = 0
'識別結果,結果存儲方式為:類型:識別內容,如EAN-13:123456789
GLOBAL DIM d_identfy_rst(256)
'定義本地圖片索引
GLOBAL DIM d_index
d_index=0
'定義讀取圖片的路徑
GLOBAL DIM File_Name(100)
'全局變量定義完成后再運行HMI文件
RUN "Hmi.hmi",1
4.關聯HMI界面控件變量。
5.在main.bas文件中添加界面初始化函數,并在hmi系統設置中關聯初始化函數名。
end
'HMI界面初始化函數
GLOBAL SUB hmi_init()
main_task_state = 1 '初始化定位檢測主任務狀態為停止狀態1
ZV_RESETCLIPSIZE(1280, 960) '初始化時依據圖像分辨率設置區域的裁剪尺寸,此處圖像分辨率為1280x960
ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(10, 5), HMI_ConTROLSIZEY(10, 5)) '設置鎖存的大小
d_identfy_rst=""
ZV_LATCHCLEAR(0)'清空鎖存通道0
END SUB
6.在main.bas文件中添加HMI界面按下單次執行按鈕響應的函數,并關聯動作函數名。
'HMI界面按下單次執行按鈕時響應的函數
GLOBAL SUB btn_identfy_test()
'開始識別
TICKS = 0'開始計時
if(d_index=4) then
d_index=0
endif
File_Name="code"+TOSTR(d_index,1,0)+".bmp" '.../flash/code/目錄下的圖片所在的路徑名稱
ZV_IMGREAD(grabImg,File_Name,0)
DIM tmp1(64),tmp2(64) '定義中間變量參數
ZVOBJECT codeList, codeRst
ZV_CLEAR(codeList) '清空結果列表
d_identfy_rst=""
'根據編碼類型(自動)和掃描步長(1)讀取采集圖像中的對應數據碼內容,將結果存放到codeList中
ZV_CODEREAD(grabImg,codeList,0,1)
if ZV_LISTCOUNT(codeList) > 0 then '如果列表中元素的數量大于0
ZV_LISTGET(codeList,codeRst,0) '取出第一個條碼結果作為顯示
ZV_CODETYPESTR(codeRst,64,24) '獲取數據碼類型并將其存入起始索引為24的TABLE中
DMCPY tmp1(0),TABLE(24),64 '將TABLE中的數組拷貝至tmp1中
ZV_CODESTR(codeRst,64,26) '獲取數據碼結果并將其存入起始索引為26的TABLE中
DMCPY tmp2(0), TABLE(26), 64 '將TABLE中的數組拷貝至tmp2中
d_identfy_rst = tmp1 + ":"tmp2 '顯示識別結果為 數據碼類型:數據碼結果
else
d_identfy_rst = "identify fail!" '識別失敗給變量賦值"identify fail!"
endif
ZV_LATCH(grabImg, 0)
d_index=d_index+1
d_identfy_time = abs(TICKS) '計算識別消耗的時間
END SUB
7.在main.bas文件中添加HMI界面按下連續運行按鈕響應的函數,并關聯動作函數名。
'HMI界面按下連續運行按鈕時響應的函數
GLOBAL SUB btn_run()
if (1 = main_task_state) then '如果主任務處于停止狀態
if (0 = PROC_STATUS(main_task_id)) then'如果程序中任務未開啟
main_task_state = 2 '將主任務狀態設置為正在運行狀態
RUNTASK main_task_id, main_task'開啟主任務
endif
endif
END SUB
''主任務執行的函數
'main_task:
' while(1)
' if (3 = main_task_state) then'如果主任務狀態處于正在停止狀態即停止按鈕按下時
' main_task_state = 1'將主任務狀態設置為停止狀態
' exit while '退出循環
' endif
'
' '否則重復執行以下操作
' btn_identfy_test() '識別條形碼
'
' wend
'END
8.在main.bas文件中添加HMI界面按下停止運行按鈕響應的函數,并關聯動作函數名。
'HMI界面按下停止按鈕時響應的函數
GLOBAL SUB btn_stop()
if (2 = main_task_state) then '如果主任務狀態處于2即正在連續執行任務時
main_task_state = 3 '將主任務狀態置為3,退出循環
endif
END SUB
9.在main.bas文件中注釋連續運行執行的主任務的函數部分,在Plc1.plc文件中添加ZPLC調用主任務執行函數子程序的代碼。
仿真演示效果1
仿真演示效果2
仿真演示效果3
仿真演示效果4
本次,正運動技術會PLC也能玩轉機器視覺(二),就分享到這里。
更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。
下一篇: PLC、DCS、FCS三大控
上一篇: 機器視覺運動控制一體