# cia402 periodic work implement the lack of cia402 * 溢位 > https://github.com/feecat/OpenSML#overflow * abs encoder 會加劇這問題。 * periodic work handle * (partial outdated)(full problem at 2007) * 在2016年的update版本,0x60F2有處理這個問題 * CSP 不吃0x60F2,且只有abs mode所以問題還在。但 drive端可以考慮自己擴展,0x60F2的bit6,7定義還算清楚。 * 一旦有follow, type3的問題就解決了。 # type there are type work in motion. 1. infinite with **relative** distance required only. * 輸送帶 * solution: * truncate half when near numerical boundary. 1. periodic coordinate, infinite, no mechanic ratio. * 沒有機械的比例,比如說,天車是自己用自己的輪子,在完全平坦的軌道上行走。 * 滑車 * problem: 1. if implement through ABS position value `6064`, may overflow, underflow. 這種應用很多,一定要能避免。 2. can abs position of periodic coordinate apply to target postion? * solution: * require zero signal support. 1. periodic coordinate, infinite, **mechanical ratio**. * 和上面最大的差異是由於一環扣一環的都是機構,包括**encoder也是機構**,所以機構間的尺輪比是可以用有理數表示的。所以從最開頭的encoder到最終的機構的關係一定是可以用有理數表示。 - 也就是一定存在某個週期,encoder 轉 n圈,output shaft機構轉m圈,$$n,m \subset \mathbb{N}$$ . - 只要絕對編碼器位數夠,不存在誤差累積的問題。 - **鏈(條)**式刀庫 - ![](https://www.atcgifu.com/archive/images/product/CHS_LC01-1.png) - turn table. - 以**凸輪**或**尺輪**傳動。 - 橢圓軌道線性馬達 - 軌道上直接刻光學尺,轉一圈就會是某個整數的pulse。 - 5軸CNC旋轉軸 - 可能會週期性轉下去。 1. problem: 1. if implement through ABS position value `6064`, may overflow, underflow. 這種應用很多,一定要能避免。 2. can abs position of periodic coordinate apply to target postion? 1. solution: 9. checkout 607b 4. limited range. 1. CNC 2. picker 3. no problem. type1, type2 have no common implement. Therefore, all solution discussed are manucfacture specific. # type1 已知週期性的 增加, 減少 就好。只有要考慮如何用register 分辨目前的type。 # type2 我認為這種工作,原點訊號是**必要**的。 所以 solution 變成是,可以經過signal 時,最好能夠 1. reset encoder: 1. 如果是拿encoder value 直接換算 1. 一般都不行 1. abs positional value 1. 比較可行。 下命令 要不要support abs value,還是只有relative 是另一回事。其實完全是看如何implement cia402,不影響完備性,定義清楚就好。 # type3 這裡應用未來都會以絕對型編碼器替代。問題就是於,abs編碼器位數有限,如何擴展位數,降低成本。 > Truth to remember: 32bit 的counter,可以讓3000RPM motor 轉約2.7 year(depend on encoder pulse per revolution) 這種應用太多了,就算會break cia402 也不惜。 要能擴展,需要假設/條件 * 知道 abs編碼器 overflow value * cia402 無此規範 register,自己的 * 最後一次存到ROM裡的絕對位置,和下一次開機間的誤差足夠小。 * 隱含假設斷電後,位置的移動量很小。 * 有不同的做法 * best: 能夠在**斷電時但完全斷電前**,保存最後的絕對位置座標(flash)。 * may work: 週期性的存值(e.g.3s),只要差距夠小就沒事。 * 更好的方法可能是足夠密集的確認,但是只有在與前值有足夠大的差距(足以影響判斷時)才寫入(減少浪費效能,延長flash壽命)。 * 刀庫cycle < encoder overflow value * 否則會1對多,非function。 如此一來,就能在開機上電時,先把儲存值與abs encoder值相比較,當兩值相差過大時,先將 儲存值/overflow value=y, ans=y\*overflow value +encoder value,if 儲存值~=ans,視為回復成功。 # method 擴展式, 週期(reset)式, relative 式。混合使用。 ## 擴展式 這是指把 datatype 變大來解決(拖延)問題。 這個方法有不少限制。e.g. CSP 限制integer32 ,所以如果在controller 這端做,一定會break 402。 plcopen 則是把問題丟給開發者,REAL 可為 int64_t , double。double 好像是無限的,但是floating point 的精度是離0越遠,精度越少,這和 光學尺的特性不同,如果工作範圍離0很遠,可能浪費光學尺的精度。 用int64+某種reset 機制是大方向。reset其實就是加入週期式 擴展式真正有意義的等在於延伸精度。單圈encoder 變多圈,多圈增加bit 數... 硬體不夠,就先擴展到可容易處理的範圍。 [example code](https://onlinegdb.com/LhK5LIfBO) ## relative relative 式很萬能,但它直接放棄了目前的位置的資料, 0x6064 也變成相對值。 ## periodic method 有一個點,就是user define 的bound 必須是 encoder 的倍數。舉例 chain-tool-magazine。 65536 enc_pulse/enc_cycle \* 5/3 enc_cycle/mot_shaft_cycle \* 70/3 mot_shaft_cycle/chain_cycle \* 1/360 chain_cycle/usr_cycle_deg \=7079.50617284 enc_pulse/usr_cycle_deg 如果這樣直接用是不行的,要想辦法湊成整數。 65536 enc_pulse/enc_cycle \* 5/3 enc_cycle/mot_shaft_cycle \* 70/3 mot_shaft_cycle/chain_cycle \* 9/350 chain_cycle/usr_cycle_deg \=65536 enc_pulse/usr_cycle_deg 這表示要9 個chain_cycle 才被視為 0~350 的一個cycle,0x607B要設 0 和350。顯然精度太低了,一個圓周也就分約39等份左右。 如果改成 65536 enc_pulse/enc_cycle \* 5/3 enc_cycle/mot_shaft_cycle \* 70/3 mot_shaft_cycle/chain_cycle \* 9/(350\*65536) chain_cycle/usr_cycle_deg \=1 enc_pulse/usr_cycle_deg 這是最高精度,9 個chain_cycle 才被視為 0~22937600 的一個cycle,一個圓周分約2548622等份左右。 ## type 3 對於 type3,PP mode 已有periodic reset,CSP 也用60F2 (bit6,bit7)==(1,1)了話,就能填坑,所以週期式是最好的。關於target position 也可用abs。(當然上位機要知道reset overflow point) 硬用擴展式,就implement 6064 expand 在上位機吧。才不break 402,但此時CSP 還是無法指定 overflow value。除非target position 改int64,也break 402。 1. 所以不break了話只能也支援60F2 (bit6,bit7),只是0x607B 的 range設定遠超過實際週期。 2. 或是CSP control word也支援relative 功能。 ## type2 由於reset position 無法確定。有可能指定 e.g. 800 position 結果在795 position 就reset 了。這種情況最好用relative input。然後60f2也要有00功能,才能從0x6064知道有意義的目前位置。control loop 要小心處理。 ## type 1 由於是無限的,relative 才是唯一解。drive 內部自己在接近limit時reset value。此時0x6064就一直overflow。 其他wheel 要follow 驅動輪動作,就要處理該0x6064 overflow 值(int32_t overflow)。 注意,輸送帶通常會加一個encoder feedback,那個要和輸送帶驅動馬達綁在一起。 # ref hdt drive 的增量式 encoder 是在32bit 以前,往負方向轉1就 -1,不考慮底層是不是65535之類的encoder。 不知道碰到underflow?