---
# System prepended metadata

title: cia402 periodic
tags: [CiA402]

---



# 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?

