Перейти к содержанию

Python-скрипт для отправки G-кода на ЧПУ через COM-порт с проверкой отклика

ПO для чпу
1 1 44 1
  • Часто на производстве приходится вручную таскать флешки или мучаться с пультами ЧПУ-стендов. 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 для новых стоек. Подумай о базе ошибок - собери статистику, чтобы предсказывать сбои. Внедряй поэтапно: тест на одном станке, потом флот.