目前聽起來,應該是存在這個機制,只是有些行為不如預期。 error 相關的東西都在 Error.c 和 速度相關的應該是 `SPEED_TRACK` 這一項,主要就是被用在 `void RunAwaySafe()` ```c=15424 void RunAwaySafe() { if (u_bRunAwayPro) { if (_IQabs(SpeedPID.qErr) > u_qRunAwaySpeed && GetEnableFlag()) { Disable(); SetDriveError(AUSTONE_SPEED_TRACK); } } } ``` 這是一個叫 `u_bRunAwayPro` 功能,如果有開啟,一但error 太大就跳error。`runaway`(失控) 另一個則是 `ErrorCheckByTask()` ```c=9196 if (GetEnableFlag() && ABS(SpeedPID.qErr) > u_qSpeedTrack) { if (++wSpeedCount > DBVALUE(MOTOR_SPEEDTRACKCOUNT).wData && DBVALUE(MOTOR_SPEEDTRACKCOUNT).wData != 0) { SetDriveError(AUSTONE_SPEED_TRACK); wSpeedCount = 0; } } ``` 這裡個差異是有用到database 的數值 `MOTOR_SPEEDTRACKCOUNT`,看起來就是1ms中斷裡,如果速度有N次沒追上(共N\*1ms),就發警報。 ```c=1732 {{500}, _WORD, 51537, STATUSWRITE, 2, 0, 65535, NULL, SetSpeedTrackCount}, //AUSTON_PARAMETER_MOTOR_SPEEDTRACKCOUNT, ``` # 結論 請在新的線段才使用新的速度去做規劃。如果直接把正在走的規劃速度\*N,那一定是會有速度的斷點,導致符合error。