# 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}$$ .
- 只要絕對編碼器位數夠,不存在誤差累積的問題。
- **鏈(條)**式刀庫
- 
- 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?