寫在面前
上次分享了文章:
TIA Portal實現動態加密的高階玩法—分級催款密鑰授權管理
然後很快就有朋友根據裏面的思路實現了,很贊,不過提醒大家的是,我們分享的只是一些思路,不是讓大家跟做某件事,請理性看待,不要陷入自己的思維蠶繭之中~
00 前言
自動化立體倉庫是集機械、電子、計算機、通信網絡、傳感器和自動控制等多種技術爲一體,以搬運機械化、控制自動化、管理微機化、信息網絡化爲特徵的現代化物流系統中產品生產與儲存的樞紐,主要應用於存儲配件、半成品、產品、工具、夾具和模具等。
隨着信息化技術的發展和自動化要求的不斷提高,立體倉庫的設備控制不僅要將堆垛機的運行控制做到平滑順暢,更需要堆垛機系統能具備運行過程中各種信息數據的轉換處理,便於操作運行人員或者管理人員能對堆垛機的各種參數及性能得到細緻的瞭解與掌握。
目前堆垛機控制系統更多的研究方向都是控制曲線的實現,並且也已經有很多實際成果已經在實施。然而在堆垛機信息化管理方面,PLC系統做的還不是很完善且實際應用中涉及的比較淺,這造成了在工業應用中更多的信息化數據都是通過WMS/WCS的倉儲數據的信息化,而堆垛機的設備的參數性能,堆垛機對任務處理過程數據等信息化的管理由於PLC系統做的不徹底,導致現在的倉儲控制系統在這方面是一個弱點。
本文主要闡述一種基於PLC(SIEMENS)的堆垛機控制技術中對於堆垛機運行過程中的數據的管理的原理以及數據處理的方式。
01 立體倉庫控制系統
立體倉庫的控制系統主要包括WMS/WCS系統以及設備控制系統(PLC)。最上層的WMS系統負責倉儲業務邏輯的處理,最下層是具體物流設備的控制,比如堆垛機。WCS處於WMS與PLC之間,負責協調,調度底層設備,使底層設備可以執行倉儲系統的業務流程並且這個過程完全按照程序預先設定的流程執行的。通常WMS與WCS都是在同一硬件系統(服務器)實現,所以下文所有的描述都統稱爲WMS/WCS系統。
圖1 立體倉庫控制系統構架
PLC和WMS/WCS之間由以太網(無線)連接,通過TCP/IP協議交換信息數據,二者之間主要由兩類數據的交互:
心跳包數據:心跳包數據主要用於監視PLC和WMS/WCS之間的連接是否正常,只有連接正常的情況下才有數據交互的可能性;
任務信息數據:WMS/WCS給PLC發送的任務信息,PLC在執行過程中該任務信息狀態反饋以及設備信息的反饋;此類數據二者在不同時刻具有不同身份,是不同信息的創造者;
圖2 PLC與WMS/WCS通信鏈路處理
堆垛機作業流程:
WMS/WCS根據業務流程向堆垛機發送任務信息,堆垛機系統(PLC)在收到任務信息後將按照信息內容執行任務流程並且在執行過程中實時向WMS/WCS反饋當前任務狀態。
正常流程:堆垛機執行任務一次性完成,中途沒有出現任何異常;
異常流程:堆垛機執行任務過程中,由於設備出現故障或其他因素,導致任務必須暫停甚至中斷稱之爲異常。此時PLC必須告知WMS/WCS異常的原因並等待異常結束後將任務執行完成,最終併發送任務完成信息給WMS/WCS系統;
圖3 PLC與WMS/WCS作業流程示意圖
02 PLC中堆垛機的數據管理方式
2.1任務信息組成
堆垛機主要基於WMS/WCS發送的任務信息執行貨物的位置搬運,設備空移等動作,核心要素即堆垛機的位置移動,位置定位等的控制。所以,WMS/WCS發送給PLC的任務信息也是主要包括任務屬性描述以及位置等核心數據。一般的任務信息數據可以概括如下表所示:
表格1 堆垛機任務信息數據
2.2PLC系統數據管理
PLC爲了將接收到的任務信息能正確的執行,在PLC中建立了四個數據區域:
Link:各種數據記錄(TST,TIF,TST)的鏈接,每一個獨立的任務信息對應一個Link編號且該Link下面會有相關數據記錄編碼的鏈接;
TIF: Task Information,任務信息記錄,記錄任務信息中接收到的數據;每一個TIF對應一個任務ID的信息並由Link鏈接到其他記錄信息;
TST: Task States,任務狀態記錄,表明該任務信息當前狀態;每一個TST對應一個任務ID的信息並由Link鏈接到其他記錄信息;
TDT: Task Distance,任務距離數據記錄,記錄該任務起始/目的/當前位置信息或者距離信息,每一個堆垛機對應一組信息記錄,同一堆垛機的TSD記錄號碼是相同的且與堆垛機編號相同;
2.2.1任務信息記錄(TIF: Task Information)
TIF用於記錄PLC收到的WMS/WCS的任務信息,用於指導堆垛機的運行控制;在PLC中自定義一種結構體數據類型名叫:UDT_TIF,其結構如下圖所示:
TYPE “UDT_TIF”
STRUCT
Link : Int; // Link Record in Link DB list
Function_Code : Int; // 任務功能編碼:比如定義出庫,入庫編號
stocker_ID : Int; // 堆垛機編號
Task_ID : DInt; // 任務編號
Priority_code : Int; // 任務優先級,級別越高越先執行
Res_Platform : Int; // 起始棧臺編號
Res_Tunnel : Int; // 起始巷道編號
Res_Row : Int; // 起始貨架Row編號,決定堆垛機伸叉方向
Res_Line : Int; // 起始貨架Y軸座標(堆垛機行走方向)
Res_Tier : Int; // 起始貨架X軸座標(堆垛機提升方向)
Res_Depth : Int; // 起始貨架Z軸座標(堆垛機伸叉方向)
Des_Platform : Int; // 目的棧臺編號
Des_Tunnel : Int; // 目的巷道編號
Des_Row : Int; // 目的貨架Row編號,決定堆垛機伸叉方向
Des_Line : Int; // 目的貨架Y軸座標(堆垛機行走方向)
Des_Tier : Int; // 目的貨架X軸座標(堆垛機提升方向)
Des_Depth : Int; // 目的貨架Z軸座標(堆垛機伸叉方向)
Weigth : Int; // 貨物重量
Barcord_Tub : String[10]; // 托盤條碼
END_STRUCT;
END_TYPE
在PLC中實例化一個數據塊,名稱叫做DB_TIF_List。該數據區域包括兩部分:數據塊頭文件與數據主體。
數據頭文件區域定義了數據區域的一些屬性,比如頭文件長度,數據類型的長度,當前最大記錄數目等信息;
數據主體就是存放實際數據的區域,主要由100組UDT_TIF類型組成的數據列表,意味着數據區域最多可以同時存放100個堆垛機任務;
DATA_BLOCK"DB_TIF_List"
STRUCT
Length_Header : Int; // DB塊頭文件的長度,工程師設定
Length_Record : Int; // 每一臺記錄的長度,系統自動計算
Last_Task_Record : Int; // 當前存儲的記錄的位置,系統自動計算
Entries_Present : Int; // 能存儲的最多數據的記錄
Default_Record_DB : Int; // 默認的數據塊編號
Not_Used : Int; // 沒有定義
s_Done : Bool; // 用於指示該數據塊正在被調用
TIF : Array[1..100] of"UDT_TIF";
END_STRUCT;
END_DATA_BLOCK
2.2.2任務狀態記錄(TST: Task States)
對於堆垛機設備來說,每一個任務的執行都是三個座標(水平,垂直,貨架)系統的目標位置與設備當前位置之間的座標位移。TST則用於記錄任務的執行狀態,其中包括兩個方面的數據的記錄:
任務的整體狀態:包括任務是否被激活,任務是否正在執行,任務是否被中斷,任務是否執行完成等;
任務的過程狀態:過程狀態包括三個座標系電機在當前任務中的執行狀態,比如在該任務中水平行走座標是否已經完成,垂直提升座標是否已經完成,貨叉伸縮貨叉任務是否已經完成等;
PLC自定義一種數據類型名叫:UDT_TST用於記錄任務執行狀態
TYPE"UDT_TST"
STRUCT
Link : Int; // Link Record in Link DB list
Interrupt_code : Int; // 任務中斷代碼
Defeated_Reason : Int; // 任務中斷的原因代碼
Depth_Run_Counter : Int; // 1:單貨叉運行;2::雙貨叉運行
Current_Lift_Speed : Int; // 提升電機當前速度
Current_Line_Speed : Int; // 行走電機當前速度
Read_Barcode_States : Int; // 0表示條碼狀態正確;1:表示條碼狀態錯誤
Read_Barcode_1 : String[10]; // 讀到的第一條條碼
Read_Barcode_2 : String[10]; // 讀到的第二條條碼
Read_Barcode_3 : String[10]; // 讀到的第三條條碼
Task_status : Bool; // 1:任務正在執行 0:任務等待中
Task_Res_Depth_Status : Bool; // 1:任務正在執行 0:任務等待中
Task_Des_Depth_Status : Bool; // 1:任務正在執行 0:任務等待中
Task_Finished : Bool; // TRUE=任務完成
Task_defeated : Bool; // TRUE=任務中斷
Task_completed : Bool; // TRUE=收到WCS反饋信息
Hold_Goods : Bool; // 叉車上有貨物
Task_defeated_inform : Bool; // TRUE=上位機任務中斷確認
Task_Res_Line_Finish : Bool; // TRUE=起始Y軸(行走)完成
Task_Des_Line_Finish : Bool; // TRUE=目的Y軸(行走)完成
Task_Res_Column_Finish : Bool; //TRUE=起始X軸(提升)完成
Task_Des_Column_Finish : Bool; //TRUE=目的X軸(提升)完成
Task_Res_Depth1_Finish : Bool; //TRUE=起始Z軸(單伸貨叉)完成
Task_Des_Depth1_Finish : Bool; //TRUE=目的Z軸(單伸貨叉)完成
Task_Res_Depth2_Finish : Bool; //TRUE=起始Z軸(雙伸貨叉)完成
Task_Des_Depth2_Finish : Bool; //TRUE=目的Z軸(雙伸貨叉)完成
Task_Res_Req_Lift_LittleUp : Bool;//TRUE:請求提升電機微升
Task_Res_Req_Lift_LittleDn :Bool; // TRUE:請求提升電機微降
Task_Des_Req_Lift_LittleUp :Bool; // TRUE:請求提升電機微升
Task_Des_Req_Lift_LittleDn :Bool; // TRUE:請求提升電機微降
Line_Motor_Run_On : Bool; // X軸電機運行信號
Column_Motor_Run_On : Bool; // Y軸電機運行信號
Depth_Motor1_Run_On : Bool; // 貨叉電機1運行信號
Depth_Motor2_Run_On : Bool; // 貨叉電機2運行信號
END_STRUCT;
END_TYPE
在PLC中實例化一個數據塊,名稱叫做DB_TST_List。該數據區域包括兩部分:數據塊頭文件與數據主體。
數據頭文件區域定義了數據區域的一些屬性,比如頭文件長度,數據類型的長度,當前最大記錄數目等信息;
數據主體就是存放實際數據的區域,主要由100組UDT_TST類型組成的數據列表,意味着數據區域最多可以同時存放100個堆垛機任務;
DATA_BLOCK “DB_TST_List”
STRUCT
Length_Header : Int; // DB塊頭文件的長度,工程師設定
Length_Record : Int; // 每一臺記錄的長度,系統自動計算
Last_Task_Record : Int; // 當前存儲的記錄的位置,系統自動計算
Entries_Present : Int; // 能存儲的最多數據的記錄
Default_Record_DB : Int; // 沒有定義
Not_Used : Int; // 沒有定義
s_Done : Bool; // 用於指示該數據塊正在被調用
TST : Array[1…100] of"UDT_TST";
END_STRUCT;
END_DATA_BLOCK
2.2.3任務位置(TSD: Task Distance)
TSD主要記錄執行任務中相關的座標位置數據,主要包括兩種位置數據:
設備當前位置數據:包括堆垛機三臺電機的當前位置座標值;
任務位置數據:每一個有效任務都包括起始位置和終點位置,任務位置值就包括任務中這兩類的三臺設備的目的數據;
PLC自定義一種數據類型名叫:UDT_TSD用於記錄任務座標位置值;
TYPE"UDT_TSD"
STRUCT
Link : Int;
Current : Struct // Current stocker position information
Line_Posi : DInt; // 當前Y軸座標(堆垛機行走方向)
Tier_Posi : DInt; // 當前X軸座標(堆垛機提升方向)
Depth_Posi : DInt; // 當前Z軸座標(堆垛機伸叉方向)
Platform : Int; // 當前棧臺編號
Tunnel : Int; // 當前巷道編號
Row : Int; // 當前列編號
Line : Int; // 當前排編號
Tier : Int; // 當前層編號
Depth : Int; // 當前深度編號
END_STRUCT;
Task_Res : Struct // Current task resource positioninformation
Platform_Posi : DInt; // 任務棧臺位置值,單位mm
Tunnel_Posi : DInt; // 任務巷道位置值,單位mm
Row_Posi : DInt; // 貨架Row編號,決定堆垛機伸叉方向
Line_Posi : DInt; // 貨架Y軸座標(堆垛機行走方向)
Tier_Posi : DInt; // 貨架X軸座標(堆垛機提升方向)
Depth_Posi : DInt; // 貨架Z軸座標(堆垛機伸叉方向)
END_STRUCT;
Task_Des : Struct // Current task destination positioninformation
Platform_Posi : DInt; // 任務棧臺位置值,單位mm
Tunnel_Posi : DInt; // 任務巷道位置值,單位mm
Row_Posi : DInt; // 貨架Row編號,決定堆垛機伸叉方向
Line_Posi : DInt; // 貨架Y軸座標(堆垛機行走方向)
Tier_Posi : DInt; // 貨架X軸座標(堆垛機提升方向)
Depth_Posi : DInt; // 貨架Z軸座標(堆垛機伸叉方向)
END_STRUCT;
END_STRUCT;
END_TYPE
在PLC中實例化一個數據塊,名稱叫做DB_TSD_List。該數據區域包括兩部分:數據塊頭文件與數據主體。
數據頭文件區域定義了數據區域的一些屬性,比如頭文件長度,數據類型的長度,當前最大記錄數目等信息;
數據主體就是存放實際數據的區域,主要由100組UDT_TSD類型組成的數據列表,意味着數據區域最多可以同時存放100個堆垛機任務;
DATA_BLOCK “DB_TSD_List”
STRUCT
Length_Header : Int; // DB塊頭文件的長度,工程師設定
Length_Record : Int; // 每一臺記錄的長度,系統自動計算
Last_Task_Record : Int; // 當前存儲的記錄的位置,系統自動計算
Entries_Present : Int; // 能存儲的最多數據的記錄
Last_TaskID : DInt; // 默認的數據塊編號
s_Done : Bool; // 用於指示該數據塊正在被調用
TSD : Array[1..5] of "UDT_TSD";
END_STRUCT;
END_DATA_BLOCK
2.2.4數據鏈接(Link)
TIF,TST堆棧共有100組數組,TSD堆棧共有5組數組,當收到一個新的任務的時候相關信息要保存到各自數據區域的哪一組裏面呢?
類似疑問就需要通過Link來解決,Link在堆垛機控制系統中主要有以下用途:
當接收到新的任務信息後,系統會生成一個新的Link編號並存放於數據塊中;
Link生成成功後基於Link編號生成其他數據(TIF,TST,TSD)的編號並通過Link編號進行各類數據之間的橋接;
Link數據如下所示:
TYPE"UDT_Link"
STRUCT
TIF: Int; // 任務信息編號;
TST: Int; // 任務狀態編號;
TSD: Int; // 任務距離編號;
Priority : Int; // 優先級:確定任務執行的先後順序,優先級越高越先執行;
END_STRUCT;
END_TYPE
Priority:優先級,與TIF中的優先級的值是一致的,在Link中主要用於生成當前任務號(優先級越高,該任務必須越先執行);
注:優先級僅限於當前列表中未執行任務的比較;
在PLC中實例化一個數據塊,名稱叫做DB_Link_List。該數據區域包括兩部分:數據塊頭文件與數據主體。
數據頭文件區域定義了數據區域的一些屬性,比如頭文件長度,數據類型的長度,當前最大記錄數目等信息;
數據主體就是存放實際數據的區域,主要由100組UDT_TSD類型組成的數據列表,意味着數據區域最多可以同時存放100個堆垛機任務;
DATA_BLOCK “DB_Link_List”
STRUCT
Length_Header : Int; // DB塊頭文件的長度,工程師設定
Length_Record : Int; // 每一臺記錄的長度,系統自動計算
Last_Record : Int; // 當前存儲的記錄的位置,系統自動計算
Entries_Present : Int; // 能存儲的最多數據的記錄
Current_Record : Int; // 當前執行的記錄編號
Record_DB_Nr : Int; // Link下面鏈接的其他數據DB塊編號
s_Done : Bool; // 用於指示該數據塊正在被調用
DB_nr_Record :"UDT_Record_Nr";
Link : Array[1..100] of "UDT_Link";
END_STRUCT;
END_DATA_BLOCK
03 數據處理邏輯
數據關係的基本原則:一致性,同步性;
圖4 數據邏輯關係圖
優先性:數據關係中Link是核心要素,當收到新的Link生成請求後,只有在分配新的Link才能基於此Link生成其他Record(TIF/TST/TSD),即Link在數據管理中是最高級別的;
注:Link分配過程必須檢測分配的編號是否被佔用,若佔用則必須重新分配;
同步性:當系統請求刪除Link時候,必須先刪除TIF/TST/TSD成功後才能將Record鏈接的Link的數據刪除;
一致性:TIF/TST/TSD數據中的Link必須一致且三者的編號必須與Link中的相關Record號碼一致;
詳細的邏輯流程詳見下圖所示:
圖5 數據管理(生成/刪除)邏輯圖
04 控制系統框架以及實現
基於模塊化,標準化思維,PLC程序主要分爲三個模塊:數據管理、設備控制以及通信(WMS/WCS)程序。
位置編碼是一種位置編碼與位置實際位置值之間轉換的算法,該算法是爲控制系統中的三個模塊提供算法支持的。
圖6 堆垛機控制系統結構圖
4.1 通信程序(WMS/WCS)
堆垛機的控制都是基於WMS/WCS的任務信息,所以PLC首要任務是和WMS/WCS建立通信鏈接並接收WMS/WCS的任務指令,這就是PLC控制系統中的通信模塊程序的任務。
此模塊程序將WMS/WCS的任務解析爲通俗易懂的數據,利用位置編碼算法將任務中的位置編碼轉換爲用於控制算法的實際距離值,最終將這些數據分別存放在數據管理模塊中的TIF以及TSD序列中。
4.2 數據管理
數據管理模塊主要有以下幾項任務:
任務執行前檢查並確保該任務的正確性,不正確的任務數據應該得到清除或其他方式給予恰當處理。
監視當前任務的執行狀態,基於任務的狀態向WMS/WCS系統發送恰當的狀態反饋,比如任務完成信息,任務中斷信息或者設備故障等狀態信息。
當前任務執行完成後基於任務優先級搜索任務序列中的有效任務並將其激活爲當前任務。
設備控制
堆垛機的設備控制主要爲三個方向的位置定位控制,數據管理模塊會根據任務執行狀態實時更新位置信息並反饋到驅動控制器用於指導設備的位置及精度的控制。
設備運行過程中信息,包括設備的狀態,故障、某些邏輯的算法故障、當前任務的執行情況(完成、中斷或者暫停等)會實時寫入數據管理模塊,控制系統通過數據管理模塊將有效的信息(任務狀態,設備狀態等)反饋到WMS/WCS用於整個存儲系統的數據分析,同時控制系統也會通過恰當的方式(比如HMI,SCADA)實現與操作者的人機信息交互。
05 結束語
基於數據管理的控制技術中管理的數據類型是倉儲物流控制系統的全部的數據,能實現堆垛機的全過程的信息化管理。該數據管理模式關注了每一個任務的全過程數據,對於信息化管理要求高的企業也能滿足其要求。對於客戶的任務信息化的要求,只要在設計階段定義好數據的發送點以及數據的內容,PLC能實時的將任務過程中的全部信息(任務信息、設備信息)從數據管理模塊收集起來併發送到指定設備。
同時,應用該技術可以讓WMS/WCS系統專注於數據的管理,對於設備控制層面的過程管理只需要和PLC做好相應的信息接口,這樣WMS/WCS系統能更專業,快速地處理數據並實現專業分工。