<?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-скрипт: выгрузка данных Fanuc в Excel по RS232 без остановки станка]]></title><description><![CDATA[<p dir="auto">Стойки Fanuc на RS232 шлют кучу данных - нагрузку шпинделя, время резки, параметры инструмента. Но вручную копировать в Excel - это ад для смены. Скрипт на Python решает: тянет данные онлайн, парсит и кидает в таблицу с графиками. Экономит часы на отчетах, планах и контроле износа.</p>
<p dir="auto">Без этого нормо-часы считаешь на глаз, станок простаивает, а начальник злится на ‘непонятные’ простои. Скрипт подключается по 9600 baud, ловит макросы типа #3004 или #3901, строит DataFrame и экспортит в xlsx. Работает на любой Fanuc 0i/31i, без FOCAS и доп. железа. Готово за 10 минут установки.</p>
<h2>Подготовка порта и библиотек</h2>
<p dir="auto">RS232 на Fanuc - классика: кабель DB9, настройки 9600,8,N,1. Стойка шлет данные по запросу M198 или через DNC-канал. Проблема в том, что без правильной кодировки Python глотает кракозябры вместо цифр. Реальный кейс: на 31i с O9999 макросом скрипт тянет нагрузку каждые 5 сек, без остановки программы.</p>
<p dir="auto">Параметры стойки: чекни 3010=3 для доступа, baud rate в 3101-3104. Python через pyserial открывает COM1, шлет команду, читает ответ. Если таймаут - добавь <em>parity=‘N’</em>. Pandas сразу форматирует в df, готовый к графикам. Логика простая: цикл запрос-ответ-парсинг, без блокировок.</p>
<p dir="auto">Установи пакеты одним махом:</p>
<ul>
<li><code>pip install pyserial pandas openpyxl matplotlib</code></li>
<li><em>pyserial</em> для порта, <em>pandas</em> для df, <em>openpyxl</em> для xlsx без Excel.</li>
<li>Настрой COM-порт в Windows Device Manager, драйверы Prolific не ставь - глючат.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Параметр RS232</th>
<th>Значение Fanuc</th>
<th>Нюанс в скрипте</th>
</tr>
</thead>
<tbody>
<tr>
<td>Baud rate</td>
<td>9600</td>
<td>Жестко в serial.Serial</td>
</tr>
<tr>
<td>Data bits</td>
<td>8</td>
<td>bytesize=8</td>
</tr>
<tr>
<td>Parity</td>
<td>None</td>
<td>parity=‘N’</td>
</tr>
<tr>
<td>Stop bits</td>
<td>1</td>
<td>stopbits=1</td>
</tr>
</tbody>
</table>
<h2>Логика скрипта: запрос макросов и парсинг</h2>
<p dir="auto">Скрипт использует M198 P{param} для чтения #3004 (нагрузка), #3901 (время). Стойка отвечает строкой с цифрой, Python float() парсит. Цикл на 60 итераций - 10 мин данных, потом экспорт. <em>Кодировка cp1251 спасает от ANSI-мусора Fanuc</em>.</p>
<p dir="auto">Пример: шпиндель на 80% - алерт в консоль, тренд по rolling mean. Без остановки: скрипт пассивно слушает DNC или активно дергает. Реальный профит - нормо-часы по факту, не по техкарте. График matplotlib сразу показывает пики износа.</p>
<p dir="auto">Ключевые макросы Fanuc для выгрузки:</p>
<ul>
<li><strong>#3004</strong> - нагрузка шпинделя (%).</li>
<li><strong>#3901</strong> - общее время обработки.</li>
<li><strong>#3021</strong> - позиция инструмента, для износа.</li>
<li><em>Добавь #5001 для feedrate, если подача корректируется</em>.</li>
</ul>
<p dir="auto">Полный скрипт ниже. Запусти в терминале, подключи кабель - и данные в Excel.</p>
<pre><code class="language-python">import serial
import pandas as pd
import matplotlib.pyplot as plt
import time

ser = serial.Serial('COM1', 9600, timeout=1, parity='N', bytesize=8, stopbits=1)
def read_param(param):
    ser.write(f'M198 P{param} F1000\n'.encode('cp1251'))
    return float(ser.readline().decode('cp1251').strip())

loads = []
times = []
for i in range(60):  # 10 мин по 10 сек
    load = read_param(3004)
    t = read_param(3901)
    loads.append(load)
    times.append(t)
    print(f'Нагрузка: {load}%, Время: {t}с')
    time.sleep(10)

ser.close()
df = pd.DataFrame({'load': loads, 'time': times})
df['load_trend'] = df['load'].rolling(10).mean()

# Экспорт в Excel
df.to_excel('fanuc_data.xlsx', index=False, sheet_name='Данные')

# График
plt.plot(df['load_trend'])
plt.title('Нагрузка шпинделя Fanuc')
plt.xlabel('Минуты')
plt.ylabel('%')
plt.savefig('load_plot.png')
plt.show()

if df['load_trend'].iloc[-1] &gt; 90:
    print('**АЛЕРТ: Износ шпинделя, проверь инструмент!**')
</code></pre>
<h2>Обработка данных в Excel и анализ</h2>
<p dir="auto">Pandas делает xlsx с колонками load/time/trend, freeze_panes для заголовков. Формат float %.2f, N/A для пустых. Открой в Excel - фильтры, pivot на месте. Сравни с нормой: если средняя нагрузка &gt;70% - оптимизируй траекторию.</p>
<p dir="auto">График сохраняется png, кидай в отчет. Линейная регрессия на df[‘load’] предсказывает износ за неделю. <em>Без SCADA, чистый Python - дешево и сердито</em>. Масштабируй: добавь несколько COM-портов для цеха.</p>
<p dir="auto">Сравнение с ручным учетом:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Время на смену</th>
<th>Точность</th>
<th>Автомат?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ручной</td>
<td>2 часа</td>
<td>Низкая</td>
<td>Нет</td>
</tr>
<tr>
<td>Excel макрос</td>
<td>30 мин</td>
<td>Средняя</td>
<td>Частично</td>
</tr>
<tr>
<td>Python RS232</td>
<td>1 мин</td>
<td>Высокая</td>
<td>Полная</td>
</tr>
</tbody>
</table>
<p dir="auto">Статистика по df:</p>
<ul>
<li>Средняя нагрузка: <code>df['load'].mean()</code>.</li>
<li><strong>Макс время цикла</strong>: <code>df['time'].max()</code>.</li>
<li>Тренд износа: if &gt;100 - стоп.</li>
</ul>
<h2>Готовые связки для цеха</h2>
<p dir="auto">Скрипт крутит в фоне через Task Scheduler, логи в папку по датам. Добавь Telegram-бот для алертов: telebot + if load&gt;95. Для 10 станков - multiprocessing, каждый порт в потоке. <em>Тестируй на эмуляторе Fanuc перед боем</em>.</p>
<p dir="auto">Интеграция с 1C: экспорт CSV, импорт в базу нормо-часов. Графики в Power BI через xlsx. План смены: если время &gt; нормы - перераспределяй.</p>
<p dir="auto">Расширения скрипта:</p>
<ul>
<li>Email с отчетом: smtplib.</li>
<li><strong>База износа</strong>: SQLite для истории по инструментам.</li>
<li>Web-дашборд: Flask + df.plot.</li>
</ul>
<h2>Когда RS232 не тянет - апгрейд</h2>
<p dir="auto">RS232 глючит на длинах &gt;10м - бери конвертер в USB или Ethernet. FOCAS лучше: pyfocas по TCP 8193, без кабеля. Но для legacy 0i - только serial. Подумай о параметрах 0000=1 для debug-логов стойки.</p>
<p dir="auto">Скрипт покрывает 80% задач: нагрузка, время, инструмент. Остальное - кастом макросы O9001. Тестируй на холостом ходу, чтоб не словить сбой. Дальше - парсинг G-кода из DNC для полной аналитики.</p>
]]></description><link>https://forum.investsteel.ru/topic/3367/python-skript-vygruzka-dannyh-fanuc-v-excel-po-rs232-bez-ostanovki-stanka</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 22:07:38 GMT</lastBuildDate><atom:link href="https://forum.investsteel.ru/topic/3367.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Apr 2026 07:45:32 GMT</pubDate><ttl>60</ttl></channel></rss>