封閉的一個多月,老菜鳥的 機械手和AGV 自動搬運小專案總結

賀臣發表於2022-04-25

  

    最近上海疫情嚴重,閒賦在家無事可做,手機裡不斷的推送一些無腦的謾罵聲音,索性找點事情做,將3月份實施的一個自動搬運小專案做一個簡單的彙總,便於今後專案實施中積累一些經驗。專案需求非常簡單,因為能力有限也做不了大專案,弄點小專案賺點零花錢。

 

    一.  自動搬運需求

 

      (1)車間有多條生產線,要實現在生產線上實現料架的自動搬運,以其中兩條生產線未例。(此應用場景在生產車間應該是屬於比較常見的場景,佈局示意圖如下圖)

        (2)   A-1,A-2,B-2,B-1 屬於一條生產線,C-1,C-2,D-2,D-1 屬於一條生產線,其中A-1,A-2,C-1,C-2 是碼垛處(將物料將機械手裝載到料架上) ,B-2,B-1,D-2,D-1 工臺(消耗物料處)

        (3)   A-1,A-2 共用一個機械手用於左右兩邊碼垛,B-2,B-1 共用一個機械手用於左右兩邊碼垛

        (4)   兩條生產線共用一臺AGV,用於搬運料架往返碼垛區和工臺區

        (5)   B-2,B-1,D-2,D-1 工作臺處各有一個實體按鈕,用於呼叫AGV搬運

        (6)   如果人工按 實體按鈕 則將指令發給AGV將對應的工臺位的空料架搬運到碼垛區 進行碼垛, 機械手碼垛完成之後將滿料架自動搬運到工臺處進行作業

        (7)   AGV 使用海康的潛伏式AGV,機械手使用匯川機械手

        (8)  A-1,A-2 ,C-1,C-2   AGV 進入都有光柵控制,進入料架底部時需要控制光柵亮,離開時光柵關閉

    

  二. 需求分析

 

  潛伏式AGV:海康,數量1臺,RCS控系統下發基本排程,一臺主控伺服器, B-2,B-1,D-2,D-1  處各有一個實體按鈕,用於下發指令給AGV搬運

  A-1,A-2 中間機械手: 匯川,數量1臺,匯川PLC控制,Modbus 協議 , TCP/IP

       C-1,C-2 中間機械手: 匯川,數量1臺,匯川PLC控制,Modbus 協議 , TCP/IP

     料架:兩條線各有兩個料架 (設計是每條線有三個料架,最終只使用了兩個),料架底部有固定二維碼

  搬運通道:搬運通道只允許單臺AGV 行走

  光柵:A-1,A-2 , C-1,C-2  與通道交接之處有光柵,其開啟/關閉狀態由對應的機械手PLC控制,進出訊號由AGV給到PLC

 

  現實問題:

  (1)  實體按鈕只能發起對AGV的移動指令,只能執行明確的移動指令,比如 P1點 到 P2點, 或者P1點,P2點,P3點,假設由B-1 發起搬運空料架到碼垛區 A-1,A-2 , AGV是無法知道哪個地方是空的,所以實體按鈕無法明確最終目標點。注:實體按鈕只能配置固定的搬運點

  (2)  機械手在碼垛狀態(工作狀態) AGV是不能進入的,需要機械手和AGV有一個比較完善的互動機制

    (3)  海康AGV公開的介面中,只有配置的執行模板關鍵位置點才有回傳,並非所有的座標點都可以回傳資料(可能有其他的方式可以獲取,打算個人沒有找到)。

  (4)  機械手碼垛完成之後,AGV自動將碼垛完成的料架搬回到工臺的空位,同樣面料的(1)問題,需要管理位置的空滿狀態

  (5)  AGV 控制運動模板中有幾個回傳引數可以自定義: 開始任務,結束任務,走出儲位,繼續任務   四個重要的回傳資訊,也可以通過一些其他的引數來互動,目前還沒有理解的很深

  (6)  海康AGV中要明確的區分任務號和請求號,這個給了我不少的困擾

 

  

  AGV執行軌跡分析:

  (1)  未解決空料架,滿料架,空庫位,滿庫位的問題,則需要一套統一的控制系統來協調機械手與AGV,假設系統名為 C系統(為了後續文章中的統一稱呼)

  (2)  在地圖上設定了三個重要的互動點,P1,P2,P3 

  (3)  B-2,B-1,D-2,D-1  實體按鈕 按下,AGV統一搬運對應的空料架統一到 P1 (算完成一個搬運任務),到了P1之後然後由C系統判斷 A-1,A-2 ,C-1,C-2  哪個點有空位,然後在P1點重新發起一個新的搬運任務

  

 

 

  (4)  以 P1,P2, A-2 為例: P1 開始搬運任務,然後經過P2(通知光柵亮),最終到達A-2 , 在A-2 放下空料架之後回到 P2(通知光柵關閉),同時告知機械手開始碼垛。 當此任務完成之後,判斷A-1,C-1,C-2 哪個地方有已經滿了的貨架,則自動開啟下一個滿料架的搬運任務, 否則會一直在P2等待。以此類推其他四個位置的搬運也是如此。

 

  (5)   判斷滿料架,仍然接著上面一個示例,假設A-1 區碼垛完成,則行走的路徑是: P2,P3,A-1,P3,B-2(或B-1)  ,  說明一下料架只能同線搬運,不能混線搬運。在這裡我們需要將這個任務拆解為兩個任務: P2,P3,A-1 以及 P3,B-2 

  

  (6)  總之增加P1,P2,P3三個點,P1 是為了判斷碼垛區哪個地方是空位,P2,P3是為了控制光柵的關閉。 但是要注意一點,當A-1,B-2 回程過程中 P2 互動點是必須經過的,但是此時P2點是不能有訊號觸發的。

 

    根據搬運的軌跡迴圈在此基礎上設計了10個搬運模型模板:

    路線一:B-1(B-2) 到P1 ,使用T01模板,由按鈕發起搬運動作   回傳引數配置:btnStartOne,btnEndOne

    路線二:D-1(D-2) 到P1 ,使用T02模板,由按鈕發起搬運動作 回傳引數配置:btnStartTwo,btnEndTwo

    路線三:P1,P2,A-2 (自動回到P2) ,使用模板T03模板,由C系統自動發起 回傳引數配置:btnStartThree, btnContinueThree, btnEndThree

    路線四:P1,P3,A-1(自動回到P3) ,使用模板T04模板,由C系統自動發起 回傳引數配置:btnStartFour, btnContinueFour, btnEndFour

    路線五:P1,P2,C-2(自動回到P2)  ,使用模板T05模板,由C系統自動發起 回傳引數配置:btnStartFive, btnContinueFive, btnEndFive

    路線六:P1,P3,C-1(自動回到P3)  ,使用模板T06模板,由C系統自動發起 回傳引數配置:btnStartSix, btnContinueSix, btnEndSix

    路線七:A-2[省略],P2,P3,A-1 (或者A-1[省略],P3,P2,A-2) ,使用模板S01, 由C系統自動發起  回傳引數配置:btnStartSeven, btnContinueSeven, btnEndSeven

    路線八:C-2[省略],P2,P3,C-1 (或者C-1[省略],P3,P2,C-2) ,使用模板S02, 由C系統自動發起  回傳引數配置:btnStartEight, btnContinueEight, btnEndEight

    路線九:A-2,P2,B-2(B-1) 【或者A-1,P3,B-2(B-1)】,使用模板S03, 由C系統自動發起 回傳引數配置:btnStartNine, btnContinueNine, btnEndNine

    路線十:C-2,P2,D-2(D-1) 【或者C-1,P3,D-2(D-1)】,使用模板S04, 由C系統自動發起 回傳引數配置:btnStartTen, btnContinueTen, btnEndTen

 

    其中 路線一,路線二 屬於同一個型別,任務的發起是由實體按鈕發起; 路線三,路線四,路線五,路線六 屬於同一種型別,用於搬運空料架到碼垛區;  路線七,路線八屬於同一種型別,用於AGV到碼垛區區滿料架; 路線九 ,路線十 是屬於同一種型別,用於將滿料架搬運到工臺

 

    機械手控制點說明(點位明細不詳細講解,能夠理解大致的意思就行)

    機械手控制邏輯:A-1(C-1) 左邊光柵 ,A-2(C-2) 右邊光柵

    (1)    如果空料架搬入A-1(C-1) 判斷A-2(C-2)碼垛是否完成, 如果碼垛完成下發指令機械手開始左邊的碼垛,否則機械手不做任何改變;

       如果 [D1309]=[ D1310] ,則寫入PLC [D1291]=1

       如果 [D1309]!=[ D1310] ,則不做任何動作

    (2)    如果空料架搬入A-2(C-2) 判斷A-1(C-1)碼垛是否完成, 如果碼垛完成下發指令機械手開始右邊的碼垛,否則機械手不做任何改變;

       如果 [D1307]=[ D1308] ,則寫入PLC [D1291]=2

       如果 [D1307]!=[ D1308] ,則不做任何動作

     (3)    AGV進入左邊A-1(C-1) 搬運滿料架,判斷機械手的狀態,如果機械手的碼垛不在左邊工作且碼垛數量完成即可進行搬運,否則不能進行搬運;

       如果 [D1307]=[ D1308] && [D1307]>0 && [D1306]!=1 , 則AGV則進入搬運

      AGV搬運開啟之後,則需要將PLC中的[D1307]值設定為0

     (4)    AGV進入左邊A-2(C-2) 搬運滿料架,判斷機械手的狀態,如果機械手的碼垛不在右邊工作且碼垛數量完成即可進行搬運,否則不能進行搬運;

       如果 [D1309]=[ D1310] && [D1309]>0 && [D1306]!=2 , 則AGV則進入搬運

      AGV搬運開啟之後,則需要將PLC中的[D1309]值設定為0

       (5)    如果機械手A-1(C-1) 碼垛完成, PLC寄存值:[D1307]=[ D1308] && [D1307]>0 ,且[D1306]!=1

    (6)    如果機械手A-2(C-2) 碼垛完成, PLC寄存值:[D1309]=[ D1310] && [D1309]>0 ,且[D1306]!=2

 

    三. 技術問題

    (1) 海康提供了RCS控制系統,對外協議是HTTP協議,所以這個對接就比較方便了。其中幾個重要的介面: 下發搬運任務指令,繼續任務指令,獲取瞭解與座標之間的對應關係,同時關於回傳的引數設定, 此處對接是比較簡單的,一般做web開發的基本不會有問題

    

    (2) 匯川機械手對接,使用Modbus協議,TCP/IP  ,在沒有使用真機操作之間可以使用Modbus模擬器 (Modbus Poll,Modbus Slave 軟體),網上可以下載。 模擬器上成功了到裝置上十有八九就成功了。(關於Modbus以及這個軟體的使用可以網上搜尋資料,還比較多)。 目前我使用Modbus的通訊元件是HSL(付費,相對較便宜,也就幾千塊錢),也可以網上找其他的元件。 當然也可以使用KepServer 這個軟體,這個是我們在PLC通訊互動中使用最多的軟體,有點不必說,缺點就是 貴 

           

    

    

    (3) 因為做硬體的對接所以用的CS程式,但是海康AGV回傳又是HTTp協議,所以使用了 Microsoft.Owin 元件做了一個 Web容器的管理,使得CS程式也可以使用瀏覽器訪問其內部。

封閉的一個多月,老菜鳥的 機械手和AGV 自動搬運小專案總結
/// <summary>
        /// 開啟API服務
        /// </summary>
        public void Start()
        {
            try
            {
                string baseAddress = ResourceManager.GetSettingEntity("API_URL").Value;
                Microsoft.Owin.Hosting.WebApp.Start<Startup>(baseAddress);
                log.Info("API程式已啟動,按任意鍵退出");
                Console.ReadLine();
            }
            catch (Exception e)
            {
                log.Error("啟動API服務異常:"+e.Message);
            }
        }
CS託管API服務

 

    (4) 技術問題彙總

      1. 當前市面出現的智慧裝置越來越多,很多人都說搞硬體對接,其實當前情況下硬體對接很多都是轉化為了HTTP協議對接,還有一些MQTT,MQ等 ,所以對於大部分程式設計師來說已經完全沒有難度,所以對於初學者來說上手也非常快,比如海康的RCS系統對接

      2. 在PLC對接過程中,少不了的 OPC協議 以及 Modbus協議, 這兩種協議在PLC對接過程中用的非常多,一般純軟體開發人員接觸的相對較少

      3. 協議的轉換的重要性,在硬體對接過程中我們一般使用CS端程式,天然的特性決定了其優勢,但是當前萬物互聯的時代,HTTP協議才是最普遍的,所以要想將更多的終端串聯在一起,將OPC協議,Modbus 協議的資料轉換為HTTP 協議也是非常重要的,極大降低對接難度

      4. 另外市面上就是MQTT協議使用“氾濫”,這個也是在做硬體整合過程中必不可少的,當然還有很多其他的協議,要學習的東西不少

 

    四. 實施總結

      (1)  因為疫情才有了時間記錄一下這次專案,專案開發大概花了10天左右的時間,1次/天 實體機模擬測試(主要是訊號的模擬),然後4天現場施工除錯(沒法出門遠端支援),然後其他時間就是在協調各種資源推進專案,協調資源施工計劃的時間是遠大於開發時間的。

 

      (2)  前期的模式非常重要,如果前期不模擬各種訊號,真正到真機測試的時候問題會比較多。

 

      (3)  跳出自己的技能圈,雖然都是開發,但是和單純的軟體開發還是有點不一樣,這幾年主持施工過30多個工廠,跨領域的知識懂的越多,越有助於你在現場工作。

 

      (4)  關於控制部分的心得就是一定要分解各種動作,越精細越好,在施工之前一定要分解動作然後再組合,否則你會感激這樣也對那樣也對,真正工作起來這也不對那也不對,最關鍵你還沒法改,因為改動的代價太大了。

 

      (5)  心中一定要有一張圖,是一張整體的佈局圖,裝置運轉流程圖,想辦法畫出你心中的圖。如果你不能描繪出這張圖,你會感覺非常的掣肘,軟體開發技術和裝置控制技術都要懂一點才好。

 

      (6) 現場放低你的姿態,你只有和施工人員處在同一個級別他們才會給你說真正的問題,不要以為自己是什麼高階技術人員,否則一個焊樁,一個螺絲就搞死你,一頓飯一瓶水可以解決你很多你解決不了的問題,尊重是順利實施的一個重要手段。

 

      (7)  總結經驗,整體來說這個專案非常簡單,但是感覺又很複雜,各種情況都有,比如簡單的庫存管理,光柵捲簾門的控制,按鈕的呼叫,自動搬運排程,機械受PLC的對接,Web技術和CS程式的融合,多種通訊協議,難者不會會者不難,所以積累的經驗很重要。

 

相關文章