Skip to content

Latest commit

 

History

History
541 lines (413 loc) · 19.6 KB

File metadata and controls

541 lines (413 loc) · 19.6 KB

🚀 PostProcessor

Универсальный постпроцессор для CAM-систем с поддержкой Python-макросов

Генерирует G-код из APT/CL файлов для любого оборудования: 3-5 осевые фрезерные станки, токарные, многозадачные обрабатывающие центры с ЧПУ Siemens, Fanuc, Heidenhain, Haas

Release .NET Python Build Tests License


📋 Оглавление


Что это?

PostProcessor — это универсальный постпроцессор, который преобразует управляющие программы из формата APT/CL (из CAM-систем CATIA, NX, Mastercam, Fusion 360) в G-код для конкретных станков с ЧПУ.

Как это работает?

┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
│   CAM-система   │     │   PostProcessor  │     │    Станок ЧПУ   │
│   (CATIA, NX)   │───▶│ + Python макросы │────▶│    (Siemens,    │
│   APT/CL файл   │     │                  │     │    Fanuc...)    │
└─────────────────┘     └──────────────────┘     └─────────────────┘

Ключевая особенность

Архитектура на Python-макросах позволяет добавлять поддержку любого оборудования без перекомпиляции основного кода. Просто создайте Python-файл с логикой обработки команд для вашего станка!


✨ Возможности

Возможность Описание
🌍 Универсальность Поддержка любого оборудования через конфигурации и макросы
🧩 Модульность Python макросы без перекомпиляции основного кода
⚙️ 4 контроллера Siemens, Fanuc, Heidenhain, Haas — готовые конфигурации
🏭 8+ профилей DMG Mori, Haas, Romi, Mecof — готовые профили станков
🐍 Python 3.8-3.12 Полноценный Python для логики постпроцессора
🔄 3-5 осей 3-осевая и 5-осевая обработка (RTCP, CYCLE800)
🛠️ Токарная TURRET, CHUCK, TAILSTK — токарные макросы
🛡️ Безопасность Проверка ограничений станка перед выводом
📝 Модальность Оптимизированный вывод G-кода
💾 StateCache Кэш состояний LAST_* (IMSPost-style) для модальных переменных
🔄 CycleCache Кэширование параметров циклов — автоматический выбор полного определения или вызова
🔢 NumericNCWord Форматирование числовых NC-слов из конфига контроллера
🔣 SequenceNCWord Нумерация блоков (N10, N20...) из конфига
📝 TextNCWord Комментарии со стилем из конфига (parentheses/semicolon)
169 тестов Unit-тесты для ядра, макросов и интеграционные тесты
📖 ~16,000 строк Полная документация и код на C#

🆕 Новые возможности (v1.1.0)

StateCache — кэш состояний

Кэширование LAST_* переменных для модального вывода:

  • LAST_FEED, LAST_TOOL, LAST_CS...
  • Автоматическая проверка изменений
  • Оптимизация вывода G-кода

CycleCache — кэширование циклов

Автоматический выбор: полное определение или вызов:

; Первый вызов (полное определение)
CYCLE800(MODE=1, TABLE="TABLE1", X=100.000, ...)

; Второй вызов (те же параметры - только вызов)
CYCLE800()

Форматирование из конфига

Все параметры форматирования в JSON-конфигах:

  • Нумерация блоков (N10, N20...)
  • Стиль комментариев (parentheses/semicolon)
  • Форматы координат (decimals, leadingZeros)
  • Форматы подачи и шпинделя

NumericNCWord

Числовые NC-слова с паттернами формата:

  • Паттерны: X{-#####!###}
  • Форматирование из конфига контроллера
  • Автоматическая модальность

TextNCWord

Текстовые NC-слова для комментариев:

  • Стили: parentheses (Comment), semicolon ; Comment, both
  • Транслитерация кириллицы
  • Ограничение длины

Python API

Новые методы в Python-макросах:

context.cacheGet("LAST_FEED", 0.0)
context.cacheSet("LAST_FEED", 500.0)
context.cycleWriteIfDifferent("CYCLE800", params)
context.setNumericValue('X', 100.5)
context.getFormattedValue('F')
context.comment("Привет")  # Стиль из конфига

🚀 Быстрый старт

1. Установка

# Клонируйте репозиторий
git clone https://github.com/rybakov25/PostProcessor.git
cd PostProcessor

# Сборка
dotnet build

2. Первый запуск

# Обработка APT файла
dotnet run --project src/PostProcessor.CLI/PostProcessor.CLI.csproj \
  -- -i input.apt -o output.nc -c siemens -m mmill

3. Первый макрос за 5 минут

Создайте файл macros/python/user/hello.py:

# -*- coding: ascii -*-
def execute(context, command):
    context.comment("=== Привет от Python! ===")
    context.write("G0 X0 Y0 Z50")

Результат в output.nc:

(=== Привет от Python! ===)
N1 G0 X0. Y0. Z50.

📖 Подробнее: QUICKSTART.md — первый макрос за 10 минут


🛠️ Поддерживаемое оборудование

Контроллеры (4 готовых)

Контроллер Семейства Макросы Статус
Siemens 840D / 840D sl 9 базовых + mmill ✅ Полная поддержка конфигов
Fanuc 31i / 32i / 35i 11 (фрезерные + токарные) ✅ Полная поддержка конфигов
Heidenhain TNC 640 / TNC 620 9 (уникальный синтаксис) ✅ Полная поддержка конфигов
Haas NGC / Next Gen 9 (с % маркером) ✅ Полная поддержка конфигов

Типы станков

Тип Примеры Поддержка
3-осевые фрезерные DMG Mori DMU50, Haas VF-2
5-осевые DMG Mori DMU50 5-axis, Haas UMC ✅ (RTCP, CYCLE800)
Токарные Mori Seiki NLX2500, Romi GL250 ✅ (TURRET, CHUCK, TAILSTK)
Многозадачные Mazak Integrex 🔄 В разработке

📖 Полный список: SUPPORTED_EQUIPMENT.md


📋 Примеры использования

3-осевой фрезерный (Siemens 840D)

dotnet run -- -i part.apt -o part.nc \
  -c siemens \
  --machine-profile mmill

5-осевой обрабатывающий центр (Fanuc 31i)

dotnet run -- -i impeller.apt -o impeller.nc \
  -c fanuc \
  --machine-profile dmg_mori_dmu50_5axis

Токарный станок (Haas NGC)

dotnet run -- -i shaft.apt -o shaft.nc \
  -c haas \
  --machine-profile romi_gl250

Валидация APT файла

dotnet run -- -i part.apt -o /dev/null \
  -c siemens \
  --validate-only

🐍 Создание макросов

Базовый шаблон

# -*- coding: ascii -*-
# MACRO_NAME - Описание

def execute(context, command):
    """
    Обработка APT команды

    Args:
        context: Объект контекста постпроцессора
        command: Объект APT команды
    """
    # Проверка параметров
    if not command.numeric:
        return

    # Получение значений
    x = command.numeric[0]

    # Обновление регистров
    context.registers.x = x

    # Вывод G-кода
    context.write(f"G01 X{x:.3f}")

Пример: GOTO (линейное перемещение)

# -*- coding: ascii -*-
def execute(context, command):
    if not command.numeric:
        return

    x = command.numeric[0] if len(command.numeric) > 0 else 0
    y = command.numeric[1] if len(command.numeric) > 1 else 0
    z = command.numeric[2] if len(command.numeric) > 2 else 0

    context.registers.x = x
    context.registers.y = y
    context.registers.z = z

    # Проверка на быстрое перемещение
    if context.system.MOTION == 'RAPID':
        context.write(f"G0 X{x:.3f} Y{y:.3f} Z{z:.3f}")
    else:
        context.write(f"G1 X{x:.3f} Y{y:.3f} Z{z:.3f}")

        # Модальная подача с использованием StateCache
        if context.registers.f > 0:
            last_feed = context.cacheGet("LAST_FEED", 0.0)
            if last_feed != context.registers.f:
                context.write(f"F{context.registers.f:.1f}")
                context.cacheSet("LAST_FEED", context.registers.f)

Пример: SPINDL (шпиндель)

# -*- coding: ascii -*-
def execute(context, command):
    # Получение RPM
    if command.numeric:
        context.registers.spindle_rpm = command.numeric[0]

    # Обработка ключевых слов
    spindle_state = 'OFF'
    if command.minorWords:
        for word in command.minorWords:
            if word.upper() in ['ON', 'CLW']:
                spindle_state = 'CW'
            elif word.upper() in ['CCLW', 'CCW']:
                spindle_state = 'CCW'
            elif word.upper() == 'OFF':
                spindle_state = 'OFF'

    # Вывод M-кода
    if spindle_state == 'CW':
        context.write("M3")
        if context.registers.spindle_rpm > 0:
            context.write(f"S{int(context.registers.spindle_rpm)}")
    elif spindle_state == 'CCW':
        context.write("M4")
        if context.registers.spindle_rpm > 0:
            context.write(f"S{int(context.registers.spindle_rpm)}")
    else:
        context.write("M5")

Пример: CYCLE800 с CycleCache

# -*- coding: ascii -*-
def execute(context, command):
    # Сбор параметров цикла
    params = {
        "MODE": command.numeric[0] if len(command.numeric) > 0 else 1,
        "TABLE": command.string if command.string else "TABLE1",
        "X": context.registers.x,
        "Y": context.registers.y,
        "Z": context.registers.z
    }
    
    # Автоматический выбор: полное определение или вызов
    context.cycleWriteIfDifferent("CYCLE800", params)

Пример: comment с TextNCWord

# -*- coding: ascii -*-
def execute(context, command):
    # Стиль комментария берётся из конфига контроллера
    # Siemens: (Comment), Haas: ; Comment
    context.comment("Начало обработки")
    context.comment("Привет мир")  # Транслитерация кириллицы

📖 Полное руководство: PYTHON_MACROS_GUIDE.md


📚 Документация

Документ Описание
🚀 QUICKSTART Первый макрос за 10 минут
📚 PYTHON_MACROS_GUIDE Полное API макросов (1400+ строк)
🏗️ ARCHITECTURE Архитектура для разработчиков
⚙️ CUSTOMIZATION Настройка контроллеров и станков
🌍 SUPPORTED_EQUIPMENT Поддерживаемое оборудование
🔄 IMSPOST_TO_PYTHON Миграция с IMSpost
📊 COMPLETION_REPORT Статус и план развития

📦 Установка

Из исходного кода

# Клонирование
git clone https://github.com/rybakov25/PostProcessor.git
cd PostProcessor

# Сборка
dotnet build

# Запуск
dotnet run --project src/PostProcessor.CLI/PostProcessor.CLI.csproj \
  -- -i input.apt -o output.nc -c siemens

Готовые бинарники

Скачайте с страницы релизов:

  • Windows: PostProcessor-1.1.0-win-x64.zip
  • Linux: PostProcessor-1.1.0-linux-x64.zip

Предыдущие версии:

  • v1.0.0: PostProcessor-v1.0.0-win-x64.zip, PostProcessor-v1.0.0-linux-x64.zip

⚙️ Настройка

Параметры командной строки

Параметр Короткий Описание Default
--input -i Входной APT файл Обязательно
--output -o Выходной NC файл Обязательно
--controller -c Тип контроллера siemens
--machine-profile -mp Профиль станка Нет
--debug -d Режим отладки false

Конфигурация контроллера

Пример configs/controllers/siemens/840d.json:

{
  "name": "Siemens Sinumerik 840D sl",
  "machineType": "Milling",
  "formatting": {
    "coordinates": {
      "decimals": 3,
      "trailingZeros": false
    },
    "sequenceNumbers": {
      "enabled": true,
      "prefix": "N",
      "increment": 10
    },
    "comments": {
      "style": "parentheses",
      "transliterate": true
    }
  },
  "gcode": {
    "rapid": "G0",
    "linear": "G1"
  },
  "mcode": {
    "spindleCW": "M3",
    "coolantOn": "M8"
  },
  "fiveAxis": {
    "tcpOn": "RTCPON",
    "tcpOff": "RTCPOF"
  }
}

🔧 Требования

Компонент Версия Примечание
.NET SDK 8.0+ Для сборки
Python 3.8-3.12 Для макросов
CAM-система Любая Генерирующая APT/CL

Поддерживаемые CAM-системы

  • ✅ CATIA
  • ✅ Siemens NX
  • ✅ Mastercam
  • ✅ Fusion 360
  • ✅ SolidCAM
  • ✅ HyperMill
  • ✅ Другие (с экспортом в APT/CL)

📊 Статус проекта

Текущая версия: v1.1.0 (выпущена 24.02.2026)

Метрика Значение
Строк кода ~10,000 (C#)
C# файлы 50+
Python макросы 65
Unit-тесты 169 ✅
Документация ~8,000 строк
Конфигурации 4 контроллера + 7 профилей

Готовность к производству

Готов для:

  • 3-5 осевых фрезерных станков
  • Токарных станков (базовая обработка)
  • Станков с Siemens, Fanuc, Heidenhain, Haas
  • Форматирования из JSON-конфигов
  • Кэширования состояний и циклов

⚠️ В разработке:

  • Токарные циклы G71-G76
  • Mill-Turn поддержка (приводной инструмент)
  • Расширенные профили (Mazak, Okuma)
  • Графический интерфейс (GUI)

📋 План развития: COMPLETION_REPORT.md


🤝 Вклад в проект

  1. Fork репозитория
  2. Создайте ветку (git checkout -b feature/amazing-feature)
  3. Закоммитьте изменения (git commit -m 'Add amazing feature')
  4. Отправьте в ветку (git push origin feature/amazing-feature)
  5. Откройте Pull Request

📖 Подробнее: CONTRIBUTING.md (в разработке)


📄 Лицензия

MIT License — см. файл LICENSE


📞 Контакты


🙏 Благодарности

  • IMSpost — за вдохновение архитектурой
  • pythonnet — за Python интеграцию
  • xUnit — за фреймворк тестирования
  • ПАО "Корпорация ВСМПО-АВИСМА" и Солдатову Вячеславу, ведущему инженеру-программисту станков с ЧПУ — за вдохновение на разработку
  • QWEN AI — за помощь в реализации проекта

PostProcessor — Универсальный постпроцессор для CNC

Начать работуДокументацияПримеры