機實現(xiàn)虛擬調(diào)試全流程)
做工業(yè)自動化調(diào)試最怕設(shè)備還沒到場、程序就得交付最怕機械沒接線、電氣沒上電寫好的邏輯只能在腦子里跑。我前陣子搗鼓的一套FactoryIO機械手仿真取料程序算是把這個困局撕開了一個口子FactoryIO提供虛擬車間西門子1200寫控制邏輯PLCSIM充當(dāng)虛擬PLC三者一打通機械手取料、搬運、放料、回位整套流程就能在電腦里原原本本跑起來。這篇文章從軟件安裝、IO映射、狀態(tài)機程序編寫到仿真聯(lián)調(diào)、常見故障排查把整個鏈路講透。想練1200又不想整天對著仿真燈發(fā)愁的朋友或者準(zhǔn)備做設(shè)備預(yù)驗收演示的工程師都能從這里拿走一套真正能落地的玩法。1. 項目全貌這套仿真組合到底在模擬什么1.1 為什么是FactoryIO搭配西門子1200先說清楚這套東西的分工。FactoryIO是虛擬設(shè)備層場景里有傳送帶、氣缸、真空吸盤、光電傳感器、限位開關(guān)所有這些都帶IO標(biāo)簽博途TIA是編程層負(fù)責(zé)寫PLC程序PLCSIM是虛擬CPU運行你下載到里面的程序。三者之間的數(shù)據(jù)流是這樣的FactoryIO場景里的傳感器檢測到工件、位置到位會作為輸入信號出現(xiàn)在PLCSIM里程序運算后產(chǎn)生的輸出信號再反過來控制FactoryIO里的氣缸電磁閥、傳送帶電機和真空閥。這種方式和真實設(shè)備調(diào)試的對應(yīng)關(guān)系非常強。你在FactoryIO里按1.2倍速觀察機械手下降、吸料、旋轉(zhuǎn)、放料和站在真設(shè)備前面看動作幾乎一樣唯一的區(qū)別就是不會撞壞機器。PLC程序本身也是真程序?qū)懙?200里就能跑不是那種教學(xué)軟件里的玩具代碼。我為什么推薦這種組合而不是純用仿真燈或者HMI組態(tài)軟件去模擬因為機械動作的時序、傳感器反饋的先后這些必須在有“實體”的場景里才講得清楚。你對著屏幕上的小燈寫互鎖寫出來的程序未必能應(yīng)對真實機械手的到位信號。FactoryIO把到位檢測、真空反饋這些細(xì)節(jié)全都變成了和實物一致的開關(guān)量程序?qū)懗鰜碇苯淤N近現(xiàn)場。1.2 機械手取料場景的工藝路線梳理我這個項目里用的場景是常見的龍門式吸盤搬運結(jié)構(gòu)左邊一條供料傳送帶中央是機械手X軸橫向移動、Y軸垂直升降末端帶一個真空吸盤右邊是放料滑槽。工藝路線不復(fù)雜但每一步都不能少傳送帶啟動把工件送到取料區(qū)取料位光電傳感器檢測到工件傳送帶停止機械手Y軸下降到工件上方吸盤真空閥打開建立真空吸附工件真空反饋信號到位后機械手Y軸上升X軸移動到放料位也有場景是整體旋轉(zhuǎn)180度機械手Y軸下降把工件放到放料臺上真空閥關(guān)閉釋放工件短暫延時后Y軸上升X軸退回取料位進入下一循環(huán)??粗孟窈唵螌嶋H上每個動作之間都有嚴(yán)格的互鎖條件。比如沒有下降到位信號就不能開真空閥沒有真空建立信號就不能上升沒有橫移到放料位就不能下降。這些互鎖在仿真里不加程序看著也能“轉(zhuǎn)”但是一旦拿到真機上機械手大概率會撞得稀里嘩啦。所以仿真項目的價值恰恰在于它逼著你在低成本環(huán)境里把現(xiàn)場該有的安全邏輯全部補齊。2. 環(huán)境搭建從軟件安裝到仿真鏈路打通2.1 版本搭配與安裝順序這套組合的軟件配置我用的是一套經(jīng)過驗證比較穩(wěn)的版本組合直接列出來供參考組件推薦版本說明操作系統(tǒng)Windows 10 64位專業(yè)版兼容性和穩(wěn)定性優(yōu)先TIA PortalV15.1包含Step 7 Professional編程環(huán)境S7-PLCSIMV15.1必須與TIA主版本嚴(yán)格一致FactoryIOv2.4.4自帶Siemens PLCSIM驅(qū)動接口為什么不追最新版因為FactoryIO的PLCSIM驅(qū)動對高版本博途的支持并不是特別好實測下來V15.1是它配合最默契的版本網(wǎng)上的教程和案例也大多基于這一套。用新版本遇到通信問題反而難排查。安裝順序有講究先裝TIA Portal再裝PLCSIM最后裝FactoryIO。PLCSIM安裝時會把自身注冊進TIA的仿真框架FactoryIO安裝時也會檢測系統(tǒng)里已有的TIA環(huán)境來安裝對應(yīng)驅(qū)動。順序反了后面經(jīng)常出現(xiàn)驅(qū)動識別不到的情況。安裝過程有幾個細(xì)節(jié)關(guān)閉殺毒軟件、以管理員身份運行安裝程序、安裝目錄不能有中文路徑。這些不是玄學(xué)是Windows權(quán)限和中文編碼惹出來的實際問題。2.2 FactoryIO場景加載與驅(qū)動配置FactoryIO打開之后場景庫里有很多預(yù)設(shè)場景機械手搬運類的場景名字里一般帶Handler或者Pick and Place字樣。選好后場景直接加載這時候可以先不急著連PLC在場景里按H鍵高亮所有IO部件按F1查看當(dāng)前場景的IO說明表。這一步一定要做因為不同場景傳感器數(shù)量、氣缸編號都不一樣IO映射全靠這張表。驅(qū)動配置的方法是在FactoryIO主界面找到Drivers菜單有些版本在File-Drivers里選中Siemens PLCSIM驅(qū)動。這時候FactoryIO會嘗試連接PLCSIM。連接成功的標(biāo)志是驅(qū)動圖標(biāo)顯示綠色而且場景里的傳感器如果被遮擋或觸發(fā)在IO監(jiān)視窗口里能看到狀態(tài)翻轉(zhuǎn)。有個坑我必須提醒PLCSIM必須在后臺先啟動并且CPU處于RUN狀態(tài)FactoryIO才能連上。很多人先開FactoryIO再開PLCSIM或者PLC沒下載程序處于STOP狀態(tài)結(jié)果驅(qū)動怎么都連不上還以為是軟件裝壞了。2.3 IO映射從虛擬設(shè)備到PLC地址IO映射是整個項目的地基地址填錯了后面程序?qū)懺倨炼际前状睢N乙韵旅孢@套典型映射為例說明真實場景以IO說明表為準(zhǔn)PLC地址方向FactoryIO設(shè)備I0.0輸入取料位工件到位傳感器I0.1輸入吸盤真空檢測開關(guān)I0.2輸入X軸縮回到位取料側(cè)I0.3輸入X軸伸出到位放料側(cè)I0.4輸入Y軸上升到位I0.5輸入Y軸下降到位I0.6輸入旋轉(zhuǎn)左限位取料側(cè)I0.7輸入旋轉(zhuǎn)右限位放料側(cè)Q0.0輸出X軸電磁閥伸出/縮回Q0.1輸出Y軸電磁閥下降/上升Q0.2輸出真空吸盤閥Q0.3輸出旋轉(zhuǎn)電磁閥放料側(cè)Q0.4輸出傳送帶電機映射的時候注意區(qū)分傳感器是常開還是常閉FactoryIO場景里默認(rèn)的是常開但有些傳感器的邏輯在場景配置里可以切換。寫程序之前建議先在FactoryIO手動模式下把機械手移到各個位置觀察對應(yīng)輸入位的狀態(tài)變化確認(rèn)“動作到位1”還是“動作到位0”。這一步花了十分鐘后面能幫你省半天。另外要注意電磁閥類型。雙電控電磁閥是兩個輸出位一個動作一個復(fù)位程序里要分別控制單電控彈簧復(fù)位閥只要一個輸出位得電動作、失電復(fù)位。FactoryIO機械手場景里多數(shù)是雙電控寫程序時直接用“當(dāng)前狀態(tài)輸出”的方式每個掃描周期根據(jù)狀態(tài)字刷新輸出比用置位復(fù)位指令更清晰。3. 程序設(shè)計與核心邏輯實現(xiàn)3.1 狀態(tài)機思路把機械手動作拆成有序狀態(tài)機械手取料這種順序控制流程用狀態(tài)機寫是最合適的。不用狀態(tài)機、全用互鎖線圈也能實現(xiàn)但程序一旦超過十幾行線圈互鎖的可讀性會急劇下降改一個條件牽一發(fā)動全身。狀態(tài)機把整個流程切成獨立的狀態(tài)每個狀態(tài)只管“當(dāng)前該做什么”和“滿足什么條件切到下一個狀態(tài)”邏輯清晰調(diào)試的時候直接看當(dāng)前狀態(tài)值就行。我的狀態(tài)定義如下狀態(tài)值含義進入下一狀態(tài)的觸發(fā)條件0待機傳送帶運行等待工件到位I0.01暫停傳送帶10機械手Y軸下降取料I0.51下降到位20真空閥打開建立真空I0.11真空建立30機械手Y軸上升I0.41上升到位40X軸伸出/旋轉(zhuǎn)至放料側(cè)I0.31放料側(cè)到位50機械手Y軸下降放料I0.5160真空閥關(guān)閉釋放工件延時0.5秒70機械手Y軸上升I0.4180X軸縮回/旋轉(zhuǎn)回取料側(cè)I0.21回到狀態(tài)0狀態(tài)值用10、20、30而不是1、2、3是為了給將來插入新狀態(tài)留空間。比如想在取料下降和吸料之間加一個“下降緩沖”狀態(tài)直接定義狀態(tài)15就行不用改動其他狀態(tài)的編號。3.2 程序塊規(guī)劃OB1、FB與數(shù)據(jù)塊的職責(zé)劃分我在博途里的程序結(jié)構(gòu)是這樣的OB1負(fù)責(zé)主循環(huán)調(diào)用一個FB負(fù)責(zé)機械手核心控制邏輯背景數(shù)據(jù)塊里保存狀態(tài)值和中間變量一個全局DB存IO映像和產(chǎn)量計數(shù)額外的一個FC做報警和超時判斷。這樣劃分的好處是將來如果項目擴展成雙機械手或者多個工位可以直接復(fù)制FB生成新的背景數(shù)據(jù)塊復(fù)用性很強。FB的接口要定義好輸入是各個傳感器信號輸出是各個執(zhí)行機構(gòu)控制字靜態(tài)變量放狀態(tài)機和延時定時器。這里我強烈建議用FB而不是FC因為狀態(tài)機需要的狀態(tài)值、定時器、計數(shù)器這些中間變量FB自帶背景DB管理在線監(jiān)視的時候一目了然。用FC就得自己在全局DB里維護一堆變量改起來麻煩還容易亂。3.3 狀態(tài)機核心代碼參考下面給出狀態(tài)機核心邏輯的SCL寫法把最關(guān)鍵的幾個狀態(tài)展示出來CASE #state OF 0: // 待機傳送帶運行 #out.CvtRun : TRUE; IF #in.PartAtPick THEN #state : 10; #out.CvtRun : FALSE; END_IF; 10: // 取料下降 #out.Y_Down : TRUE; IF #in.Y_DownPos THEN #state : 20; END_IF; 20: // 吸料建立真空 #out.Vacuum : TRUE; IF #in.VacuumOK THEN #state : 30; END_IF; 30: // 取料上升 #out.Y_Down : FALSE; IF #in.Y_UpPos THEN #state : 40; END_IF; 40: // 橫移到放料位 #out.X_Extend : TRUE; IF #in.X_ExtendPos THEN #state : 50; END_IF; ... ELSE #state : 0; END_CASE;輸出處理放在狀態(tài)切換之后統(tǒng)一刷新每個掃描周期結(jié)束時把當(dāng)前狀態(tài)對應(yīng)的輸出組合寫入輸出地址。這樣寫有個好處就是任何時刻程序的輸出都只由當(dāng)前狀態(tài)決定不會出現(xiàn)兩個狀態(tài)互相搶輸出的情況。3.4 時序細(xì)節(jié)為什么真空要等、釋放要延時機械手項目看起來是純邏輯控制實際上時序細(xì)節(jié)藏了很多坑。真空吸盤不是一通電就立刻吸住工件的真空發(fā)生器建立有效真空需要時間所以狀態(tài)20里不能等真空動作一輸出就上升必須等到真空反饋信號到位。同樣的道理放料的時候真空閥關(guān)閉后工件脫離吸盤也需要一個短暫過程如果馬上上升工件可能被吸盤帶起來又摔下去所以我在狀態(tài)60里加了一個0.5秒的延時。這個延時用SCL的TONR比較方便或者在CASE狀態(tài)里用系統(tǒng)時鐘計數(shù)。我的習(xí)慣是在FB里維護一個定時器變量進入狀態(tài)時啟動延時結(jié)束后允許狀態(tài)切換。這樣邏輯清晰而且每個狀態(tài)都可以掛一個超時監(jiān)控后面報警邏輯直接復(fù)用。另外傳感器信號的抖動在仿真里不明顯但你還是要在程序里加去抖處理。比如工件到位信號如果因為傳送帶振動而抖動狀態(tài)機可能在狀態(tài)0和狀態(tài)10之間來回跳傳送帶一停一啟看著像抽搐。處理辦法是給輸入信號加20到50毫秒的確認(rèn)時間信號持續(xù)穩(wěn)定才認(rèn)為有效。4. 仿真聯(lián)調(diào)實操從下載程序到跑通全流程4.1 博途工程配置與下載要點新建博途項目時選擇CPU 1214C DC/DC/DC固件版本選v4.0這個型號和固件版本在PLCSIM下仿真兼容性最好。組態(tài)完成后把前面寫的程序下載到PLCSIM。下載的時候如果提示“模塊未找到”檢查一下博途的PG/PC接口設(shè)置是否選擇了PLCSIM作為目標(biāo)接口。程序下載完成后PLCSIM窗口里CPU應(yīng)該進入RUN狀態(tài)。我習(xí)慣先在PLCSIM里用變量表強制幾個輸入信號比如把I0.0強制為1看程序會不會從狀態(tài)0切到狀態(tài)10把狀態(tài)機的邏輯先單獨驗證一遍。這一步強烈建議做因為如果程序本身有邏輯問題這時候就能發(fā)現(xiàn)不用等到和FactoryIO聯(lián)調(diào)時才手忙腳亂。4.2 FactoryIO聯(lián)調(diào)步驟與完整觀察記錄程序驗證沒問題后回到FactoryIO加載機械手場景選擇Siemens PLCSIM驅(qū)動。連接成功后我在PLC變量表里給M0.0置一個啟動信號機械手開始動作。完整的一個工作循環(huán)觀察到的現(xiàn)象是傳送帶轉(zhuǎn)動一個工件從左側(cè)送到取料位到位傳感器I0.0亮起的同時FactoryIO畫面里傳感器指示燈變綠傳送帶停止機械手Y軸緩緩下降到位后吸盤伸到工件表面真空閥打開視覺上能看到工件被吸起真空反饋I0.1確認(rèn)后機械手上升、橫移到放料側(cè)、下降、放料、返回。計數(shù)器從0變成1一個完整的循環(huán)完成。跑通第一輪之后我沒急著調(diào)速度而是把FactoryIO的系統(tǒng)負(fù)載參數(shù)調(diào)低在慢動作下又跑了幾輪確認(rèn)每個動作的先后順序、到位信號和程序狀態(tài)切換完全一致。這一步很值因為在正常速度下有些信號跳變太快眼睛根本看不出來到底是“到位后切換”還是“提前切換”。4.3 調(diào)試技巧用狀態(tài)值在線監(jiān)視器觀察程序聯(lián)調(diào)過程中最有用的工具就是博途的在線監(jiān)視表格。我把MW10這個狀態(tài)變量加到監(jiān)視列表里PLC運行的時候能看到狀態(tài)值按0、10、20、30、40、50、60、70、80的順序跳變每一步都對應(yīng)一個機械動作。一旦某個狀態(tài)卡住不跳馬上就能定位問題出在哪一步。比如有一次狀態(tài)卡在50不動我看監(jiān)視表里狀態(tài)值是50條件是“下降到位I0.51”一直不滿足。再到FactoryIO畫面里看機械手確實停在放料臺上方但位置就差那么一丁點限位開關(guān)沒觸發(fā)。問題不在程序而在FactoryIO里機械手Y軸的行程設(shè)定。這種情況在真機上就是機械調(diào)整問題仿真里則是場景參數(shù)問題。解決后我對這類問題的排查思路就清晰了先看狀態(tài)值卡在哪再看卡住的條件是什么信號最后再查這個信號為什么沒滿足。5. 常見問題與排查技巧實錄5.1 軟件安裝與通信故障排查仿真項目最磨人的往往不是程序而是環(huán)境問題。我把實際遇到過的幾類典型問題整理一下FactoryIO驅(qū)動連接不上驅(qū)動圖標(biāo)紅色不要急著重裝軟件先按這套順序排查PLCSIM是否已經(jīng)啟動、CPU是否處于RUN狀態(tài)、驅(qū)動選擇是否恰好是Siemens PLCSIM、PLC程序是否已經(jīng)下載到PLCSIM。四個條件都滿足基本都能連上。如果還不行把PLCSIM和FactoryIO都關(guān)掉重啟一遍實測能解決一大半問題。PLCSIM啟動時報版本錯誤這個百分之百是博途和PLCSIM版本不一致造成的。TIA V15.1必須搭配PLCSIM V15.1混裝V16、V17的模塊輕則報錯重則直接打不開。博途的安裝包里有時候會帶對應(yīng)版本的PLCSIM安裝的時候最好不要省這個步驟。5.2 機械手動作異常的排查心得程序?qū)用娴膯栴}比環(huán)境問題更有規(guī)律我把自己踩過的坑和從同事那收集到的典型問題整理成一張速查表現(xiàn)象可能原因排查思路機械手動作到一半卡住不動狀態(tài)機等待條件未滿足先看狀態(tài)值再看對應(yīng)輸入信號是否為1機械手亂跑、動作順序顛倒IO映射錯位對照FactoryIO的IO表逐個核對地址吸盤吸不住工件真空建立時間不夠把狀態(tài)20改為等真空反饋到位后再上升傳送帶工位堆積傳送帶停止邏輯滯后工件到位后要在切換狀態(tài)的同時停止傳送帶計數(shù)重復(fù)增加使用電平信號而非邊沿信號改用傳感器上升沿去觸發(fā)計數(shù)真空閥關(guān)閉后工件被帶起釋放延時不夠狀態(tài)60中加0.3到0.5秒延時再上升傳感器信號抖動、狀態(tài)來回跳信號未去抖輸入加20到50毫秒確認(rèn)時間第三行的“吸不住工件”值得多說一句。最開始我寫的狀態(tài)20是真空閥一輸出就馬上切換去上升結(jié)果機械手上升的時候工件在半空中掉了。后來在讀FactoryIO的傳感器說明時發(fā)現(xiàn)機器手下面有真空檢測開關(guān)程序里需要等待它動作。這個反饋在場景里存在但一開始我根本沒往那個IO地址上想。所以說做項目之前把IO表從頭到尾讀一遍真不是浪費時間。5.3 給新手的調(diào)試建議如果你剛開始接觸這套組合我的建議是調(diào)試節(jié)奏放慢一點不要想著一次跑通。就按照“先軟件連通信再單獨驗證程序邏輯最后FactoryIO和PLC聯(lián)動”的順序走。第一步?jīng)]走通后面全白搭。程序邏輯驗證階段用變量表強制輸入信號比在FactoryIO里手動觸發(fā)傳感器更方便因為你完全控制了信號的時序想讓它什么時候來就什么時候來。還有一個小技巧把FactoryIO的畫面縮小放到副屏博途放到主屏這樣一邊看機械手動作一邊看程序里的變量變化聯(lián)調(diào)效率真的能翻倍。6. 這套方案的擴展價值仿真驗證過的程序能走多遠(yuǎn)6.1 往真機遷移時要注意什么仿真程序遷移到真機核心邏輯基本不用動但有幾個地方必須重新核對。首先是IO表真機上的傳感器類型、接線方式可能和仿真場景不完全一樣NPN還是PNP、常開還是常閉都要逐一確認(rèn)其次是時間參數(shù)仿真里的動作速度是理想化的真機上氣缸的動作時間、吸盤建立真空的時間都不一樣需要現(xiàn)場重新整定最后是安全邏輯仿真環(huán)境里沒有急停、安全門這些硬件真機上必須把相關(guān)的安全回路信號接進程序里。6.2 狀態(tài)機模板還能用在哪些場景這個項目的狀態(tài)機思路不局限于機械手。凡是順序控制類的設(shè)備比如分揀線、裝配臺、升降機核心邏輯都是“按步驟執(zhí)行、每步確認(rèn)到位、異常則報警停機”狀態(tài)機模板可以直接套用。我后來在另一個模擬分揀項目中復(fù)用這套程序框架只改了IO映射和工藝流程兩周時間就把程序?qū)懗鰜聿Ⅱ炞C通過了這個思路的復(fù)用價值我是深有體會。6.3 再玩深一點增加產(chǎn)量統(tǒng)計與人機交互如果只做機械手取料項目已經(jīng)跑通了但仿真練手的機會難得建議再往前走一步。我給這套程序加過幾個小功能成本不高但很有成就感在DB里增加總產(chǎn)量和班產(chǎn)量計數(shù)器用傳送帶啟動信號做統(tǒng)計加一個時間戳變量記錄每個工件的搬運節(jié)拍用來分析流程瓶頸再接一個模擬HMI畫面把狀態(tài)、產(chǎn)量、報警信息顯示出來整個項目看起來就是一個完整的小型自動化系統(tǒng)。最后分享一點個人體會。我第一次做這種仿真聯(lián)調(diào)的時候為了讓程序顯得“高級”把互鎖邏輯寫得特別復(fù)雜結(jié)果動作一亂查了兩天沒查出頭緒。后來老老實實改用狀態(tài)機把流程拆成一個個獨立狀態(tài)每個狀態(tài)只關(guān)心自己的條件和輸出一晚上就全部調(diào)通了。仿真環(huán)境最大的好處就是犯錯成本低機械手撞了、工件掉了都不會造成損失這正是練手最好的機會。如果你也想把PLC編程水平往上提一截從這套機械手仿真取料項目開始把狀態(tài)機的每一步跑明白這個基礎(chǔ)打牢了后面面對再復(fù)雜的設(shè)備心里都會有底。