Cargo Transfer Process Simulation「貨物轉移過程模擬」
https://www.youtube.com/watch?v=Ic9PpPG-_NU
以下是操作步驟:
- 打開 EasyBuilder Pro,選擇「新建專案」(New Project),接著選擇「MT8102iE」機型。
- 翻譯後續的 EasyBuilder Pro 操作步驟
- 提供 MT8102iE 與 PLC 連線的通訊設定教學
- 彈出「系統屬性」(System Properties)視窗,點擊「確定」(OK)。
- 進入 HMI 畫面,請參照下表新增對應的元件:
- 夾爪、瓶子和紙箱的圖片,請至此連結下載:[HMI 圖片]
- HMI 畫面上的元件外觀,理應呈現如下圖所示:
- 為了讓這些元件能依據期望的流程運行,請新增巨集(Macro)。本次將建立 2 個巨集:第一個巨集用於設定所有元件的初始狀態,且僅在程式啟動時執行一次。第二個巨集用於持續循環執行程式,使期望的製程得以運作。欲建立第一個巨集,請開啟「專案」(Project)選單,點擊「巨集」(Macro)按鈕,並在巨集視窗中輸入以下程式碼:macro-0
- 將 macro-0 程式碼輸入至工作區(Work Space)後,勾選「HMI 啟動時執行一次」(Execute one time when HMI starts)選項。
- 點擊「儲存並編譯」(Save & Compile)按鈕,畫面應顯示 0 錯誤(0 error)訊息。接著點擊「離開」(Exit)按鈕關閉工作區視窗。
- 接下來建立第二個巨集,點擊「新建」(New)。在工作區中勾選「週期性執行」(Periodical execution),設定時間間隔(Time Interval) = 1 x 100ms,隨後輸入以下程式碼:macro-1。
- 點擊「儲存並編譯」(Save & Compile)按鈕,畫面應顯示 0 錯誤(0 error)訊息。
- 點擊「離線模擬」(Off-line Simulation)按鈕。
- 撰寫或解構 macro-0 的初始化程式碼(例如設定初始座標或變數)
- 撰寫或優化 macro-1 的邏輯程式碼(實現瓶子移動、夾爪搬運等動畫邏輯)
- 提供威綸巨集常用的 GetData / SetData 語法說明 與暫存器對照
- 按下 Start 按鈕以點亮指示燈,按下 Stop 按鈕則熄滅指示燈。 當指示燈熄滅時,所有後續製程皆無法執行。
- 按下 S1 按鈕以產生瓶子,並讓瓶子在 1 號輸送帶上運行。
- 按下 S2 按鈕將瓶子從 1 號輸送帶夾起,並放入 2 號輸送帶上的紙箱內。
- 按下 S3 按鈕讓夾爪(Gripper)返回初始位置。
- 若紙箱尚未裝滿,則無法按下 S4 按鈕。 為此,請重複按下 S1 至 S3 按鈕,直到紙箱內裝滿 3 個瓶子。裝滿 3 個瓶子後即可按下 S4 按鈕,使紙箱移動到 2 號輸送帶的最右端。
- 按下 S1 按鈕將會把(已裝滿的)紙箱運走,接著 2 號輸送帶的最左端會出現一個新紙箱,同時 1 號輸送帶上也會運行一個新瓶子,整個流程將重新循環。
macro_command main()
short data_lw[10]
bool data_lb[11]
data_lb[7]=1
data_lb[8]=0
data_lb[9]=0
data_lb[10]=0
//lw[0] dan lw[1] dikosongkan untuk mqtt
data_lw[2]=0 //kondisi gripper membuka
data_lw[3]=390 //posisi griper sumbu x
data_lw[4]=10 //posisi griper sumbu y
data_lw[5]=0 //kondisi botol
data_lw[6]=0 //posisi botol sumbu x
data_lw[7]=0 //posisi botol sumbu y
data_lw[8]=0 //box kosong
data_lw[9]=510 //posisi box di konveyor2
SetDataEx(data_lw[0], "Local HMI", LW, 0, 10)
SetDataEx(data_lb[0], "Local HMI", LB, 0, 11)
end macro_commandmacro_command main()
bool data_lb[11]
bool turun1
bool turun2
bool naik1
bool naik2
bool geser1
bool geser2
bool geser3
bool geser4
bool awal=1
short data_lw[10]
GetDataEx(data_lw[0], "Local HMI", LW, 0, 10)
GetDataEx(data_lb[0], "Local HMI", LB, 0, 11)
if data_lb[1]==1 then //tombol Start ditekan
data_lb[0]=1 //indikator menyala
end if
if data_lb[2]==1 then //tombol Stop ditekan
data_lb[0]=0 //indikator padam
end if
if data_lb[3]==1 then //tombol S1 ditekan
data_lw[5]=1
data_lw[6]=98
data_lw[7]=275
data_lb[7]=0
geser1=1
if data_lw[9]>700 then
data_lw[8]=0
data_lw[9]=510
end if
end if
if geser1==1 and data_lb[0]==1 then
data_lw[6]=data_lw[6]+5
if data_lw[6]>412 then
geser1=0
data_lb[8]=1
end if
end if
if data_lb[4]==1 then //tombol S2 ditekan
data_lb[8]=0
turun1=1
end if
if turun1==1 and data_lb[0]==1 then
data_lw[4]=data_lw[4]+5
if data_lw[4]>136 then
turun1=0
naik1=1
end if
end if
if naik1==1 and data_lb[0]==1 then
data_lw[2]=1
data_lw[4]=data_lw[4]-5
data_lw[7]=data_lw[7]-5
if data_lw[4]<15 then
naik1=0
geser2=1
end if
end if
if geser2==1 and data_lb[0]==1 then
data_lw[3]=data_lw[3]+5
data_lw[6]=data_lw[6]+5
if data_lw[6]>(530+data_lw[8]*56) then
geser2=0
turun2=1
end if
end if
if turun2==1 and data_lb[0]==1 then
data_lw[4]=data_lw[4]+5
data_lw[7]=data_lw[7]+5
if data_lw[4]>130 then
turun2=0
data_lb[9]=1
end if
end if
if data_lb[5]==1 then //tombol S3 ditekan
data_lw[5]=0
data_lw[6]=0
data_lw[7]=0
data_lb[5]=0
data_lb[9]=0
data_lb[7]=1
naik2=1
data_lw[8]=data_lw[8]+1
if data_lw[8]==3 then
data_lb[10]=1
data_lb[7]=0
end if
if data_lw[8]>3 then
data_lw[8]=0
end if
end if
if naik2==1 and data_lb[0]==1 then
data_lw[2]=0
data_lw[4]=data_lw[4]-5
if data_lw[4]<15 then
naik2=0
geser3=1
end if
end if
if geser3==1 and data_lb[0]==1 then
data_lw[3]=data_lw[3]-5
if data_lw[3]<395 then
geser3=0
end if
end if
if data_lw[8]==3 and data_lb[6]==1 then //tombol S4 ditekan
data_lb[10]=0
geser4=1
end if
if geser4==1 and data_lb[0]==1 then
data_lw[9]=data_lw[9]+5
if data_lw[9]>700 then
data_lb[7]=1
geser4=0
end if
end if
SetDataEx(data_lb[0], "Local HMI", LB, 0, 11)
SetDataEx(data_lw[0], "Local HMI", LW, 0, 10)
end macro_command

