← 所有文章

FIELD NOTES / PLC 程式與控制

旋轉編碼器計數回捲如何算出正確增量

PLC 程式與控制作者:站長預估 5 分鐘閱讀

用雙向最短差值與半圈前提,驗證編碼器跨零增量、取樣速度及方向不確定情況。

本文目錄

先決定是否允許正反轉

編碼器讀值從4090變6,可能是正轉跨過零點,不一定是倒退4084。反過來從6變4090,也可能是反轉跨零。本篇教你在有限計數範圍內計算有方向的位移,並指出取樣太慢時為什麼無法只靠兩個讀值猜出真實轉動。

先查裝置實際計數模數M、回傳型別、方向定義與每轉計數。本例假設一圈4096個位置,讀值0到4095,正轉遞增、反轉遞減。M是4096,不是最大讀值4095;若分母少一,跨零增量就會算錯。

這與只會增加的累計器不同。單向累計可以在無重置且真增量小於M時用非負模數差;雙向編碼器需要額外證明兩次有效讀取之間的真實有號位移絕對值小於M/2,才可選最短方向的差值。

本例使用數學位移而非特定PLC指令,也不假設所有編碼器都是十二位元。多圈絕對值、增量脈衝計數器、不同解析度和有號回傳格式,各有自己的範圍。先依手冊解出一致的0到M−1位置,再進行本篇算法。

每筆紀錄保留原始位置、時間、資料品質、裝置身份與重置或回原點狀態。來源更換或重新設零時,前後值不一定屬同一座標系,不能看到差值很小就直接累加。

另外要分每轉線數與解碼後計數。有些增量編碼器標示脈衝或線數,接收器可能採不同邊沿倍頻;不能看到銘牌一千就直接假定一圈一千計數。先在受控條件下依手冊核對解碼模式及每轉結果,再決定模數或角度倍率。

用三步計算最短有號差值

第一步在足夠寬的有號型別中算d=new−old。第二步若d大於M/2就減M;若d小於−M/2就加M。第三步對剛好正負半圈的情況標方向不明,不任意選正或負。公式成立仍依賴真實位移小於半圈的前提。

例一old=4090、new=6,原差6−4090=−4084,小於−2048,因此加4096得到+12。路徑可以數成4090到4095走5格,再到0走1格,再到6走6格,合計12,方向為正。

例二old=6、new=4090,原差4084大於2048,減4096得到−12。例三old=100、new=130,原差30在半圈內,結果+30;old=130、new=100則是−30。四組應一起測,不能只測正向跨零。

例四old=0、new=2048,正走2048和反走2048都會到同一位置。若缺少其他方向證據,單靠端點無法決定,應標HalfTurnAmbiguous。本篇不採某個程式庫預設的半圈取捨,避免把演算法慣例誤當現場真實方向。

不要先在十二位或十六位無號型別算new−old,再把回捲結果當成有號差。運算中間範圍至少要容納−4095到4095,修正前後都不能溢位。真正的PLC型別提升與減法行為,依所用指令核對。

算取樣上限以免方向混淆

最短差值只有在兩次讀取間位移小於半圈時才唯一。若實際正轉3000格,從100出發到3100,算法會把差3000修正成−1096;兩個端點不能告訴你它其實走了較長的正方向。這是資訊不足,不是再換一個減法公式就能解決。

用速度上限估計間隔。若每圈4096計數、最高每秒五圈,最高計數率20480格每秒。要使位移嚴格小於2048,間隔必須小於0.1秒;剛好100ms在最壞情況正好半圈,不能作為無歧義保證。

若選50ms取樣,理想最壞位移1024格,仍有餘裕;但通訊延遲或漏讀可能讓實際間隔變成150ms,最壞位移3072格,保證就失效。每次用實際有效樣本間隔檢查,而不是只看設定名義50ms。

若間隔超限,結果標方向不確定並保留前後位置。可縮短取樣、使用硬體累計的有號位置或取得可信的多圈資訊;不能用上一輪方向來強行決定本輪方向,因為設備可能在缺測期間反轉。

即使半圈內的淨位移能正確求得,兩個端點也無法提供期間來回走過的總路程。例如正走100再反走100,淨位移零,總行程200。本文求的是有號淨位移,要統計累積路程需更密集或合適的硬體資訊。

外部資料若有重複、延遲或錯序,也會破壞前後樣本的意義。先依可信來源序號接續,不把較舊回覆當成新的位置;同一筆回覆重送時不要再次計入位移。沒有序號的介面,需以既定請求順序和超時策略避免混接。

完成後的紀錄與排查

驗收表每列寫old、new、M、原差d、修正差、實際dt、速度界限與有效性。應看到4090到6為+12、6到4090為−12、100到130為+30,以及0到2048為不確定。數值與狀態必須一起核對。

若算出一格誤差,先查模數是否誤用最大讀值;若只在跨零時方向反了,查加減M的條件與來源方向約定;若高速才出現反向跳變,查實際讀取間隔和半圈限制。先用raw重算,不要直接對錯誤位移做濾波。

重新設零、回原點、裝置重啟或來源切換時建立新座標世代。第一筆資料只建立基準,不宣稱停機期間位移為零。若要跨重啟接續位置,必須有可核實的保持與座標恢復機制,不能只把上一筆old存起來就算完成。

把位置增量換成角度時,本例每格360/4096度,12格約1.0546875度。若再換線位移,還需機構傳動比與每轉行程;每個倍率只套一次,並記單位。方向正負也要與機械座標一致,不依HMI圖示朝向猜測。

完成後應能說明數值正確的前提,而不只交出一個回捲公式。本文已核算案例。實際編碼器範圍、更新週期與一致快照,需要查目標裝置和介面文件。

離線練習再加入原地不動、方向反轉和超限間隔:一百到一百在正常短間隔下增量零,一百到一百三十再到一百二十的兩步是正三十與負十。若最後一步資料間隔超出速度保證,即使差值只有十也要標不確定,而不是因數字小就放行。

常見問題

問:4090變6為什麼是加12?答:本例模數4096,原差−4084加4096得12,且前提是位移小於半圈。

問:半圈剛好2048可以固定判正轉嗎?答:缺其他可信證據時正反都可能,本例標不確定。

問:前後位置相同是否代表沒動?答:只能說觀測端點相同,期間可能來回或整圈轉動。

問:固定50ms取樣一定夠嗎?答:還要考慮最高速度、實際間隔與漏讀,逐筆確認半圈限制。

參考:NumPy unwrap官方文件,週期與半週期補差的數學概念;本文另行規定半圈歧義,非PLC API。

延伸閱讀