Python-скрипт для отправки G-кода на ЧПУ через COM-порт с проверкой отклика
-
Часто на производстве приходится вручную таскать флешки или мучаться с пультами ЧПУ-стендов. Python-скрипт решает это: генерит G-код, шлет его по последовательному порту и ждет подтверждения от стойки. Экономит часы на запуске программ, минимизирует ошибки ввода.
Скрипт проверяет отклик - если станок не ответил, не идет дальше. Подходит для Fanuc, Siemens или GRBL-контроллеров. Зачем это нужно? Чтобы не бегать к станку каждый раз, а запускать пачками из офиса или сервера. Проблемы с таймаутами и потерянными командами уходят сами.
Почему последовательный порт все еще в деле
Последовательный порт (RS-232 или USB-эмуляция) - классика для старых стоек ЧПУ. Не все станки имеют Ethernet, а USB часто глючит с драйверами. Скрипт на Python с библиотекой pyserial подключается к COM-порту, шлет строки G-кода и читает ответы. Без него приходится вручную копировать в консоль пульта - рискуешь накосячить с координатами или потерять конец программы.
Пример: на Fanuc 0i порт COM3 на 9600 бод. Шлешь “G28\n”, ждешь “OK” или код ошибки. Если таймаут - скрипт стопорится и логирует. Это спасает от холостого хода без программы. Аргумент простой: в цеху 10 станков, каждый запуск - 5 минут. С скриптом - секунды, плюс лог для отладки. Логично перейти к шагам настройки.
- Выбор порта: В Windows - Диспетчер устройств, ищи COMx. Linux -
/dev/ttyUSB0. - Baudrate: Стандарт 9600-19200, уточни в мануале стойки.
- Таймаут: Установи 2-5 сек, чтобы не висеть вечно.
Параметр Fanuc Siemens 810D GRBL Baud 9600 19200 115200 Формат 8N1 8N1 8N1 Отклик ? или OK ACK ok Генерация G-кода перед отправкой
Скрипт не просто шлет - он может сам сгенерить простую программу. Например, прямоугольник или контур из параметров. Функция
generate_gcode()собирает строки: G21 для мм, G90 абсолют, G01 с подачей. Потом сохраняет в .nc или шлет сразу. Реальный кейс: деталь 100x50 мм, 10 проходов - скрипт выдает готовый блок за миг.Без генерации загружаешь готовый .nc файл. Скрипт парсит его построчно, добавляет паузы M0 для проверки. Аргумент: CAM-системы типа Fusion 360 выдают тонны кода, вручную править - ад. Python читает файл, фильтрует комментарии (убирает ; ) и шлет чистый G-code. Переходим к коду.
def generate_rectangle(width, height, depth=-3, feed=200): gcode = [ 'G21 G90 G17', # мм, абсолют, XY f'G0 Z10', # отвод f'G0 X0 Y0', f'G1 Z{depth} F100', f'G1 X{width} F{feed}', f'G1 Y{height}', f'G1 X0', f'G1 Y0', 'G0 Z10', 'M30' # конец ] return '\n'.join(gcode)- Используй для тестовых запусков.
- Добавь циклы для карманов: for i in range(passes).
- Нюанс: Всегда G28 в начале для нуля.
Отправка с проверкой отклика: сердце скрипта
Основная магия - в функции
send_with_ack(). Подключаемся:serial.Serial('COM3', 9600, timeout=3). Шлемcommand + '\n', читаемser.readline(). Проверяем на ‘OK’, ‘?’, ‘alarm’. Нет отклика - retry или exit. Пример: шлешь M03 (шпиндель on), ждешь готовности.В цикле для файла: открываешь .nc, построчно шлешь, пауза 0.1 сек. Логируй каждый шаг в файл. Реальный пример: программа 1000 строк - скрипт прогоняет за минуту, с проверкой. Без нее станок может уйти в аварию на 200-й строке. Таблица ошибок поможет.
import serial import time def send_gcode(ser, cmd): ser.write((cmd + '\n').encode()) resp = ser.readline().decode().strip() if 'OK' in resp or '?' not in resp: print(f'OK: {cmd} -> {resp}') return True print(f'Error: {cmd} -> {resp}') return False ser = serial.Serial('COM3', 9600, timeout=2) with open('prog.nc') as f: for line in f: cmd = line.strip().split(';') # убрать комментарии if cmd and send_gcode(ser, cmd): time.sleep(0.05) else: break ser.close()Ошибка Значение Действие ? Готов OK ALARM Авария Stop + reset Пусто Таймаут Retry x3 E Синтаксис Правь G-code Тестирование и отладка на практике
Запускай сначала на эмуляторе GRBL в терминале - шлешь код, видишь симуляцию. Потом на реальном станке: сухой пробег без инструмента. Логи в .txt: timestamp + cmd + resp. Проблемы: baud не совпадает - мусор в ответе. Порт занят - исключение PermissionError.
Масштабируй: класс CNC_sender с методами connect(), send_file(), status(). Интегрируй в веб-дашборд на Flask для удаленного пуска. Аргумент: в смену 50 программ - с скриптом техник не нужен у каждого станка. Список типичных фейлов.
- Бaud mismatch: Ответ как белиберда - подгони под мануал.
- Flow control: RTS/CTS включи, если стойка требует.
- Buffer overflow: Пауза между строками 50-100мс.
- Windows драйверы: CH340 для USB-RS232.
Готовый скрипт с GUI? Tkinter кнопка “Send” - для операторов без Python.
Нюансы интеграции с производством
Скрипт крут, но под станок дорабатывай: Fanuc любит % в начале файла, GRBL - без. Масштаб: сервер с несколькими портами, очередь задач по API. Что осталось? Многострочная обработка M98 подпрограмм и Modbus over serial для новых стоек. Подумай о базе ошибок - собери статистику, чтобы предсказывать сбои. Внедряй поэтапно: тест на одном станке, потом флот.
- Выбор порта: В Windows - Диспетчер устройств, ищи COMx. Linux -
Здравствуйте! Похоже, вас заинтересовал этот пост, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2022 - 2026 InvestSteel, Inc. Все права защищены.