FEMM 5

Исследование 9 · FEMM 5 · встроенный Python

Идентификация асинхронной машины: обучающие и проверочные частоты

Схема замещения сводит распределённое поле машины к небольшому числу параметров: намагничивающей индуктивности, рассеянию и приведённому роторному сопротивлению. Параметры полезны только вместе с определённой нормировкой фазы, сектора и концов обмоток.

Выполненная серия содержит шесть частот 0,5; 1; 2; 3; 4; 5 Гц. Две частоты используются для подбора параметров, две — для независимого прогноза. Сравниваются постоянное роторное сопротивление и явно ограниченная частотная поправка.

Место в курсе.Геометрию, физическую постановку и результаты можно изучать вместе с основным занятием. Серийную программу и обработку разбирайте после введения во встроенный Python.

Объект, физическая модель и вывод соотношений

Соглашения об обозначениях и единицах
  • \(i(t)\), \(u(t)\) — мгновенные значения; \(\widehat I\), \(\widehat U\) — комплексные амплитуды; \(\underline I_{\text{д}}\), \(\underline U_{\text{д}}\) — комплексные действующие значения. Для синусоиды \(\widehat I=\sqrt{2}\,\underline I_{\text{д}}\); действующее значение тока равно \(|\underline I_{\text{д}}|\). Нормировка обязательно учитывается в формулах мощности.
  • \(\Phi=\int_S\mathbf B\cdot\mathrm d\mathbf S\) — поток через ориентированную поверхность; \(\Psi=\sum_k\oint_{C_k}\mathbf A\cdot\mathrm d\mathbf l\) — потокосцепление последовательных витков с согласованными замкнутыми контурами. Только при одинаковом сцепленном потоке каждого витка \(\Psi=N\Phi\). Обе величины измеряются в веберах: число витков безразмерно. Запись «Вб·виток» подчёркивает суммирование.
  • \(\theta_{\text{м}}\), \(\Omega\) (также \(\omega_{\text{мех}}\)) — механические угол и угловая скорость. Для основной гармоники \(\theta_{\text{э}}=p\theta_{\text{м}}\), \(\omega_{\text{э}}=p\Omega\), где \(p\) — число пар полюсов. Геометрический период зубцов задаётся отдельно. В производных по углу используйте радианы.
  • Статическая индуктивность \(L_{\text{ст}}=\Psi/i\) — наклон секущей из начала координат; это определение используется при \(\Psi(0)=0\) и \(i\ne0\). Динамическая индуктивность \(L_{\text{дин}}=\partial\Psi/\partial i\) — наклон касательной (дифференциальная, инкрементальная); положение и остальные токи фиксированы. Для линейной характеристики без смещения обе равны одной индуктивности \(L\). При постоянных магнитах и взаимном возбуждении сначала учитывают ненулевое смещение потокосцепления.
  • Положительные направления, оси и специальные индексы определяются в конкретной задаче. Единицу берите из условия или заголовка таблицы; перед подстановкой в формулу СИ переводите миллиметры в метры, миллигенри в генри и градусы в радианы.
  • Численные результаты обычно показаны с четырьмя значащими цифрами; для сравнения близких значений в таблицах сходимости сохранено больше цифр. Полные значения остаются в исходных расчётных данных. Малые остатки вычисления координат на осях показаны как ноль; малые физические величины сохраняются в показательной записи.

Положительная последовательность и ветвь ротора

При симметричных трёхфазных токах полезно выделить положительную последовательность напряжений. Она даёт устойчивое комплексное Z^{+} даже тогда, когда отдельные фазные значения секторной постановки численно немного различаются.

Простейшая низкочастотная ветвь состоит из индуктивности рассеяния, последовательно соединённой с параллельным контуром намагничивания и роторного сопротивления. Комплексное деление получается обычным сложением проводимостей параллельных ветвей.

Учебная поправка R_{2}(f)=R_{20}(1+kf²) учитывает ограниченную частотную тенденцию вытеснения и распределения тока. Положительность параметров обеспечивается при подборе; это не универсальный закон глубокого паза на любых частотах.

a=\exp(\mathrm i2\pi/3),\quad \widehat U^{+}=\frac{\widehat U_A+a\widehat U_B+a^2\widehat U_C}{3},\quad \underline Z^{+}=\frac{\widehat U^{+}}{\widehat I^{+}}
(Р9.1)
Порядок фаз соответствует токам конкретной модели; при ином порядке меняется выбранная последовательность.
\underline Z_{\mathrm{ветв}}(f)=\mathrm i\omega L_{\sigma}+\frac{\mathrm i\omega L_{\mathrm{м}}R_2(f)}{R_2(f)+\mathrm i\omega L_{\mathrm{м}}},\qquad R_2(f)=R_{20}(1+kf^2)
(Р9.2)
Параметры этого разбора относятся к секторной приведённой ветви; внешнее статорное сопротивление ведётся отдельно.

Идентифицируемость и геометрические поправки

Одна комплексная частота даёт две вещественные зависимости, поэтому три независимых параметра по ней не определяются однозначно. В опыте с исключением одной частоты фиксируется L_{\sigma}=0{,}005 Гн как явная априорная гипотеза; свободными остаются два параметра.

Концевые кольца отсутствуют в плоском сечении. Их влияние в этом комплекте добавлено через выбранную геометрию колец и эффективную проводимость стержней. Это отдельный учёт физического пути тока, а не произвольный коэффициент для улучшения совпадения.

Выборка и проверка разделены: малый остаток на обучающих частотах не доказывает хорошего прогноза. Проверочные 2 и 4 Гц позволяют сравнить два закона сопротивления без повторной подгонки.

При исследовании сетки нужно считать элементы в проводниках, а не только всю группу ротора: эта группа содержит и сталь. Инвентаризация проводников приложена отдельно.

\varepsilon_Z(f)=\frac{|\underline Z_{\mathrm{модель}}(f)-\underline Z_{\mathrm{FEMM}}(f)|}{|\underline Z_{\mathrm{FEMM}}(f)|}
(Р9.3)
Проверочная ошибка вычисляется по частотам, не использованным для настройки.

Как вынести концевые кольца за пределы 2D-сечения

В таблицах идентификации сохранён исходный низкочастотный опыт с проводимостью стержней 34,45 МСм/м. Значение 21,0608 МСм/м применяется к отдельному файлу ring-effective-source-model.fem; эти две версии не называются одним и тем же входом.

В каждом кольце токи соседних сегментов различаются на ток присоединённого стержня. Периодическое замыкание требует нулевой суммы токов всех стержней. Из этого дискретного закона Кирхгофа восстанавливают токи сегментов; неопределённую постоянную кольцевого тока выбирают так, чтобы минимизировать потери при отсутствии внешнего кольцевого источника.

Сопротивление сегмента получается по длине дуги 2\pi r/Zрот, сечению и проводимости. Для двух одинаковых колец суммарная средняя мощность равна удвоенной мощности одного кольца; при амплитудных токах коэффициенты 2 и 1/2 взаимно сокращаются.

Если вычисленное отношение ηкол=Pкол/Pстерж сохраняется приближённо постоянным, последовательное увеличение сопротивления стержней в 1+ηкол раз можно внести в поле уменьшением проводимости в то же число раз. Это ограниченный эквивалент потерь, не трёхмерная модель колец.

R_{\mathrm{сег}}=\frac{2\pi r_{\mathrm{кол}}}{Z_{\mathrm{рот}}\sigma_{\mathrm{кол}}S_{\mathrm{кол}}},\quad I_{\mathrm{сег},j}-I_{\mathrm{сег},j-1}=I_{\mathrm{стерж},j},\quad \sum_j I_{\mathrm{стерж},j}=0
(Р9.4)
Здесь Zрот=32, rкол=0,036 м, Sкол=50 мм²; знак токов фиксируют единым обходом кольца.
P_{\mathrm{кол}}=2\cdot\frac12\sum_jR_{\mathrm{сег}}|\widehat I_{\mathrm{сег},j}|^2,\quad \eta_{\mathrm{кол}}=\frac{P_{\mathrm{кол}}}{P_{\mathrm{стерж}}},\quad \sigma_{\mathrm{эфф}}=\frac{\sigma_{\mathrm{стерж}}}{1+\eta_{\mathrm{кол}}}
(Р9.5)
При ηкол=0,635740 проводимость 34,45 МСм/м превращается в 21,0608 МСм/м.

Постановка и последовательность расчёта

Таблица Р9.1. Исходные данные
ВеличинаЗначениеЕдиница
Сектор90{}^\circ
Пары полюсов2
Глубина100мм
Обучающие частоты1;3Гц
Проверочные частоты2;4Гц
Проводимость отдельной модели с эквивалентом колец21,06МСм/м
  1. Запустите reproduce.py и проверьте новое поле контрольной частоты.
  2. В reference/measurements.json отдельно изучите протокол, частотные данные, итоговые параметры и проверочные прогнозы.
  3. Полные программы, названные далее, запускайте через run-series.py из корня рабочей папки: выберите SERIES_NUMBER по списку README.html. Диспетчер сам устанавливает подпапку и контекст исходной программы; прежний рабочий каталог FEMM не важен.
  4. Для полной серии выполните rebuild-frequency-matrix.py; для повторения подбора и проверок — rebuild-identification.py встроенным Python FEMM 5.
  5. Восстановите Z^{+} и сравните обе модели на 2 и 4 Гц; затем объясните, почему нельзя освободить три параметра после удаления одной из двух обучающих частот.
  6. Сопоставьте исходную и уточнённую сетку проводников; проверьте отдельный реестр сопротивлений активных частей, лобовых частей и колец.

Численные результаты и их проверка

Показаны сохранённые результаты FEMM 5. Переключатель и курсор исследуют готовую серию; повторный расчёт выполняется программой в установленном FEMM.

Таблица Р9.2. Численные данные
Закон сопротивленияПроверочная частота, ГцRe Zпрогноз, ОмIm Zпрогноз, ОмОшибка, %
Постоянное R₂20,385702270,246881010,021742353
Постоянное R₂40,449533920,229592460,10948325
R₂₀(1+kf²)20,385639480,24680180,0050448402
R₂₀(1+kf²)40,450046140,229855530,017773415

Контрольные сопоставления

Как воспроизвести в FEMM 5

Скачайте программу и необходимые модели, данные и инструкции из списка ниже. Сохраните указанные имена файлов и структуру подпапок. Откройте программу в редакторе встроенного Python FEMM 5 и запустите её. Внешний CPython для управления FEMM не требуется.

Скачайте все нужные файлы со страницы исследования в новую папку, сохранив имена и структуру подпапок. Выполните reproduce.py встроенным Python FEMM 5: проверяются хеши, заново решаются контрольные поля и пересчитываются численные проверки таблиц. Рабочий каталог определяется по пути сохранённого сценария. Полные программы запускайте через run-series.py; номер SERIES_NUMBER выбирается по списку в README.html.

Программа встроенного Python

Текст программы
# Выполняется только встроенным Python FEMM 5.
# Распакуйте весь ZIP в новую папку и запустите этот файл через меню Scripts.
# Запускайте сохранённый файл целиком: путь передаётся в sys.argv[0].
import os, sys, json, math, hashlib
assert sys.implementation.name == 'micropython', 'Нужен встроенный Python FEMM 5'
_saved_file = globals().get('__file__') or (sys.argv[0] if sys.argv else '')
assert _saved_file and os.path.isfile(_saved_file), 'Запустите сохранённый файл из полного распакованного комплекта'
os.chdir(os.path.dirname(os.path.abspath(_saved_file)))
with open('manifest.json') as f: manifest = json.load(f)

def digest(path):
    h = hashlib.sha256()
    with open(path, 'rb') as f:
        while True:
            b = f.read(65536)
            if not b: break
            h.update(b)
    return ''.join('%02x' % b for b in h.digest())

# До расчёта проверяем переносимость и неизменность всех приложенных входов.
for item in manifest['files']:
    assert digest(item['path']) == item['sha256'], 'Изменён вход ' + item['path']
with open('expected-native.json') as f: cases = json.load(f)
os.mkdir('reproduced')   # Отказ от перезаписи предыдущего результата намеренный.
out = {'implementation': str(sys.implementation), 'runtime': sys.version,
       'case_id': manifest['case_id'], 'fresh_fields': [], 'checks': []}

def z(v):
    if isinstance(v, dict): return complex(v['re'], v['im'])
    if isinstance(v, (list, tuple)): return complex(v[0], v[1])
    return complex(v)

def serial(v):
    if isinstance(v, complex): return [v.real, v.imag]
    if isinstance(v, (list, tuple)): return [serial(t) for t in v]
    if isinstance(v, dict): return {k: serial(t) for k,t in v.items()}
    return v

def check(label, actual, expected, tolerance):
    error = abs(z(actual) - z(expected))
    out['checks'].append({'name':label,'actual':serial(actual),
                         'expected':serial(expected),'error':error,
                         'tolerance':tolerance,'passed':error <= tolerance})

for j, spec in enumerate(cases):
    for cmd in ('mo_close', 'mi_close'):
        try: globals()[cmd]()
        except Exception: pass
    opendocument(spec['model'])
    mi_saveas('reproduced/control-' + str(j) + '.fem')
    if 'frequency_Hz' in spec:
        mi_probdef(spec['frequency_Hz'], 'millimeters', 'planar', 1e-8,
                   spec.get('depth_mm',100), 20)
    for name,value in spec.get('set_circuits',{}).items():
        mi_modifycircprop(name, 1, z(value))
    if spec.get('rotate_deg'):
        mi_selectgroup(2); mi_moverotate(0,0,spec['rotate_deg'],4); mi_clearselected()
    if 'boundary' in spec:
        name,index,value = spec['boundary']; mi_modifyboundprop(name,index,value)
    mi_saveas('reproduced/control-' + str(j) + '.fem')
    mi_analyze(1); mi_loadsolution(); mo_smooth('off')
    row = {'model':spec['model'],'elements':mo_numelements(),'nodes':mo_numnodes(),
           'problem':serial(mo_getprobleminfo()),'circuits':{}}
    for name, values in spec.get('circuits',{}).items():
        actual = list(mo_getcircuitproperties(name)); row['circuits'][name] = serial(actual)
        for k,expected in enumerate(values):
            check('Поле '+str(j)+' '+name+' '+('I','U','Psi')[k], actual[k], expected,
                  max(1e-9, 1e-5*abs(z(expected))))
    mo_clearblock(); mo_groupselectblock()
    for key,expected in spec.get('integrals',{}).items():
        actual=mo_blockintegral(int(key)); row['integral_'+key]=serial(actual)
        check('Объёмный интеграл '+key,actual,expected,max(1e-7,1e-5*abs(z(expected))))
    mo_clearblock()
    if 'gap_torque' in spec:
        q=spec['gap_torque']; actual=mo_gapintegral(q['name'],0)
        if isinstance(actual,(list,tuple)): actual=actual[0]
        row['gap_torque_Nm']=serial(actual)
        check('Момент границы AGE',actual,q['expected'],q['tolerance'])
    if 'torque' in spec:
        q=spec['torque'];mo_groupselectblock(q['group']);actual=mo_blockintegral(22);mo_clearblock()
        row['torque_Nm']=serial(actual);check('Момент WST',actual,q['expected'],q['tolerance'])
    if 'magnet_probe' in spec:
        # Исходные графические минимумы получены со сглаживанием поля.
        # Настройку сохраняем явно, чтобы сравнивать одинаковые величины.
        mo_smooth('on')
        q=spec['magnet_probe']
        for p in q['extrema']:
            x,y=p['minimum_point_mm'];angle=math.atan2(y,x)
            sign=1 if p['pole']%2==0 else -1;v=mo_getpointvalues(x,y)
            h=(z(v[1]).real*sign*math.cos(angle)+z(v[2]).real*sign*math.sin(angle)-q['Br_T'])/(4*math.pi*1e-7*q['mu'])
            check('Физический H вдоль намагничивания полюса '+str(p['pole']),h,p['Hparallel_min_A_m'],.02)
    out['fresh_fields'].append(row)
    with open('reproduced/native-result.json','w') as f: json.dump(out,f)
    mo_close();mi_close()

# Повторяем предметные арифметические проверки сохранённых серий.
with open('postprocess.py') as f: exec(f.read(),globals())
out['passed']=all(q['passed'] for q in out['checks'])
with open('reproduced/native-result.json','w') as f: json.dump(out,f)
print('AUDIT_CASE',out['case_id'],'FIELDS',len(out['fresh_fields']),
      'CHECKS',len(out['checks']),'PASSED',out['passed'])
assert out['passed'], 'Есть несогласованные численные проверки; см. native-result.json'

Как трактовать результат

Расчётная среда: FEMM 5.0 06Oct2026; встроенный MicroPython; без внешнего Python/COM/TCP

Введение в устройство и принцип действия объекта, вывод учебных соотношений и пояснения к результатам написаны для этого курса. Численные результаты и заимствованные методы связаны с указанными ниже исходными материалами.

Источники и дальнейшее чтение

  1. [37]
  2. [33]

← Все расчётные исследования