<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Python-скрипт для отправки G-кода на ЧПУ через COM-порт с проверкой отклика]]></title><description><![CDATA[<p dir="auto">Часто на производстве приходится вручную таскать флешки или мучаться с пультами ЧПУ-стендов. Python-скрипт решает это: генерит G-код, шлет его по последовательному порту и ждет подтверждения от стойки. Экономит часы на запуске программ, минимизирует ошибки ввода.</p>
<p dir="auto">Скрипт проверяет отклик - если станок не ответил, не идет дальше. Подходит для Fanuc, Siemens или GRBL-контроллеров. Зачем это нужно? Чтобы не бегать к станку каждый раз, а запускать пачками из офиса или сервера. Проблемы с таймаутами и потерянными командами уходят сами.</p>
<h2>Почему последовательный порт все еще в деле</h2>
<p dir="auto">Последовательный порт (RS-232 или USB-эмуляция) - классика для старых стоек ЧПУ. Не все станки имеют Ethernet, а USB часто глючит с драйверами. Скрипт на Python с библиотекой <strong>pyserial</strong> подключается к COM-порту, шлет строки G-кода и читает ответы. Без него приходится вручную копировать в консоль пульта - рискуешь накосячить с координатами или потерять конец программы.</p>
<p dir="auto">Пример: на Fanuc 0i порт COM3 на 9600 бод. Шлешь “G28\n”, ждешь “OK” или код ошибки. Если таймаут - скрипт стопорится и логирует. Это спасает от холостого хода без программы. Аргумент простой: в цеху 10 станков, каждый запуск - 5 минут. С скриптом - секунды, плюс лог для отладки. Логично перейти к шагам настройки.</p>
<ul>
<li><strong>Выбор порта</strong>: В Windows - Диспетчер устройств, ищи COMx. Linux - <code>/dev/ttyUSB0</code>.</li>
<li><strong>Baudrate</strong>: Стандарт 9600-19200, уточни в мануале стойки.</li>
<li><strong>Таймаут</strong>: Установи 2-5 сек, чтобы не висеть вечно.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Параметр</th>
<th>Fanuc</th>
<th>Siemens 810D</th>
<th>GRBL</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Baud</strong></td>
<td>9600</td>
<td>19200</td>
<td>115200</td>
</tr>
<tr>
<td><strong>Формат</strong></td>
<td>8N1</td>
<td>8N1</td>
<td>8N1</td>
</tr>
<tr>
<td><strong>Отклик</strong></td>
<td>? или OK</td>
<td>ACK</td>
<td>ok</td>
</tr>
</tbody>
</table>
<h2>Генерация G-кода перед отправкой</h2>
<p dir="auto">Скрипт не просто шлет - он может сам сгенерить простую программу. Например, прямоугольник или контур из параметров. Функция <code>generate_gcode()</code> собирает строки: G21 для мм, G90 абсолют, G01 с подачей. Потом сохраняет в .nc или шлет сразу. Реальный кейс: деталь 100x50 мм, 10 проходов - скрипт выдает готовый блок за миг.</p>
<p dir="auto">Без генерации загружаешь готовый .nc файл. Скрипт парсит его построчно, добавляет паузы M0 для проверки. Аргумент: CAM-системы типа Fusion 360 выдают тонны кода, вручную править - ад. Python читает файл, фильтрует комментарии (убирает ; ) и шлет чистый G-code. Переходим к коду.</p>
<pre><code class="language-python">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)
</code></pre>
<ul>
<li>Используй для тестовых запусков.</li>
<li>Добавь циклы для карманов: for i in range(passes).</li>
<li><em>Нюанс</em>: Всегда G28 в начале для нуля.</li>
</ul>
<h2>Отправка с проверкой отклика: сердце скрипта</h2>
<p dir="auto">Основная магия - в функции <code>send_with_ack()</code>. Подключаемся: <code>serial.Serial('COM3', 9600, timeout=3)</code>. Шлем <code>command + '\n'</code>, читаем <code>ser.readline()</code>. Проверяем на ‘OK’, ‘?’, ‘alarm’. Нет отклика - retry или exit. Пример: шлешь M03 (шпиндель on), ждешь готовности.</p>
<p dir="auto">В цикле для файла: открываешь .nc, построчно шлешь, пауза 0.1 сек. Логируй каждый шаг в файл. Реальный пример: программа 1000 строк - скрипт прогоняет за минуту, с проверкой. Без нее станок может уйти в аварию на 200-й строке. Таблица ошибок поможет.</p>
<pre><code class="language-python">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} -&gt; {resp}')
        return True
    print(f'Error: {cmd} -&gt; {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()
</code></pre>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Ошибка</th>
<th>Значение</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>?</strong></td>
<td>Готов</td>
<td>OK</td>
</tr>
<tr>
<td><strong>ALARM</strong></td>
<td>Авария</td>
<td>Stop + reset</td>
</tr>
<tr>
<td>Пусто</td>
<td>Таймаут</td>
<td>Retry x3</td>
</tr>
<tr>
<td><strong>E</strong></td>
<td>Синтаксис</td>
<td>Правь G-code</td>
</tr>
</tbody>
</table>
<h2>Тестирование и отладка на практике</h2>
<p dir="auto">Запускай сначала на эмуляторе GRBL в терминале - шлешь код, видишь симуляцию. Потом на реальном станке: сухой пробег без инструмента. Логи в .txt: timestamp + cmd + resp. Проблемы: baud не совпадает - мусор в ответе. Порт занят - исключение PermissionError.</p>
<p dir="auto">Масштабируй: класс CNC_sender с методами connect(), send_file(), status(). Интегрируй в веб-дашборд на Flask для удаленного пуска. Аргумент: в смену 50 программ - с скриптом техник не нужен у каждого станка. Список типичных фейлов.</p>
<ul>
<li><strong>Бaud mismatch</strong>: Ответ как белиберда - подгони под мануал.</li>
<li><em>Flow control</em>: RTS/CTS включи, если стойка требует.</li>
<li><strong>Buffer overflow</strong>: Пауза между строками 50-100мс.</li>
<li>Windows драйверы: CH340 для USB-RS232.</li>
</ul>
<p dir="auto"><strong>Готовый скрипт с GUI?</strong> Tkinter кнопка “Send” - для операторов без Python.</p>
<h2>Нюансы интеграции с производством</h2>
<p dir="auto">Скрипт крут, но под станок дорабатывай: Fanuc любит % в начале файла, GRBL - без. Масштаб: сервер с несколькими портами, очередь задач по API. Что осталось? Многострочная обработка M98 подпрограмм и Modbus over serial для новых стоек. Подумай о базе ошибок - собери статистику, чтобы предсказывать сбои. Внедряй поэтапно: тест на одном станке, потом флот.</p>
]]></description><link>https://forum.investsteel.ru/topic/3560/python-skript-dlya-otpravki-g-koda-na-chpu-cherez-com-port-s-proverkoj-otklika</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 16:02:53 GMT</lastBuildDate><atom:link href="https://forum.investsteel.ru/topic/3560.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Apr 2026 07:54:48 GMT</pubDate><ttl>60</ttl></channel></rss>