Sergey1560 / Marlin_FB4S

Marlin 2.0 for Flying Bear 4S/5
GNU General Public License v3.0
220 stars 157 forks source link

Отключается нагреватель во время разогрева pid autotune (m303) FB5 MKS Robin Nano V1.2 #67

Closed code-complete closed 1 year ago

code-complete commented 2 years ago

Обнаружил проблему, что при запуске команды m303 (pid autotune) через WIFI на порт 8080 стабильно выключается нагревать на полпути (и стол и хотэнд), после чего срабатывает защита. Выглядит это все след. образом:

M303 E0 S245 C8 U
PID Autotune start
 T:61.28 /0.00 B:38.13 /0.00 @:127 B@:0
 T:61.25 /0.00 B:38.47 /0.00 @:127 B@:0
 T:61.83 /0.00 B:37.13 /0.00 @:127 B@:0
 T:64.70 /0.00 B:36.68 /0.00 @:127 B@:0
 T:69.36 /0.00 B:37.79 /0.00 @:127 B@:0
 T:74.03 /0.00 B:37.59 /0.00 @:127 B@:0
 T:79.91 /0.00 B:38.79 /0.00 @:127 B@:0
 T:85.74 /0.00 B:37.03 /0.00 @:127 B@:0
 T:92.04 /0.00 B:37.18 /0.00 @:127 B@:0
 T:97.54 /0.00 B:37.21 /0.00 @:127 B@:0
 T:103.90 /0.00 B:38.26 /0.00 @:127 B@:0
 T:109.65 /0.00 B:38.46 /0.00 @:127 B@:0
 T:115.66 /0.00 B:36.95 /0.00 @:0 B@:0
....
 T:113.67 /0.00 B:37.39 /0.00 @:0 B@:0
 T:112.90 /0.00 B:37.41 /0.00 @:0 B@:0
 T:111.91 /0.00 B:35.59 /0.00 @:0 B@:0
 T:110.93 /0.00 B:37.92 /0.00 @:0 B@:0
 T:110.20 /0.00 B:37.24 /0.00 @:0 B@:0
Error:Heating failed, system stopped! Heater_ID: E0
echo:Home XYZ First
echo:Heating Failed
Error:Printer halted. kill() called!

Покопался в интернете, нашел похожую проблему в оригинальном репозитории для v1.x.x. В v2.x.x она тоже пофикшена. Суть проблемы - во время работы m303 вызывается safe_delay при логировании статуса команды через UART. В данном случае подозрение сразу же пало на WIFI-драйвер - попробовал собрать без него, запустил команду по проводу через repetier-host, заработало. После чего поискал вызов этой функции из WIFI-драйвера, критичными оказались два вызова в отправке данных WIFI-модуль. После того как перевел на delay, команда m303 стала работать штатно.

Sergey1560 commented 2 years ago

Спасибо за исследование проблемы. Просто заменить safe_delay на delay думаю будет не совсем безопасно. Собственно разница между ними состоит в том, что safe_delay контролирует температуру во время задержки, а delay нет. В случае, если в буфере не появится свободное место (например было отключено тактирование UART), код с delay превратится в бесконечный цикл. Если при этом был включен нагрев, то он станет бесконтрольным. Я думаю стоит переделать это место. Убрать safe_delay, но сделать какой-то timeout, по истечению которого цикл ожидания будет прерываться.