用到狀態(tài)機設(shè)計)
1. 整體設(shè)計思路為什么選擇LabVIEW搭配正運動控制卡先說說我為什么會寫這個話題。在自動化設(shè)備、非標(biāo)產(chǎn)線、視覺定位檢測這類項目里運動控制基本是繞不開的一環(huán)。早期用PLC做脈沖控制寫起來繁瑣改一個工藝動作就要重新理一遍梯形圖。后來接觸了正運動控制卡發(fā)現(xiàn)它把插補、回零、直線圓弧加減速這些底層邏輯都封裝好了上位機只需要下發(fā)指令和讀取狀態(tài)就行開發(fā)效率直接上了一個臺階。那為什么偏偏是LabVIEW說實話行業(yè)內(nèi)用C#、C開發(fā)上位機程序的團隊也很多但LabVIEW在幾個場景下有天然優(yōu)勢第一它自帶大量儀器驅(qū)動和信號處理函數(shù)做數(shù)據(jù)采集、波形分析非常順手第二圖形化編程對“狀態(tài)轉(zhuǎn)移”這類邏輯表達很直觀尤其是配合狀態(tài)機架構(gòu)寫運動流程比純文本代碼更容易維護第三LabVIEW的調(diào)試體驗好可以在運行中直接看某個變量的實時值這一點在調(diào)運動參數(shù)的時候能省特別多時間。我個人的看法是如果你的項目偏重“流程控制數(shù)據(jù)可視化多軸聯(lián)動”正運動控制卡配LabVIEW是很務(wù)實的組合如果偏重復(fù)雜算法或高性能實時運算那還是考慮C或加RT系統(tǒng)更合適。這篇文章我會從環(huán)境搭建、指令調(diào)用、流程設(shè)計、參數(shù)計算到問題排查把完整鏈路捋一遍適合剛?cè)腴T或者正在選型的工程師參考。需要先明確一個概念正運動控制卡到底解決了什么問題。在開發(fā)一個上下料機構(gòu)時我需要的動作包括X軸直線運動到取料位、Z軸下降、真空吸嘴取料、Z軸抬升、X軸運動到放料位、放料。這個流程看起來簡單但要求運動平滑、定位準(zhǔn)確、能隨時急停并且支持多軸協(xié)調(diào)。如果全靠PLC發(fā)脈沖程序量和調(diào)試成本會高很多。而運動控制卡通過板載DSP或FPGA直接管理脈沖輸出、編碼器反饋、原點/限位信號CPU只需要負(fù)責(zé)制定運動計劃和監(jiān)控狀態(tài)整個系統(tǒng)響應(yīng)更快邏輯也更清晰。再說說架構(gòu)方案。常見的控制卡分為PCI/PCIe板卡式、獨立運動控制器、以及帶EtherCAT總線的主站型。板卡式適合插在工控機里成本低適合中小型設(shè)備獨立控制器通過網(wǎng)口/串口通信穩(wěn)定性好適合對實時性要求更高的產(chǎn)線EtherCAT方案則是接線少、擴展性強但成本相對高。我自己用的是PCIe板卡式正運動控制卡搭配LabVIEW做上位機下面所有實操都以這套組合為例展開。2. 核心細(xì)節(jié)解析從接口協(xié)議到數(shù)據(jù)轉(zhuǎn)換很多人拿到控制卡之后第一件事就是裝驅(qū)動、跑Demo這個思路沒問題但很容易忽略最關(guān)鍵的環(huán)節(jié)上位機和控制卡之間的數(shù)據(jù)通道到底是怎么建立的。2.1 動態(tài)庫調(diào)用與指令通道正運動控制卡通常會提供一個DLL動態(tài)庫作為通信接口C/C、C#、LabVIEW、Python都能調(diào)用。LabVIEW里調(diào)用DLL最常用的方式是“調(diào)用庫函數(shù)節(jié)點”也就是Call Library Function Node簡稱CLFN。在LabVIEW中這個節(jié)點位于“函數(shù)選板-互聯(lián)接口-庫與可執(zhí)行程序”下。具體配置上需要注意幾點在CLFN配置窗口的“庫名/路徑”中指定控制卡廠商提供的DLL文件路徑??梢栽O(shè)為相對路徑方便把程序移植到不同電腦上?!昂瘮?shù)名”選擇要調(diào)用的API例如運動控制器初始化函數(shù)、單軸絕對運動函數(shù)、讀取軸狀態(tài)函數(shù)等?!罢{(diào)用規(guī)范”一般選C調(diào)用除非廠商明確說明是stdcall。參數(shù)類型必須和函數(shù)原型的聲明一一對應(yīng)。比如控制卡指令中常見的“軸號”是整數(shù)“位置”是浮點數(shù)double如果類型填錯輕則返回錯誤碼重則直接導(dǎo)致程序崩潰而且這種崩潰在LabVIEW里還不太好定位。我當(dāng)時踩過的一個典型坑是廠商Demo里寫的是32位DLL而LabVIEW安裝成了64位版本調(diào)用時無論如何都返回錯誤。后來把LabVIEW換成32位版本一切正常。所以建議在項目啟動前就確認(rèn)好系統(tǒng)位數(shù)的一致性要么全部用32位工具鏈要么全部用64位。2.2 4字節(jié)數(shù)據(jù)轉(zhuǎn)換與浮點數(shù)解析在運動控制項目中上位機經(jīng)常需要從控制卡讀取編碼器位置、目標(biāo)位置或速度值。這些數(shù)據(jù)在DLL接口中往往以字節(jié)數(shù)組或內(nèi)存地址的形式返回。這時候就涉及一個高頻問題如何把4字節(jié)數(shù)據(jù)轉(zhuǎn)換為浮點數(shù)。先解釋一下IEEE 754標(biāo)準(zhǔn)。單精度浮點數(shù)占用4個字節(jié)包含1位符號位、8位指數(shù)位和23位尾數(shù)位。LabVIEW中的“字符串至字節(jié)數(shù)組轉(zhuǎn)換”函數(shù)可以把讀到的原始字節(jié)變成U8數(shù)組然后通過“Typecast”節(jié)點將4個字節(jié)重組為一個SGL浮點數(shù)。這個操作對應(yīng)C語言里的memcpy不會對數(shù)據(jù)做任何換算只是重新解釋內(nèi)存。具體操作步驟讀取到的數(shù)據(jù)是U8數(shù)組假設(shè)為byte[0]~byte[3]。需要注意字節(jié)序一般控制卡的數(shù)據(jù)是低字節(jié)在前小端模式。如果讀出來的數(shù)值明顯不對可以反轉(zhuǎn)數(shù)組后再轉(zhuǎn)換。將4字節(jié)數(shù)組連接成一個字符串用“字節(jié)數(shù)組至字符串轉(zhuǎn)換”再接“Typecast”目標(biāo)類型選SGL輸出就是對應(yīng)的浮點數(shù)。實際項目中我一般封裝成一個子VI輸入U8數(shù)組和偏移量輸出浮點值這樣在讀取各種軸參數(shù)時可以復(fù)用。類似地如果DLL接口返回的是雙精度浮點數(shù)那就把8個字節(jié)重組為DBL。2.3 中文亂碼與字符串編碼處理另一個容易被忽略但實際很常見的問題向控制卡下發(fā)字符串類指令時如果包含中文路徑或中文注釋存儲到數(shù)據(jù)庫或回讀后經(jīng)常變成亂碼。比如某個項目里要求把工藝配方保存到SQLite配方名是“一號產(chǎn)品”存進去再讀出來就變成了“浜斿彿”。這種問題主要是編碼不一致導(dǎo)致的。LabVIEW默認(rèn)字符串在Windows下一般是ANSI編碼而數(shù)據(jù)庫、外部設(shè)備或Web服務(wù)往往要求UTF-8。解決方法有兩個方向在LabVIEW里調(diào)用“Unicode轉(zhuǎn)換”工具包需要額外安裝或者直接操作字節(jié)先用“字符串至字節(jié)數(shù)組轉(zhuǎn)換”把ANSI轉(zhuǎn)成字節(jié)再按UTF-8規(guī)則重新生成字符串。后一種方式不用裝額外工具包純原生函數(shù)就能搞定推薦優(yōu)先使用。我的習(xí)慣是所有涉及外部交互的字符串統(tǒng)一在接口層完成編碼轉(zhuǎn)換不在業(yè)務(wù)邏輯中混用編碼類型。這樣即使設(shè)備或數(shù)據(jù)庫的編碼規(guī)則變了也只要改動接口層一個子VI不會牽連整個程序框架。3. 實操過程環(huán)境搭建與狀態(tài)機實現(xiàn)3.1 環(huán)境準(zhǔn)備與安裝避坑LabVIEW的安裝本身不算復(fù)雜但有幾個常見錯誤值得提前提醒。安裝過程中如果提示“錯誤1718”或“Error 1718”一般是Windows Installer權(quán)限問題要以管理員身份運行安裝包。安裝路徑建議不要包含中文和空格否則后續(xù)安裝工具包和驅(qū)動時可能找不到路徑。另一個高頻問題是控制卡驅(qū)動和LabVIEW版本不匹配。正運動控制卡廠商一般會提供多個版本的驅(qū)動分32位和64位。如果LabVIEW是64位就需要裝64位的控制卡驅(qū)動如果驅(qū)動裝錯運行例子程序時會提示找不到動態(tài)庫或無法打開設(shè)備。我自己還遇到過一種情況控制卡的PCIe板卡在設(shè)備管理器中顯示正常但上位機程序初始化時總返回錯誤代碼。排查下來發(fā)現(xiàn)是BIOS里禁用了對PCIe端口的“Above 4G Decoding”支持顯卡和運動控制卡同時占用內(nèi)存映射導(dǎo)致沖突。打開這個選項后問題就消失了。如果你也遇到初始化失敗可以先檢查BIOS設(shè)置不要一上來就懷疑板卡硬件。3.2 LabVIEW程序框架狀態(tài)機還是流水線控制卡項目的上位機程序我強烈建議用狀態(tài)機架構(gòu)來組織。這里說的狀態(tài)機不是那種復(fù)雜的狀態(tài)機生成器而是最基本的While循環(huán)移位寄存器條件結(jié)構(gòu)也就是經(jīng)典的生產(chǎn)者消費者模式中的“消費者”。為什么要這么做因為運動控制的流程特征本質(zhì)上就是狀態(tài)遷移空閑→參數(shù)加載→啟動運動→運動中檢測→到位判斷→邏輯結(jié)束或錯誤處理。如果用順序結(jié)構(gòu)堆疊代碼一旦要增加一個“暫停后繼續(xù)”的功能幾乎要重寫整段邏輯。而狀態(tài)機只需要增加一個“暫?!睜顟B(tài)和對應(yīng)的遷移條件改動范圍可控得多。實現(xiàn)方式不復(fù)雜用一個枚舉類型定義所有狀態(tài)比如IDLE、READY、CHECK_PARAM、MOVE_ABS、WAIT_DONE、FINISH、ERROR_HANDLE。While循環(huán)每執(zhí)行一次就根據(jù)當(dāng)前狀態(tài)運行對應(yīng)分支狀態(tài)轉(zhuǎn)移條件寫在條件結(jié)構(gòu)內(nèi)部執(zhí)行完分支后再通過移位寄存器把下一個狀態(tài)傳給下一輪循環(huán)。核心代碼如下用圖形化方式描述“當(dāng)前狀態(tài)”枚舉通過移位寄存器初始化。條件結(jié)構(gòu)根據(jù)狀態(tài)值執(zhí)行對應(yīng)邏輯。分支內(nèi)部調(diào)用控制卡DLL指令。根據(jù)返回結(jié)果或軸狀態(tài)生成“下一狀態(tài)”枚舉。循環(huán)回到第2步直到進入FINISH或IDLE。這種結(jié)構(gòu)的優(yōu)勢在于每一個狀態(tài)對應(yīng)的邏輯都是獨立的調(diào)試時可以直接在前面板放置一個“強制狀態(tài)”控件手動切換狀態(tài)來測試某個分支的代碼排查問題效率非常高。3.3 單軸運動控制指令示例以“絕對定位運動”為例說明LabVIEW里如何通過CLFN調(diào)用控制卡指令。假設(shè)DLL提供的API原型是int ZAux_Direct_Single_Abs(int handle, int axis, float position, float speed, float acc, float dec);意思是以指定速度和加減速讓某個軸運動到一個絕對坐標(biāo)位置。在LabVIEW中對應(yīng)的CLFN配置為返回類型Signed 32-bit Integer參數(shù)1handle控制卡連接句柄Signed 32-bit Integer參數(shù)2axis軸號Signed 32-bit Integer參數(shù)3position目標(biāo)位置Single Precision Float參數(shù)4speed速度Single Precision Float參數(shù)5acc加速度Single Precision Float參數(shù)6dec減速度Single Precision Float調(diào)用成功后返回值一般是0非0則為錯誤碼。這里要注意運動指令是“非阻塞”的也就是說下發(fā)指令后程序會立刻執(zhí)行下一行代碼而不會等軸真正到位。所以實際流程中必須在指令下發(fā)后循環(huán)讀取“軸運動狀態(tài)”參數(shù)等狀態(tài)變?yōu)椤翱臻e”再執(zhí)行下一步。如果你直接把指令一條接一條發(fā)下去電機會出現(xiàn)“還沒走到就被新指令打斷”的亂跳現(xiàn)象。3.4 關(guān)鍵參數(shù)計算速度、加速度與脈沖當(dāng)量很多新手對“速度”“位置”的具體數(shù)值來源很模糊??刂瓶ǖ闹噶顔挝煌ǔ:陀脩粼O(shè)定的單位制有關(guān)。比如你選擇“脈沖單位”模式那么位置就是脈沖數(shù)速度就是每秒脈沖數(shù)。如果你選擇“毫米單位”模式那么位置就是毫米速度就是毫米/秒。驅(qū)動器的細(xì)分、絲杠導(dǎo)程、減速比會共同決定脈沖當(dāng)量。舉個例子步進電機驅(qū)動器設(shè)置為6400細(xì)分也就是電機每轉(zhuǎn)需要6400個脈沖。絲杠導(dǎo)程為10mm減速比為1:1那么每毫米對應(yīng)的脈沖數(shù) 6400 / 10 640 pulses/mm。要求運動速度為100mm/s時對應(yīng)脈沖頻率 100 × 640 64000 Hz 64kHz。加減速時間如果設(shè)定為100ms那么加速度 100mm/s ÷ 0.1s 1000mm/s2換算成脈沖單位就是 1000 × 640 640000 pulses/s2。這些參數(shù)可以在控制卡的上位機配置軟件里先驗證一遍確認(rèn)電機實際運動距離和指令一致后再固化到LabVIEW程序中。我習(xí)慣把脈沖當(dāng)量做成一個可配置項放在參數(shù)文件里方便不同機械結(jié)構(gòu)復(fù)用同一套上位機程序。3.5 多軸協(xié)調(diào)與緩沖運動單軸運動只是基礎(chǔ)實際項目中更常見的是多軸聯(lián)動。比如一個兩軸平臺的圓弧插補或者龍門結(jié)構(gòu)的雙驅(qū)同步。正運動控制卡的優(yōu)勢在于這些插補運算是在板卡上完成的上位機只需下發(fā)目標(biāo)軌跡類型和終點坐標(biāo)中途不需要逐個插補點發(fā)送。LabVIEW中實現(xiàn)兩軸直線插補的基本調(diào)用方式類似單軸只是函數(shù)名變成類似“ZAux_Direct_Line”的接口參數(shù)包含兩個軸的目標(biāo)位置和合成速度。要注意插補運動的速度參數(shù)是“合成速度”不是單軸速度。兩軸同時運行時每個軸的實際速度會依據(jù)軌跡方向的分解比例自動計算。還有一種實用場景是“緩沖運動”提前把多個運動指令寫入控制卡的緩沖區(qū)控制卡按照隊列順序連續(xù)執(zhí)行做到段與段之間幾乎無縫切換。這個功能特別適合連續(xù)軌跡加工如點膠、激光切割能避免“走走停?!痹斐傻墓に囪Υ?。在LabVIEW里實現(xiàn)也不復(fù)雜調(diào)用緩沖寫入函數(shù)把運動指令壓入隊列最后啟動自動執(zhí)行即可。4. 常見問題與排查技巧實錄這部分是我認(rèn)為最有價值的章節(jié)因為很多問題只有在現(xiàn)場調(diào)試時才會遇到官方文檔不一定寫得很清楚。4.1 通信初始化失敗驅(qū)動、位寬、設(shè)備號初始化控制卡時返回錯誤通常是以下幾個方面的問題驅(qū)動沒裝好檢查設(shè)備管理器里是否出現(xiàn)未知設(shè)備或黃嘆號。位數(shù)不匹配LabVIEW、DLL、驅(qū)動三者必須保持一致32位和64位不能混用。設(shè)備號錯誤PCIe板卡的設(shè)備序號可能隨著插槽位置變化需要調(diào)用“掃描設(shè)備”函數(shù)動態(tài)獲取。權(quán)限沖突如果板卡被其他進程占了LabVIEW程序就連接不上。排查建議寫一段最簡單的初始化測試VI只做兩件事掃描設(shè)備→打開第一個設(shè)備→讀取固件版本號→關(guān)閉設(shè)備。如果這個流程跑通說明基礎(chǔ)通道沒問題后面再慢慢擴展功能。4.2 回零動作不準(zhǔn)確回零問題在設(shè)備調(diào)試中很常見?,F(xiàn)象是電機每次都朝著原點方向運動但每次停下來的位置都有偏差或者第一次回零后位置就偏了。原因主要有三類原點開關(guān)信號的濾波參數(shù)沒設(shè)好導(dǎo)致在高速運動時脈沖信號被干擾或丟失。回零速度和接近速度設(shè)置不合理。如果粗找速度太快在碰到原點開關(guān)的瞬間電機慣性太大容易沖過開關(guān)。正運動控制卡一般允許設(shè)置“高速找原點”和“低速找原點”兩個階段推薦粗找到位后再低速反向確認(rèn)。編碼器方向和控制卡邏輯方向相反導(dǎo)致回零完成后位置值反復(fù)跳變。我的解決習(xí)慣是先用手動速度低速驗證原點信號是否能被控制卡正確捕獲再逐步提高速度測試回零重復(fù)精度。如果偏差在允許范圍內(nèi)再固化參數(shù)。4.3 運動過程中的“5021”或“5025”類錯誤碼控制卡的錯誤碼在文檔里一般都有列表但實際調(diào)試中我遇到最多的兩個錯誤是指令在運動過程中被拒絕原因是上一個運動指令還沒有完成。目標(biāo)位置超出正負(fù)限位范圍控制卡直接拒絕執(zhí)行。針對第一個問題程序邏輯上要加入等待軸空閑的循環(huán)針對第二個問題要在下發(fā)指令前檢查目標(biāo)位置是否在軟限位內(nèi)。我習(xí)慣把限位檢查和位置檢查封裝成一個“運動安全檢測”子VI在任何運動指令下發(fā)前統(tǒng)一調(diào)用能有效減少錯誤碼的出現(xiàn)頻率。4.4 數(shù)據(jù)采集卡信號干擾與濾波運動控制項目中常常還有各類傳感器、編碼器信號。如果現(xiàn)場有變頻器或伺服驅(qū)動器干擾問題會非常明顯。一個典型表現(xiàn)是讀到的編碼器位置時不時跳幾個脈沖導(dǎo)致定位精度不穩(wěn)定。處理干擾有幾個實用手段所有信號線使用雙絞屏蔽電纜且屏蔽層單端接地。在LabVIEW里對編碼器讀數(shù)做軟件濾波比如連續(xù)讀取3次取中位值。但要注意運動控制場合引入濾波會帶來相位延遲不適合高速高精度場合只能作為輔助手段??刂瓶ㄝ斎肟谝话阌袛?shù)字濾波功能設(shè)置一個合適的濾波時間和去抖時間能過濾掉大部分毛刺。這個參數(shù)在正運動控制卡的配置工具里可以直接調(diào)整。4.5 上位機程序無響應(yīng)或卡死LabVIEW程序在連續(xù)運行運動控制時偶爾會出現(xiàn)界面卡死、無法急停的情況。原因往往是控制卡的等待循環(huán)占用了過多資源或者DLL調(diào)用出現(xiàn)了阻塞。解決思路把控制卡的數(shù)據(jù)讀取和界面刷新拆成兩個循環(huán)一個高優(yōu)先級專門處理軸狀態(tài)一個低優(yōu)先級刷新前面板控件。急停邏輯不依賴界面事件而是獨立成一個循環(huán)持續(xù)檢測急停按鈕或外部硬件急停信號一旦觸發(fā)就直接調(diào)用停止運動指令。避免在DLL調(diào)用中傳入錯誤的內(nèi)存地址尤其是字符串指針這會導(dǎo)致訪問違例直接崩潰。如果懷疑這一塊可以用LabVIEW自帶的“字符串句柄”轉(zhuǎn)換函數(shù)來標(biāo)準(zhǔn)化字符串參數(shù)。4.6 定時器精度與運動節(jié)拍LabVIEW的默認(rèn)While循環(huán)定時精度在毫秒量級但對于高速運動控制來說軟件定時循環(huán)并不可靠。我見過有人用軟件定時來控制多段運動的切換結(jié)果節(jié)拍不穩(wěn)定而且每臺電腦表現(xiàn)不一致。正確做法是凡是涉及運動狀態(tài)切換的地方都不要依賴PC端定時而是優(yōu)先使用控制卡自帶的緩沖指令或硬件IO。把“什么時候運動”“什么時候停止”這些決策放到控制卡端去執(zhí)行上位機只負(fù)責(zé)流程編排和監(jiān)控。這樣才能保證設(shè)備的節(jié)拍一致性也減少PC負(fù)載。5. 經(jīng)驗總結(jié)與擴展思路5.1 從單機到產(chǎn)線通訊方案選型當(dāng)項目從單臺設(shè)備擴展到小型產(chǎn)線時LabVIEW上位機就不只要面對一塊運動控制卡了。PLC、掃碼槍、視覺相機、MES系統(tǒng)都會接入同一個上位機。這時候通訊方案的選擇會影響后期維護成本。常用的方式包括Modbus TCP、TCP/IP直連、以及MQTT。我試過用LabVIEW做MQTT客戶端對接產(chǎn)線數(shù)據(jù)看板通過調(diào)用第三方MQTT庫把設(shè)備產(chǎn)量、報警信息、當(dāng)前配方編號等數(shù)據(jù)發(fā)布到消息隊列再由看板系統(tǒng)訂閱顯示。整體架構(gòu)清晰而且比傳統(tǒng)OPC方案輕量不少。5.2 界面設(shè)計讓操作員少犯錯運動控制設(shè)備的上位機界面建議遵循“關(guān)鍵參數(shù)顯眼、危險操作二次確認(rèn)、狀態(tài)信息實時可見”的原則。當(dāng)前軸位置和速度使用大號數(shù)字控件方便現(xiàn)場觀察?!凹蓖!薄皬?fù)位”“啟動”按鈕間距拉開顏色區(qū)分明顯。所有會引發(fā)設(shè)備運動的按鈕點擊后應(yīng)彈出確認(rèn)對話框。界面上要有最近一條報警信息及時間戳方便后續(xù)追溯。這些看似細(xì)節(jié)的東西實際調(diào)試和移交時會大大減少溝通成本。5.3 后續(xù)擴展視覺定位與運動控制的閉環(huán)如果你的項目同時用了相機做定位LabVIEW的視覺模塊Vision Development Module可以很方便地與運動控制結(jié)合?;舅悸肥窍鄼C拍照采集圖像→通過圖像處理函數(shù)計算出偏移量→把偏移量轉(zhuǎn)換成控制卡的坐標(biāo)修正值→下發(fā)補償運動指令。這樣整個系統(tǒng)就形成了“視覺引導(dǎo)運動執(zhí)行”的閉環(huán)。要注意的是視覺處理會占用一定時間所以流程設(shè)計上要權(quán)衡“拍照-運算-運動”的時序盡量讓相機在運動過程中并行采集減少節(jié)拍時間。這也是從單機調(diào)試走向復(fù)雜集成項目時必須考慮的優(yōu)化點。5.4 調(diào)試習(xí)慣用日志與腳本輔助驗證最后分享一個個人習(xí)慣我給每個運動控制項目都會加一套調(diào)試日志子VI記錄每一次指令下發(fā)的時間、指令參數(shù)、返回值和當(dāng)前軸狀態(tài)。調(diào)試階段把這些日志輸出到文件可以很直觀地看到運動流程的時序。特別是在排查“奇怪”問題時比如偶發(fā)報警、偶發(fā)位置偏差回看日志往往能更快找到規(guī)律。另外正運動控制卡一般自帶上位機調(diào)試軟件可以手動輸入指令測試電機是否正常。遇到LabVIEW程序邏輯問題我建議先在調(diào)試軟件里驗證指令本身是否正確先排除機械和電氣因素再回來檢查程序。這樣能大大減少排查范圍。從PCB板卡到LabVIEW代碼整個鏈路看起來復(fù)雜但只要抓住“指令通道、狀態(tài)同步、參數(shù)計算、錯誤處理”這四條主線就能把問題控制在一個可控范圍內(nèi)。希望這篇文章能幫到正在做運動控制項目的你。