Перейти до змісту

Swap Mode

Swap mode підтримує автоматизовані плейт-свопери -- механічні додатки, що виштовхують готову робочу пластину та позиціонують свіжу між друками. Коли swap mode увімкнено, BamDude координується зі свопером, щоб виконувати unattended-батчі без ручного підтвердження очищення пластини.


Що таке Swap Mode?

Плейт-свопер -- це апаратний аксесуар (найчастіше для A1 Mini), що бере на себе ротацію пластин між друками. Зі swap mode увімкненим планувальник черги:

  1. Виконує макрос swap_mode_start перед першим друком
  2. Запускає сам друк
  3. Виконує макрос swap_mode_change_table після завершення друку
  4. Обходить підтвердження plate-clear
  5. Автоматично запускає наступний друк з черги

Цикл триває, поки черга не спорожніє.


Налаштування

Увімкнення Swap Mode

  1. Перейдіть до Settings → Queue.
  2. Увімкніть Swap Mode для свого A1 Mini.
  3. Виберіть Swap Profile під своє залізо:

    Профіль Для
    a1mini_kit Офіційний Bambu A1 Mini Plate Swapper Kit
    a1mini_stl Community-printable A1 Mini свопери (printable kit / STL дизайни)
    jobox-a1 JoBox plate-swap автоматика

    Профіль прив'язує правильний набір макросів swap_mode_start / swap_mode_change_table. a1mini_stl і jobox-a1 постачаються з seed-нутими built-in-макросами; a1mini_kit — ні (офіційний кіт Bambu наразі покладається на user-supplied G-code — напишіть власну пару під Settings → Macros і позначте swap_profile=a1mini_kit). Built-in-и будь-якого профілю можна перевизначити, відредагувавши макрос у UI.

Swap G-code макроси

Swap mode керується G-code макросами, прив'язаними до подій swap_mode_start та swap_mode_change_table. Налаштовуйте їх у Settings → Macros. Див. Макроси для повної системи подій + фільтрів.

; Приклад сніпета swap_mode_change_table
G28 X Y         ; Home X and Y
G1 Y 180 F3000  ; Move bed forward for plate swap
M400            ; Wait for moves to complete
G4 S5           ; Pause 5 seconds for swap
G28             ; Home all axes

Потрібне власне обладнання

Swap mode потребує фізичного плейт-свопера, прикрученого до принтера. Підлаштовуйте G-code swap_mode_change_table під ваш конкретний механізм -- універсальної swap-рутини не існує.


Restart-стійке відстеження подій

Swap-намір зберігається на диск, а не в пам'яті. Рестарт BamDude посеред друку ніколи не втрачає очікуваний plate-swap.

Як це працює

  • На диспатчі кожна swap-подія, яку завдання збирається виконати, додається в print_archives.extra_data["swap_macro_events_pending"] (JSON-список).
  • Коли swap_mode_start спрацьовує успішно, диспатчер одразу видаляє його зі списку.
  • Коли swap_mode_change_table спрацьовує успішно (в on_print_complete), той самий запис видаляє його.
  • Щойно список порожніє, ключ зникає взагалі, тож extra_data архіву залишається чистим.

Чому це важливо

  • Рестарт бекенду між print start та print complete раніше витирав in-memory dict _active_swap_config, лишаючи on_print_complete без нічого, на чому діяти. Тепер pending-список читається з рядка архіву, і спрацьовують лише ті події, що в ньому ще лишилися.
  • Дубльований on_print_complete (MQTT replay, reconnect flap) знаходить подію вже видаленою і нічого не робить -- жодного подвійного swap.

Де живе маркер

Для диспатчів файлів бібліотеки початковий pending-список загортається в INSERT всередині archive_print() (один statement, без додаткового writer). Для повторних друків існуючий рядок архіву оновлюється у відкритій сесії диспатчера до FTP-завантаження -- тримання всього в одній транзакції уникає гонки з runtime-трекером по тому ж рядку.


Диспатч і startup-lock на DB-write

Background dispatch працює паралельно по принтерах — відправка друків на два A1 Mini зі сваперами справді стартує обидва завдання одночасно.

Що серіалізовано

Коротка фаза DB-insert (INSERT INTO print_archives) обгорнута в startup-lock, щоб single-writer семантика SQLite не падала на database is locked. Лок звільняється, як тільки рядок закомічений; FTP-завантаження і start_print MQTT round-trip далі біжать паралельно.

Що ти побачиш

  • На двох принтерах swap_mode_start спрацьовує практично одночасно.
  • Їхні FTP-завантаження йдуть паралельно (у dispatch-тості будуть два прогрес-бари).
  • Тимчасовий "одне за раз через усю ферму" gate, що приземлився в середині 0.4.1, прибрали, як тільки startup-lock у диспатчер заїхав.

Поведінка черги в Swap Mode

Коли swap mode активний для принтера:

  1. Друк завершується на принтері.
  2. Виконується макрос swap_mode_change_table (G-code через MQTT, з ACK у idle-стані).
  3. Підтвердження plate-clear обходиться -- свопер сам розбирається з очищенням.
  4. Наступний друк з черги диспатчиться.
  5. Цикл повторюється, поки черга не спорожніє.

Це режим unattended batch production для сумісних принтерів.

Запускайте друк з BamDude, а не з екрана принтера

Swap-макроси виконуються лише для друків, які запустив BamDude -- з черги, з Auto-Queue, передруком з архіву або через Send-to-Printer. Друк, який ви запустили на самому екрані принтера (чи зі слайсера напряму в машину), не проходить через диспетчер BamDude, тому:

  • макрос swap_mode_change_table не виконується -- стіл не міняється, і готова деталь лишається на місці;
  • оскільки плиту ніхто не звільнив, BamDude перед наступним друком з черги попросить вручну натиснути Очистити стіл -- так само, як для принтера без swap-режиму.

Виглядає це так, ніби принтер вільний, а черга не рухається. Натисніть Очистити стіл на карточці принтера, коли стіл справді порожній, і черга поїде далі.

Єдиний виняток -- файл, у назві якого є .swap. або .swaps. (саме такі експортує swaplist.app): у них зміна столу зашита в сам G-code, тож вони міняють стіл коректно навіть при запуску з принтера, і підтвердження не питається.

Скасований або невдалий друк завжди просить підтвердження

Swap-макроси свідомо пропускаються, коли друк завершився не успішно: деталь (або те, що від неї лишилось) досі на столі, і заміна столу в такому стані або заклинить механізм, або заведе забруднену плиту під наступний друк. Саме тому черга після збою зупиняється й чекає на вас -- це безпечна поведінка, а не поломка.

Якщо друк позначено невдалим через те, що BamDude втратив звʼязок із принтером під час swap-макросу, у повідомленні це сказано прямо -- це проблема мережі, а не макросу. Короткі обриви перечікуються 30 секунд, і лише потім друк вважається провальним.


Парування з макросами print_started / print_finished

Новіші події print_started та print_finished (див. Макроси) спрацьовують додатково до swap-макросів, на кожному друку незалежно від swap mode. Використовуйте їх для ортогональної автоматизації -- світло корпусу, зовнішні реле тощо.

Приклад: світло корпусу тільки на swap-mode друках

Macro 1 Macro 2
Action: MQTT-action Action: MQTT-action
Event: print_started Event: print_finished
Command: chamber_light_on Command: chamber_light_off
swap_mode_only: true swap_mode_only: true
delay_seconds: 10 delay_seconds: 0

Світло цикл лише на справжніх swap-mode прогонах; ручні друки з того ж принтера лишають світло недоторканим.


Вимоги

Вимога Деталі
Принтер A1 Mini (основний таргет)
Обладнання Встановлений плейт-свопер
Макроси Налаштований G-code макрос swap_mode_change_table
Елементи черги Щонайменше 2 друки в черзі для принтера

Поради

Перевірте swap-макрос вручну

Запустіть G-code swap_mode_change_table з файлового браузера принтера (або через Macros → Run Now) перш ніж вмикати swap mode у проді. Поганий swap-роутин заклинює всю чергу.

Поєднуйте з batch quantity

Використовуйте функцію batch-quantity у черзі, щоб поставити N копій, а далі дайте swap mode прогнати їх підряд. Поєднайте з авто-вимкненням розумних розеток для повністю unattended нічних прогонів.

Моніторте дистанційно

Стрім із камери + Telegram-бот дозволяють спостерігати за swap-операцією та отримувати сповіщення про завершення черги або збій. Див. Telegram-бот і Камеру.

Початково базується на документації Bambuddy.