戰(zhàn):從AGV調(diào)度框架到工廠(chǎng)建模與訂單調(diào)度落地)
簡(jiǎn)介openTCS 5.9中文版用戶(hù)手冊(cè)是一份面向AGV調(diào)度系統(tǒng)開(kāi)發(fā)者、實(shí)施工程師和物流自動(dòng)化運(yùn)維人員的中文技術(shù)文檔。資源基于Apache License 2.0的開(kāi)源運(yùn)輸管理系統(tǒng)openTCS詳細(xì)解說(shuō)如何通過(guò)控制臺(tái)、運(yùn)輸任務(wù)管理器與車(chē)輛控制器完成車(chē)輛調(diào)度與任務(wù)分發(fā)幫助讀者理解工廠(chǎng)建模中的點(diǎn)、路徑、位置、車(chē)輛、塊、圖層等核心概念。壓縮包僅含1個(gè)PDF文件大小約13.31MB便于閱讀與檢索已有595人學(xué)習(xí)下載。手冊(cè)內(nèi)容覆蓋系統(tǒng)要求、許可與支持機(jī)制、系統(tǒng)概述及操作指南并整理了常見(jiàn)問(wèn)題與解決方案既適合初次接觸openTCS的入門(mén)者建立整體認(rèn)知也能為已有實(shí)施經(jīng)驗(yàn)的用戶(hù)提供配置與排錯(cuò)參考從而提升AGV調(diào)度與物流作業(yè)效率。1. 開(kāi)箱不是即用openTCS 是 AGV 調(diào)度框架不是“下載即控車(chē)”的成品openTCS 是一套開(kāi)源 AGV 調(diào)度系統(tǒng)在同類(lèi) RCS 系統(tǒng)Robot Control System里它最大的特點(diǎn)是強(qiáng)調(diào)“通用框架”而不是“成品軟件”。我最初接手某個(gè)跨平臺(tái)系統(tǒng)的調(diào)度改造時(shí)也以為是裝完就能看到小車(chē)間地圖上車(chē)跑來(lái)跑去結(jié)果第一次啟動(dòng)才發(fā)現(xiàn)它沒(méi)有車(chē)輛驅(qū)動(dòng)、沒(méi)有默認(rèn)地圖甚至連“車(chē)”的概念都需要你通過(guò)工廠(chǎng)模型去定義。它的價(jià)值在于把車(chē)輛路由、訂單分配、車(chē)隊(duì)交通管理這些 AGV 調(diào)度系統(tǒng)的核心底層邏輯先實(shí)現(xiàn)好讓你不用從零造輪子但你必須為它補(bǔ)上通信適配器、模型和策略。這份 5.9 中文版用戶(hù)手冊(cè)就是補(bǔ)這些“落地”動(dòng)作的最佳索引。適合正在選型或已經(jīng)決定用 openTCS 控制 AGV 車(chē)隊(duì)的從業(yè)者也適合想把調(diào)度系統(tǒng)摸透的開(kāi)發(fā)者。2. 讀透系統(tǒng)結(jié)構(gòu)與工廠(chǎng)模型五大進(jìn)程、四類(lèi)要素和它們的邊界2.1 內(nèi)核與三類(lèi)客戶(hù)端誰(shuí)負(fù)責(zé)“腦子”誰(shuí)負(fù)責(zé)“手腳”openTCS 的系統(tǒng)結(jié)構(gòu)比一般的單體軟件要復(fù)雜一層。它采用客戶(hù)端-服務(wù)器架構(gòu)所有核心邏輯集中在內(nèi)核Kernel這個(gè)獨(dú)立進(jìn)程中。內(nèi)核負(fù)責(zé)三件事維護(hù)工廠(chǎng)的抽象行駛模型、管理運(yùn)輸訂單、為車(chē)輛規(guī)劃路線(xiàn)。這三件事里“抽象行駛模型”最容易被新手忽略——它不是你在編輯器里畫(huà)的五顏六色的地圖而是由點(diǎn)、路徑、位置、車(chē)輛組成的純邏輯拓?fù)滠?chē)輛在地圖上跑實(shí)際是在這個(gè)拓?fù)渖献鰻顟B(tài)遷移??蛻?hù)端則有三個(gè)標(biāo)準(zhǔn)角色。模型編輯器用來(lái)“畫(huà)地圖”也就是建工廠(chǎng)模型操作臺(tái)用來(lái)“看現(xiàn)場(chǎng)”可視化工廠(chǎng)運(yùn)行狀態(tài)并交互式地下發(fā)運(yùn)輸訂單內(nèi)核控制中心常簡(jiǎn)稱(chēng) KCC則是內(nèi)核的“檢修儀表盤(pán)”它負(fù)責(zé)把車(chē)輛驅(qū)動(dòng)通信適配器掛載到具體車(chē)輛上并能查看底層通信報(bào)文。三者都是獨(dú)立進(jìn)程可以分散在不同的機(jī)器上運(yùn)行手冊(cè)第六章專(zhuān)門(mén)講了跨機(jī)器部署的注意事項(xiàng)這為現(xiàn)場(chǎng)部署提供了很大靈活性但也意味著你調(diào)試時(shí)要多考慮一層網(wǎng)絡(luò)連通性問(wèn)題。如果要用 Java 以外的系統(tǒng)對(duì)接openTCS 內(nèi)核還提供 RMI 接口和一套 Web API后者可以便捷地創(chuàng)建和撤銷(xiāo)運(yùn)輸訂單、訂閱訂單狀態(tài)更新。常見(jiàn)的做法是倉(cāng)庫(kù)管理系統(tǒng)通過(guò) Web API 把任務(wù)單推送給 openTCS而不是人坐在操作臺(tái)前手工點(diǎn)按鈕。這也是為什么我說(shuō)它是“框架”而非“成品”——它把主骨架給你接縫處留給你去對(duì)接。2.2 點(diǎn)、路徑、位置、車(chē)輛一張表拆完建模要素工廠(chǎng)模型是 openTCS 的靈魂但它的要素其實(shí)非常克制核心就四類(lèi)再加上塊、圖層等輔助要素。我建議你在建模前先用下面這張表把概念對(duì)齊否則后面很容易把“點(diǎn)”和“位置”混為一談。要素核心屬性典型誤區(qū)點(diǎn)類(lèi)型停靠位置/報(bào)告位置/停車(chē)位置、坐標(biāo)、車(chē)輛方向角把報(bào)告位置當(dāng)成可??康哪康牡貙?dǎo)致無(wú)法路由路徑長(zhǎng)度、最大行進(jìn)速度、最大倒車(chē)速度、鎖定標(biāo)志、外設(shè)操作序列忽略長(zhǎng)度和速度參數(shù)路由成本算不準(zhǔn)位置類(lèi)型、鏈接點(diǎn)集合、鎖定標(biāo)志、外設(shè)映射位置沒(méi)有鏈接到至少一個(gè)點(diǎn)車(chē)輛無(wú)法到達(dá)車(chē)輛四檔電量閾值、最大速度、集成級(jí)別忘記設(shè)置集成級(jí)別車(chē)輛一直處于“忽略”狀態(tài)點(diǎn)是最基本的邏輯映射。它有三類(lèi)其中“停車(chē)位置”是車(chē)輛在無(wú)訂單時(shí)可以長(zhǎng)期??康狞c(diǎn)“??课恢谩笔翘幚碛唵螘r(shí)臨時(shí)??康狞c(diǎn)“報(bào)告位置”則只是個(gè)過(guò)路上報(bào)點(diǎn)車(chē)輛不會(huì)被命令到那里也不允許在那停車(chē)。如果你建了一條只由報(bào)告位置組成的路線(xiàn)路由器會(huì)直接判定無(wú)法路由因?yàn)檐?chē)輛沒(méi)有落腳點(diǎn)。點(diǎn)的車(chē)輛方向角也要注意0 度在 3 點(diǎn)鐘位置正值表示順時(shí)針旋轉(zhuǎn)這和很多 CAD 坐標(biāo)系習(xí)慣相反建模時(shí)容易順手寫(xiě)錯(cuò)。位置和點(diǎn)是兩個(gè)完全不同的東西。點(diǎn)位是車(chē)輛在拓?fù)渲械倪壿嬘成湮恢脛t是標(biāo)記車(chē)輛可以執(zhí)行特殊操作裝卸貨、充電、開(kāi)防火門(mén)的地理概念。每個(gè)位置至少要鏈接到一個(gè)點(diǎn)車(chē)輛才能到達(dá)位置類(lèi)型定義了這個(gè)位置允許的車(chē)輛操作和外設(shè)操作。路徑外設(shè)操作部分運(yùn)行觸發(fā)器支持 BEFORE_MOVEMENT 和 AFTER_MOVEMENT 兩種取值配合完成要求標(biāo)志——如果要求在路徑前完成外設(shè)操作且標(biāo)志為 true車(chē)輛就得在路徑源點(diǎn)等如果要求在路徑后完成就得在目的地等。這個(gè)機(jī)制非常適合閘機(jī)、自動(dòng)門(mén)這類(lèi)需要和車(chē)輛互鎖的場(chǎng)景。2.3 塊、圖層與通用屬性被多數(shù)人跳過(guò)但遲早要用的三個(gè)旋鈕塊是用于限制車(chē)輛活動(dòng)范圍的地理區(qū)域調(diào)度scheduler在分配資源時(shí)會(huì)考慮塊約束避免車(chē)輛駛?cè)霙_突區(qū)域。圖層和圖層組則純粹是為了組織和顯示——你可以把行駛路徑放在基層把停車(chē)位放在上層顯示時(shí)自由開(kāi)關(guān)不會(huì)污染模型本身的邏輯。真正值得花時(shí)間理解的是通用屬性機(jī)制。每個(gè)模型要素都支持“唯一名稱(chēng)”和“通用屬性”通用屬性本身沒(méi)有固定含義完全由項(xiàng)目自己定義。手冊(cè)第六章也提到可以用模型要素屬性保存特定于項(xiàng)目的數(shù)據(jù)比如某個(gè)點(diǎn)對(duì)應(yīng)的 PLC 地址、某個(gè)車(chē)輛負(fù)責(zé)的產(chǎn)線(xiàn)編號(hào)。這其實(shí)是一個(gè)很聰明的擴(kuò)展點(diǎn)不需要改內(nèi)核代碼就能把業(yè)務(wù)元數(shù)據(jù)塞進(jìn)模型里供自己的客戶(hù)端讀取。3. 動(dòng)手跑通一個(gè)運(yùn)輸訂單模型編輯、內(nèi)核啟動(dòng)與撤銷(xiāo)操作3.1 構(gòu)建工廠(chǎng)模型從添加點(diǎn)到復(fù)制布局坐標(biāo)構(gòu)建模型的入口是模型編輯器。啟動(dòng)前請(qǐng)確保已安裝 JRE 13 并且 JRE 的 bin 目錄已加入環(huán)境變量 PATH否則發(fā)行版自帶的啟動(dòng)腳本可能找不到 java。手冊(cè)特意警告部分商業(yè) JRE 發(fā)行版與內(nèi)置的界面庫(kù)存在兼容問(wèn)題建議優(yōu)先選用社區(qū)維護(hù)版 JRE。我一般會(huì)在部署文檔里把這一步放在最前面因?yàn)樗芙忉尩艉竺嬉淮蠖涯涿畹膯?dòng)失敗。啟動(dòng)編輯器后右鍵空白處即可添加點(diǎn)。先別急著連路徑我建議按這個(gè)順序梳理添加點(diǎn)并設(shè)置類(lèi)型。默認(rèn)是??课恢眠@是最安全的起點(diǎn)。把裝卸貨、充電位置設(shè)為停靠位置把車(chē)輛長(zhǎng)期待命的地方設(shè)為停車(chē)位置。連接路徑。選中兩個(gè)點(diǎn)拉出路徑并在屬性面板中填寫(xiě)長(zhǎng)度、最大行進(jìn)速度、最大倒車(chē)速度。長(zhǎng)度是路由成本計(jì)算的重要輸入實(shí)測(cè)中很多生產(chǎn)模型這里的數(shù)值都拍腦袋填導(dǎo)致系統(tǒng)算出的“最短路徑”和實(shí)際時(shí)間對(duì)不上。添加位置并鏈接到點(diǎn)。位置必須鏈接到至少一個(gè)點(diǎn)否則調(diào)度程序無(wú)法把車(chē)輛引導(dǎo)過(guò)去。用圖層組織顯示。比如把路徑放在“行駛層”把停車(chē)位放在“停車(chē)層”。這樣后續(xù)運(yùn)維時(shí)看圖會(huì)清爽很多。保存工廠(chǎng)模型然后加載到內(nèi)核中。這里有一個(gè)繞不開(kāi)的坑布局坐標(biāo)系與模型坐標(biāo)系。布局坐標(biāo)只決定編輯器里的顯示位置模型坐標(biāo)才是真正發(fā)送給車(chē)輛的數(shù)據(jù)。如果你在編輯器里拖動(dòng)了點(diǎn)的顯示位置模型坐標(biāo)不會(huì)跟著變。要同步可以全選后用全局菜單里的“將模型值復(fù)制到布局”或只對(duì)單個(gè)要素右鍵操作。我見(jiàn)過(guò)有人現(xiàn)場(chǎng)把模型坐標(biāo)手動(dòng)改錯(cuò)了車(chē)輛在實(shí)際場(chǎng)地里直奔?jí)Ρ谶@種錯(cuò)誤只能靠這步同步操作來(lái)避免。3.2 啟動(dòng)內(nèi)核與掛載車(chē)輛驅(qū)動(dòng)通信適配器是繞不開(kāi)的一環(huán)模型建好后啟動(dòng)內(nèi)核再用操作臺(tái)連接。內(nèi)核啟動(dòng)前需要確認(rèn)車(chē)輛驅(qū)動(dòng)已經(jīng)就緒。openTCS 本身不包含任何真實(shí)車(chē)輛的通信協(xié)議實(shí)現(xiàn)——這是新手最容易誤判的地方。它通過(guò)“通信適配器”把內(nèi)核抽象接口轉(zhuǎn)成你的車(chē)輛能懂的報(bào)文類(lèi)似于操作系統(tǒng)里的設(shè)備驅(qū)動(dòng)。所以實(shí)際項(xiàng)目中要么車(chē)輛廠(chǎng)商提供適配器要么自己開(kāi)發(fā)要么先用虛擬車(chē)輛頂替來(lái)聯(lián)調(diào)流程。常見(jiàn)的啟動(dòng)流程是分別啟動(dòng)內(nèi)核、模型編輯器或操作臺(tái)# 確保 JRE 13 已經(jīng)可用 export PATH/path/to/jdk-13.0.2/bin:$PATH # 進(jìn)入 openTCS 發(fā)行目錄按順序啟動(dòng)內(nèi)核和客戶(hù)端 ./startKernel ./startModelEditor ./startOperationsDesk 這里的讓進(jìn)程在后臺(tái)運(yùn)行避免終端阻塞。PATH 變量決定了啟動(dòng)腳本能否找到 java如果經(jīng)常遇到“找不到或加載主類(lèi)”的錯(cuò)誤先檢查這一句配置。發(fā)行版的腳本命名通常是 startKernel.sh 這類(lèi)而內(nèi)核控制中心則負(fù)責(zé)把驅(qū)動(dòng)掛載到指定車(chē)輛上——在 KCC 的車(chē)輛視圖中你可以把某個(gè)適配器分配給某輛車(chē)并監(jiān)視它們之間的通信狀態(tài)。3.3 創(chuàng)建與撤銷(xiāo)運(yùn)輸訂單操作臺(tái)與外設(shè)作業(yè)的閉環(huán)當(dāng)車(chē)輛驅(qū)動(dòng)狀態(tài)變成可用后就可以在操作臺(tái)創(chuàng)建運(yùn)輸訂單了。運(yùn)輸訂單的核心是告訴系統(tǒng)“讓某輛車(chē)或任意車(chē)輛把某個(gè)位置的負(fù)載搬到另一個(gè)位置”。操作臺(tái)支持手工創(chuàng)建單條訂單也支持連續(xù)創(chuàng)建一批訂單運(yùn)輸訂單序列可以把多個(gè)訂單按順序壓入隊(duì)列適合連續(xù)搬運(yùn)場(chǎng)景。撤銷(xiāo)訂單同樣在操作臺(tái)完成。這個(gè)功能在調(diào)試階段幾乎是后悔藥——訂單發(fā)錯(cuò)了、車(chē)輛卡住了、路線(xiàn)被鎖了都可以先撤銷(xiāo)再重發(fā)。需要注意的是撤銷(xiāo)訂單和暫停車(chē)輛是兩個(gè)動(dòng)作撤銷(xiāo)是對(duì)訂單本身操作暫停是對(duì)車(chē)輛的狀態(tài)操作兩者不要混淆。車(chē)輛運(yùn)行中可以從運(yùn)行系統(tǒng)移除也可以暫停和恢復(fù)手冊(cè)里都有對(duì)應(yīng)菜單但我在現(xiàn)場(chǎng)的習(xí)慣是先暫停再撤銷(xiāo)訂單最后移除驅(qū)動(dòng)避免系統(tǒng)在移除過(guò)程中還在派單。外設(shè)作業(yè)是另一個(gè)獨(dú)立通道。它和運(yùn)輸訂單并行運(yùn)作面向的是與位置映射的外設(shè)設(shè)備比如充電樁、自動(dòng)門(mén)。外設(shè)作業(yè)的執(zhí)行需要經(jīng)過(guò)默認(rèn)外設(shè)作業(yè)調(diào)度程序的路由有一個(gè)“預(yù)留令牌”機(jī)制——同一時(shí)間一個(gè)外設(shè)只能被一個(gè)作業(yè)占用。排障時(shí)如果發(fā)現(xiàn)外設(shè)作業(yè)一直排隊(duì)先看令牌是不是被別的作業(yè)占著這是新手最容易頭暈的地方。4. 默認(rèn)策略的邏輯調(diào)度、路由、資源分配與外設(shè)令牌如何協(xié)同4.1 默認(rèn)調(diào)度程序車(chē)輛空閑、低電、遠(yuǎn)行時(shí)的三個(gè)選擇調(diào)度這個(gè)英文詞在 openTCS 里有兩個(gè)層級(jí)很容易混淆。一個(gè)是 dispatcher負(fù)責(zé)“把運(yùn)輸訂單分配給合適的車(chē)輛”另一個(gè)是 scheduler負(fù)責(zé)“為車(chē)輛的行駛過(guò)程分配資源、避免碰撞”。為了講清楚我分開(kāi)說(shuō)。默認(rèn) dispatcher 處理三個(gè)典型決策沒(méi)有訂單時(shí)車(chē)輛去哪、低電量時(shí)車(chē)輛去哪、有多輛車(chē)可選時(shí)優(yōu)先派哪輛。沒(méi)有訂單時(shí)dispatcher 會(huì)讓車(chē)輛去默認(rèn)停車(chē)位置這是模型的停車(chē)位置之一可以設(shè)置優(yōu)先級(jí)去選擇更優(yōu)的停車(chē)點(diǎn)。電量方面車(chē)輛有四個(gè)電量閾值臨界、良好、完全充電、充分充電dispatcher 會(huì)依據(jù)這些閾值決定車(chē)輛何時(shí)必須充電、何時(shí)可以停止充電。你可以在車(chē)輛屬性里按實(shí)際電池特性配置這四個(gè)值不要照搬示例參數(shù)。4.2 路由器與成本函數(shù)距離之外還有速度和鎖定默認(rèn)路由器用于尋找最佳路線(xiàn)。它的成本函數(shù)并不只取決于路徑長(zhǎng)度路徑的最大行進(jìn)速度和最大倒車(chē)速度同樣會(huì)進(jìn)入計(jì)算。這在真實(shí)場(chǎng)景中很關(guān)鍵——兩條路物理長(zhǎng)度相同但一條限速 0.5m/s另一條限速 1.5m/s路由器會(huì)傾向于選后者。路徑的鎖定標(biāo)志則會(huì)在計(jì)算路由時(shí)直接禁用該路徑適合在封閉施工、故障維護(hù)時(shí)臨時(shí)屏蔽路段。另外路由組是給特殊車(chē)輛用的約束機(jī)制。你可以把一組路徑劃入某個(gè)路由組并配置某輛車(chē)只走這個(gè)路由組內(nèi)的路徑實(shí)現(xiàn)“大車(chē)走大路、小車(chē)走小路”的隔離效果。這在混合車(chē)隊(duì)場(chǎng)景下非常實(shí)用默認(rèn)實(shí)現(xiàn)也完全支持這類(lèi)用法。4.3 調(diào)度scheduler的公平性防碰撞與資源釋放時(shí)機(jī)資源調(diào)度解決的是交通管理問(wèn)題核心是避免車(chē)輛相撞。scheduler 為車(chē)輛分配路徑和點(diǎn)區(qū)域等資源并決定何時(shí)釋放。默認(rèn)實(shí)現(xiàn)的公平性策略很重要它保證長(zhǎng)期執(zhí)行的調(diào)度不會(huì)讓某輛車(chē)一直被餓死即不會(huì)因?yàn)椴糠周?chē)輛頻繁占用資源導(dǎo)致其他車(chē)輛永遠(yuǎn)無(wú)法通過(guò)。如果你在調(diào)試中發(fā)現(xiàn)某些車(chē)輛長(zhǎng)時(shí)間停在原地不動(dòng)但系統(tǒng)沒(méi)有任何報(bào)錯(cuò)優(yōu)先級(jí)和資源釋放時(shí)機(jī)是最先要懷疑的兩個(gè)點(diǎn)。外設(shè)作業(yè)調(diào)度程序也有一套自己的調(diào)度機(jī)制這里再次出現(xiàn)“令牌預(yù)留”。外設(shè)作業(yè)在執(zhí)行前會(huì)先預(yù)留外設(shè)令牌令牌拿不到就排隊(duì)等待。這其實(shí)是在運(yùn)輸訂單調(diào)度之外又加了一層外設(shè)資源的仲裁避免兩輛車(chē)同時(shí)要求同一個(gè)充電樁或同一扇防火門(mén)動(dòng)作。調(diào)試時(shí)遇到外設(shè)作業(yè)“隊(duì)伍很長(zhǎng)但一動(dòng)不動(dòng)”先去看令牌是否被某個(gè)異常作業(yè)占用。5. 配置邊界與避坑排查5.9 手冊(cè)里最容易被略讀的 8 個(gè)細(xì)節(jié)5.1 四個(gè)高頻踩坑記錄現(xiàn)象、原因與解決我在用 openTCS 搭調(diào)度環(huán)境時(shí)翻過(guò)不少車(chē)下面四條最具代表性都來(lái)自實(shí)際排障過(guò)程。坑一啟動(dòng)腳本閃退日志出現(xiàn)界面庫(kù)相關(guān)異?,F(xiàn)象執(zhí)行 startKernel 后進(jìn)程立刻退出日志里拋出一段和內(nèi)置界面庫(kù)Docking Frames相關(guān)的異常。原因使用了與 openTCS 不兼容的 JRE 發(fā)行版。手冊(cè)在系統(tǒng)要求里專(zhuān)門(mén)警告過(guò)部分商業(yè) JRE 與 openTCS 依賴(lài)的界面庫(kù)存在兼容限制不是所有 Java 環(huán)境都能直接跑。解決換用社區(qū)維護(hù)版 JRE 13并把 JRE 的 bin 目錄加入 PATH。這類(lèi)問(wèn)題不是代碼問(wèn)題而是運(yùn)行時(shí)環(huán)境選型問(wèn)題換環(huán)境通常立竿見(jiàn)影??佣\(yùn)輸訂單被分配了但車(chē)輛走到一半停住不走了現(xiàn)象車(chē)輛領(lǐng)取訂單后開(kāi)始移動(dòng)到了某個(gè)點(diǎn)就不再前進(jìn)操作臺(tái)上也沒(méi)有明確的告警。原因目的地或路徑上的點(diǎn)類(lèi)型配置不當(dāng)。最常見(jiàn)的是把目的點(diǎn)設(shè)成了報(bào)告位置report 點(diǎn)不允許車(chē)輛停靠scheduler 無(wú)法為它分配最終資源另一種情況是位置沒(méi)有鏈接到點(diǎn)車(chē)輛認(rèn)為目的地不可達(dá)。解決在模型編輯器里檢查目的點(diǎn)的類(lèi)型確認(rèn)它是??课恢没蛲\?chē)位置并檢查位置的點(diǎn)鏈接集合保證至少有一個(gè)點(diǎn)與位置關(guān)聯(lián)。改完模型后要重新加載到內(nèi)核??尤诰庉嬈骼锿蟿?dòng)點(diǎn)后車(chē)輛實(shí)際坐標(biāo)全亂了現(xiàn)象操作臺(tái)顯示的地圖布局變了但車(chē)輛到達(dá)的實(shí)際位置和顯示位置對(duì)不上。原因布局坐標(biāo)系和模型坐標(biāo)系沒(méi)有被同步。拖動(dòng)點(diǎn)只改變布局坐標(biāo)為了顯示而調(diào)整了展示視圖模型坐標(biāo)紋絲不動(dòng)。解決選中被拖動(dòng)的要素右鍵菜單選擇“將模型值復(fù)制到布局”或者在全局菜單里做整體同步。這個(gè)動(dòng)作應(yīng)該成為建模流程的常規(guī)收尾步驟??铀耐庠O(shè)作業(yè)一直排隊(duì)沒(méi)有任何執(zhí)行動(dòng)靜現(xiàn)象運(yùn)輸訂單正常但關(guān)聯(lián)的防火門(mén)、充電樁等外設(shè)作業(yè)始終處于等待狀態(tài)。原因外設(shè)令牌被其他作業(yè)占用且未釋放。默認(rèn)外設(shè)作業(yè)調(diào)度程序依賴(lài)令牌預(yù)留機(jī)制令牌被占后后續(xù)作業(yè)只能排隊(duì)。解決檢查占用令牌的作業(yè)在操作臺(tái)撤銷(xiāo)或強(qiáng)制完成它。如果系統(tǒng)里存在僵尸作業(yè)定期清理訂單池能有效避免這類(lèi)問(wèn)題。5.2 配置項(xiàng)地圖內(nèi)核配置、訂單池、SSL 與虛擬設(shè)備手冊(cè)第五章列出的配置項(xiàng)非常多但真正在部署階段需要逐一確認(rèn)的沒(méi)有那么多。我把它們分成四類(lèi)整理了一張配置地圖配置分組作用部署時(shí)的關(guān)注點(diǎn)內(nèi)核配置定義內(nèi)核本身行為如是否自動(dòng)加載模型啟動(dòng)自動(dòng)加載避免人工點(diǎn)擊誤操作訂單池配置管理訂單的存放與清理策略配置周期清理防止完成訂單堆積導(dǎo)致?tīng)顟B(tài)查詢(xún)變慢默認(rèn)調(diào)度程序/路由器/外設(shè)調(diào)度配置調(diào)整公平性、??窟x擇、成本計(jì)算電量閾值、停車(chē)位置優(yōu)先級(jí)、成本函數(shù)權(quán)重SSL 配置客戶(hù)端與內(nèi)核之間的通信加密涉及證書(shū)配置和密鑰庫(kù)跨機(jī)器部署時(shí)必查Web API 與 RMI 配置同樣值得關(guān)注。如果準(zhǔn)備對(duì)接倉(cāng)庫(kù)管理系統(tǒng)Web API 配置項(xiàng)決定服務(wù)端口和鑒權(quán)方式如果現(xiàn)場(chǎng)網(wǎng)絡(luò)環(huán)境復(fù)雜建議先在內(nèi)核控制中心里確認(rèn) RMI 端口能互通再考慮 SSL 加密。RMI 接口和 SSL 配置項(xiàng)往往被忽略但實(shí)際跨機(jī)器部署時(shí)最常見(jiàn)的失敗原因就是端口不通或加密配置不一致。配置項(xiàng)本身不是越多越好。虛擬車(chē)輛配置項(xiàng)和虛擬外設(shè)配置項(xiàng)是調(diào)試時(shí)的寶貴工具沒(méi)有真實(shí)硬件也能完整跑通調(diào)度流程。手冊(cè)第六章也提到了配置虛擬車(chē)輛特征我建議所有新項(xiàng)目在拿到真車(chē)前都用虛擬車(chē)輛先跑一遍把模型和訂單流程調(diào)到穩(wěn)定再說(shuō)。6. 進(jìn)階驗(yàn)證用虛擬車(chē)輛和自動(dòng)啟動(dòng)把部署跑成習(xí)慣6.1 先虛擬車(chē)輛再上真車(chē)啟動(dòng)鏈路驗(yàn)證虛擬車(chē)輛最大的價(jià)值是讓你在干凈的軟件環(huán)境里驗(yàn)證整套調(diào)度鏈路。配置一兩臺(tái)虛擬車(chē)輛加載工廠(chǎng)模型啟動(dòng)內(nèi)核然后在操作臺(tái)創(chuàng)建一個(gè)運(yùn)輸訂單觀(guān)察車(chē)輛是否從起點(diǎn)移動(dòng)到終點(diǎn)。我每次部署新現(xiàn)場(chǎng)都會(huì)做這樣一輪試用啟動(dòng)內(nèi)核確認(rèn)日志無(wú)異常。通過(guò)內(nèi)核控制中心掛載虛擬車(chē)輛驅(qū)動(dòng)。在操作臺(tái)下發(fā)一個(gè)從 A 點(diǎn)到 B 點(diǎn)的運(yùn)輸訂單。觀(guān)察操作臺(tái)地圖上虛擬車(chē)輛的狀態(tài)遷移和位置變化。撤銷(xiāo)訂單確認(rèn)車(chē)輛能回到停車(chē)位置。如果虛擬車(chē)輛能順利完成“建單-派車(chē)-到達(dá)-撤銷(xiāo)”的閉環(huán)再上真車(chē)測(cè)試通信協(xié)議排查范圍就會(huì)立刻縮小到真正的硬件鏈路。6.2 自動(dòng)啟動(dòng)與會(huì)話(huà)收尾對(duì)于現(xiàn)場(chǎng)長(zhǎng)期運(yùn)行的機(jī)器手動(dòng)點(diǎn)按鈕啟動(dòng)每個(gè)進(jìn)程不是一個(gè)專(zhuān)業(yè)做法。手冊(cè)介紹了配置自動(dòng)啟動(dòng)的方法把啟動(dòng)腳本注冊(cè)為系統(tǒng)服務(wù)或用調(diào)度器觸發(fā)并讓內(nèi)核在啟動(dòng)時(shí)自動(dòng)加載指定的工廠(chǎng)模型。我在生產(chǎn)環(huán)境里習(xí)慣把“自動(dòng)加載模型”和“自動(dòng)選擇特定車(chē)輛驅(qū)動(dòng)”寫(xiě)進(jìn)啟動(dòng)流程這樣即使某臺(tái)電腦重啟過(guò)整個(gè)調(diào)度系統(tǒng)也能自行恢復(fù)??鐧C(jī)器部署時(shí)SSL 加密和防火墻端口放行是最耗時(shí)的部分。建議先在不加密的配置下確認(rèn) RMI 和 Web API 能連通再逐層加上加密避免一開(kāi)始就把問(wèn)題復(fù)雜化。從那以后我每次換新環(huán)境部署 openTCS都會(huì)強(qiáng)制自己先走一遍“虛擬車(chē)輛跑滿(mǎn)訂單閉環(huán)、配置自動(dòng)啟動(dòng)、再驗(yàn)證加密通信”的流程這套順序幫我擋掉了大量現(xiàn)場(chǎng)翻車(chē)的可能希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取