1. Что такое Lua-скрипт?
Lua (в переводе с португ. "Луна") — это легковесный, мощный и невероятно быстрый язык программирования, специально разработанный для встраивания в другие приложения. Его главная философия — простота, эффективность и возможность интеграции.
Lua-скрипт — это обычный текстовый файл (с расширением .lua), содержащий код на языке Lua, который выполняется внутри другой программы (например, FEMM).
Почему именно Lua?
  • Простой синтаксис: Его очень легко выучить, особенно если вы уже знакомы с другими языками. Он идеален для задач автоматизации, не перегружая пользователя сложностями.
  • Легковесный: Интерпретатор Lua очень мал, что делает его идеальным для встраивания.
  • Мощный: Несмотря на простоту, поддерживает современные парадигмы программирования (функции первого класса, замыкания, корутины).
  • Язык-«хозяин»: В вашем случае хозяином является FEMM. FEMM предоставляет Lua-функции (API) для управления своей работой: создания геометрии, назначения материалов, запуска расчета и извлечения результатов.
Аналогия: Представьте, что FEMM — это умный, но очень медлительный сотрудник, который умеет делать все, но только через клики мышкой в своем интерфейсе. Lua-скрипт — это подробная письменная инструкция, которую вы ему даете. Выполняя инструкцию построчно, сотрудник работает в сотни раз быстрее и без ошибок.
2. Как автоматизировать FEMM с помощью Lua?
Это процесс из трех частей: написание скрипта, его запуск и обработка результатов.
Шаг 1: Написание Скрипта
  1. Изучите API FEMM: Это самое главное. Откройте документацию FEMM (femm42\docs\femm.html). Раздел «Lua Extensions» — это ваш справочник по всем доступным командам. Ключевые группы команд:
  • mi_... (Magnetic Interpreter): Команды для препроцессора (построение модели).
  • mi_addnode(0, 1) — добавить узел в точке (0,1).
  • mi_addsegment(0,0, 1,1) — добавить отрезок между (0,0) и (1,1).
  • mi_addblockprop("MaterialName", 1, 0, 0, 0, 0, 0) — задать свойства материала.
  • mi_setcurrent("CircuitName", 1.0) — задать ток в цепи.
  • mi_analyze(1) — запустить расчет.
  • mo_... (Magnetic Postprocessor): Команды для постпроцессора (анализ результатов).
  • mo_loadsolution() — загрузить результаты расчета.
  • mo_getpointvalues(0,0) — получить значения B, H в точке (0,0).
  • mo_blockintegral(2) — вычислить интеграл (2 — это код для энергии).
  • mo_getcircuitproperties("CircuitName") — получить свойства цепи (ток, потокосцепление).
  1. Пишите код:
  • Используйте любой текстовый редактор (Notepad++, VS Code, Sublime Text).
  • Код пишется последовательно, как инструкция.
  • Пример: Скрипт, который создает простой соленоид и считает его индуктивность.
-- 1. Создадим новую документ магнитостатики
newdocument(0)
mi_probdef(0, "millimeters", "planar", 1e-8, 0, 30)

-- 2. Нарисуем простую геометрию: сердечник и область воздуха
mi_addnode(0, 0)
mi_addnode(0, 50)
mi_addnode(50, 50)
mi_addnode(50, 0)
mi_addsegment(0,0, 0,50)
mi_addsegment(0,50, 50,50)
-- ... и т.д., рисуем прямоугольник

mi_addblockprop("Air", 0, 0, 0, 0, 0, 0) -- Назначим область воздухом
mi_addblockprop("Ferrite", 0, 0, 0, 0, 0, 0) -- Назначим область ферритом

-- 3. Создадим цепь и назначим ее группе сегментов (катушке)
mi_addcircprop("MyCoil", 1, 1) -- Создаем цепь "MyCoil", ток 1А, последовательно
-- ... (код, назначающий эту цепь сегментам катушки)

-- 4. Запустим расчет
mi_analyze(1) -- Аргумент (1) означает "закрыть окно по завершении"
mi_loadsolution() -- Переходим в постпроцессор

-- 5. Получим результат (индуктивность через энергию)
W = mo_blockintegral(2) -- Вычисляем энергию
I = 1 -- Наш заданный ток
L = 2 * W / (I * I) -- Рассчитываем индуктивность

-- 6. Выведем результат в сообщение
showconsole() -- Показываем консоль
print("Индуктивность катушки: " .. L .. " Гн")
  1. Это сильно упрощенный пример, но он показывает логику.
Шаг 2: Запуск Скрипта
Есть несколько способов запустить скрипт в FEMM:
  1. Через интерфейс FEMM (для отладки):
  • Откройте FEMM.
  • Перейдите в меню File -> Run Lua Script....
  • Выберите ваш .lua файл.
  1. Из командной строки (для автоматизации):
  • Это ключевой способ для интеграции с вашим Python/C# агентом.
  • Команда для запуска выглядит так:
"C:\Program Files\FEMM42\femm.exe" -lua-script="C:\path\to\your\script.lua"
  • Эта команда запустит FEMM, выполнит скрипт и закроет FEMM по завершении. Это можно делать в цикле для множества DXF-файлов.
  1. Изнутри другого скрипта (напр., на Python):
import subprocess
path_to_femm = "C:\\Program Files\\FEMM42\\femm.exe"
path_to_lua_script = "C:\\my_models\\simulate.lua"

# Запускаем FEMM со скриптом и ждем завершения
result = subprocess.run([path_to_femm, "-lua-script=" + path_to_lua_script], capture_output=True, text=True)
print(result.stdout) # В stdout будет все, что напечатало скрипт через print()
Шаг 3: Обработка Результатов и Создание Отчетов
Скрипт не должен просто показывать результаты в окне. Он должен записывать их в файл, чтобы ваш основной агент (на Python) мог их прочитать и использовать для следующих шагов (например, для LTSpice).
Модифицируем конец скрипта:
-- ... (код расчета)

-- Вместо print открываем файл и записываем туда данные
local output_file = io.open("C:\\results\\simulation_result.txt", "w")
output_file:write("L_sigma_energy, L_sigma_flux, Total_Energy\n") -- Заголовок CSV
output_file:write(string.format("%.6e, %.6e, %.6e\n", L_sigma_energy, L_sigma_flux, W_total))
output_file:close()

-- Можно записать и более сложные данные, например, поле вдоль линии
local data_file = io.open("C:\\results\\field_data.txt", "w")
for x = 0, 100, 1 do -- Проходим по линии от x=0 до x=100
    values = mo_getpointvalues(x, 0) -- Получаем Bx, By, Hx, Hy в точке (x,0)
    data_file:write(string.format("%f %f %f\n", x, values.Bx, values.By))
end
data_file:close()
. Инструкция по интеграции Lua в ваш проект агента
Ваш агент на Python будет управлять всем конвейером. Его работа с Lua будет выглядеть так:
  1. Подготовка: Агент получает от Unity массив DXF-файлов и параметров.
  2. Генерация скрипта: Агент динамически создает новый Lua-скрипт для каждого кадра. Он не пишется один раз, а генерируется как шаблон.
# Python код-генератор
template = """
open("my_model.fem")
mi_setcurrent("Coil", {current})
mi_readdxf("frame_{frame_number:03d}.dxf")
mi_analyze(1)
mi_loadsolution()
W = mo_blockintegral(2)
-- ... запись в файл results_{frame_number:03d}.txt
"""
for frame_number in frames:
    current = initial_currents[frame_number] # Ток из предыдущей итерации
    script_content = template.format(frame_number=frame_number, current=current)
    with open(f"script_{frame_number:03d}.lua", "w") as f:
        f.write(script_content)
Массовое выполнение: Агент в цикле вызывает FEMM для каждого сгенерированного скрипта.
for frame_number in frames:
    lua_script_path = f"script_{frame_number:03d}.lua"
    subprocess.run([femm_path, "-lua-script=" + lua_script_path])
  1. Анализ результатов: После завершения всех расчетов, агент читает все полученные текстовые файлы results_001.txt, results_002.txt... и строит сводную таблицу данных (поток, энергия, индуктивность) для передачи в LTSpice.
Итог: Lua — это ваш верный и мощный помощник, который превращает интерактивную программу FEMM в безмолвный, высокопроизводительный вычислительный сервис, управляемый извне. Вы не кликаете мышкой — вы даете ему сложные, составленные программы на лету, которые он безропотно и быстро выполняет.
Made on
Tilda