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

Python-скрипт: выгрузка данных Fanuc в Excel по RS232 без остановки станка

ПO для чпу
1 1 6 1
  • Стойки Fanuc на RS232 шлют кучу данных - нагрузку шпинделя, время резки, параметры инструмента. Но вручную копировать в Excel - это ад для смены. Скрипт на Python решает: тянет данные онлайн, парсит и кидает в таблицу с графиками. Экономит часы на отчетах, планах и контроле износа.

    Без этого нормо-часы считаешь на глаз, станок простаивает, а начальник злится на ‘непонятные’ простои. Скрипт подключается по 9600 baud, ловит макросы типа #3004 или #3901, строит DataFrame и экспортит в xlsx. Работает на любой Fanuc 0i/31i, без FOCAS и доп. железа. Готово за 10 минут установки.

    Подготовка порта и библиотек

    RS232 на Fanuc - классика: кабель DB9, настройки 9600,8,N,1. Стойка шлет данные по запросу M198 или через DNC-канал. Проблема в том, что без правильной кодировки Python глотает кракозябры вместо цифр. Реальный кейс: на 31i с O9999 макросом скрипт тянет нагрузку каждые 5 сек, без остановки программы.

    Параметры стойки: чекни 3010=3 для доступа, baud rate в 3101-3104. Python через pyserial открывает COM1, шлет команду, читает ответ. Если таймаут - добавь parity=‘N’. Pandas сразу форматирует в df, готовый к графикам. Логика простая: цикл запрос-ответ-парсинг, без блокировок.

    Установи пакеты одним махом:

    • pip install pyserial pandas openpyxl matplotlib
    • pyserial для порта, pandas для df, openpyxl для xlsx без Excel.
    • Настрой COM-порт в Windows Device Manager, драйверы Prolific не ставь - глючат.
    Параметр RS232 Значение Fanuc Нюанс в скрипте
    Baud rate 9600 Жестко в serial.Serial
    Data bits 8 bytesize=8
    Parity None parity=‘N’
    Stop bits 1 stopbits=1

    Логика скрипта: запрос макросов и парсинг

    Скрипт использует M198 P{param} для чтения #3004 (нагрузка), #3901 (время). Стойка отвечает строкой с цифрой, Python float() парсит. Цикл на 60 итераций - 10 мин данных, потом экспорт. Кодировка cp1251 спасает от ANSI-мусора Fanuc.

    Пример: шпиндель на 80% - алерт в консоль, тренд по rolling mean. Без остановки: скрипт пассивно слушает DNC или активно дергает. Реальный профит - нормо-часы по факту, не по техкарте. График matplotlib сразу показывает пики износа.

    Ключевые макросы Fanuc для выгрузки:

    • #3004 - нагрузка шпинделя (%).
    • #3901 - общее время обработки.
    • #3021 - позиция инструмента, для износа.
    • Добавь #5001 для feedrate, если подача корректируется.

    Полный скрипт ниже. Запусти в терминале, подключи кабель - и данные в Excel.

    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] > 90:
        print('**АЛЕРТ: Износ шпинделя, проверь инструмент!**')
    

    Обработка данных в Excel и анализ

    Pandas делает xlsx с колонками load/time/trend, freeze_panes для заголовков. Формат float %.2f, N/A для пустых. Открой в Excel - фильтры, pivot на месте. Сравни с нормой: если средняя нагрузка >70% - оптимизируй траекторию.

    График сохраняется png, кидай в отчет. Линейная регрессия на df[‘load’] предсказывает износ за неделю. Без SCADA, чистый Python - дешево и сердито. Масштабируй: добавь несколько COM-портов для цеха.

    Сравнение с ручным учетом:

    Метод Время на смену Точность Автомат?
    Ручной 2 часа Низкая Нет
    Excel макрос 30 мин Средняя Частично
    Python RS232 1 мин Высокая Полная

    Статистика по df:

    • Средняя нагрузка: df['load'].mean().
    • Макс время цикла: df['time'].max().
    • Тренд износа: if >100 - стоп.

    Готовые связки для цеха

    Скрипт крутит в фоне через Task Scheduler, логи в папку по датам. Добавь Telegram-бот для алертов: telebot + if load>95. Для 10 станков - multiprocessing, каждый порт в потоке. Тестируй на эмуляторе Fanuc перед боем.

    Интеграция с 1C: экспорт CSV, импорт в базу нормо-часов. Графики в Power BI через xlsx. План смены: если время > нормы - перераспределяй.

    Расширения скрипта:

    • Email с отчетом: smtplib.
    • База износа: SQLite для истории по инструментам.
    • Web-дашборд: Flask + df.plot.

    Когда RS232 не тянет - апгрейд

    RS232 глючит на длинах >10м - бери конвертер в USB или Ethernet. FOCAS лучше: pyfocas по TCP 8193, без кабеля. Но для legacy 0i - только serial. Подумай о параметрах 0000=1 для debug-логов стойки.

    Скрипт покрывает 80% задач: нагрузка, время, инструмент. Остальное - кастом макросы O9001. Тестируй на холостом ходу, чтоб не словить сбой. Дальше - парсинг G-кода из DNC для полной аналитики.