Добавить общее ядро DEIF, эмуляцию приборов и переносимые панели Python/Qt. Расширить загрузчики F2812 и F28335, обновление Flash и профиль STM Invertor. Добавить альтернативный МНК Eigen, модели неисправностей и диагностику сигналов. Обновить справочники устройств, проекты CCS и регрессионные проверки.
34 lines
5.1 KiB
Python
34 lines
5.1 KiB
Python
"""Необязательные известные элементы последовательного эквивалента RLC.""" # Ввод не смешивает номиналы реального RC-снаббера с параметрами идентифицируемых полюсов.
|
|
try: # Поддерживаем современные и совместимые Windows-сборки.
|
|
from PySide6.QtCore import Signal # Одно изменение любого элемента делает старый подбор моделей неактуальным.
|
|
from PySide6.QtWidgets import QDoubleSpinBox, QHBoxLayout, QLabel, QWidget # Используем стандартные числовые поля Qt6.
|
|
except ImportError: # Qt5 получает тот же интерфейс без дополнительных зависимостей.
|
|
from PySide2.QtCore import Signal # Контракт сигналов одинаков на Windows 7 и новых системах.
|
|
from PySide2.QtWidgets import QDoubleSpinBox, QHBoxLayout, QLabel, QWidget # Набор полей и единицы не зависят от версии Qt.
|
|
|
|
|
|
class CircuitParameters(QWidget): # Компонент можно встроить в подробные параметры любого вида сравнения.
|
|
changed = Signal() # Владелец решает, запускать ли автоматический пересчёт или ожидать кнопку.
|
|
|
|
def __init__(self, parent=None): # По умолчанию ни один электрический элемент не предполагается известным.
|
|
super().__init__(parent) # Жизненным циклом компонента управляет родительская панель сравнения.
|
|
row = QHBoxLayout(self) # Три поля и пояснение занимают одну строку.
|
|
row.setContentsMargins(0, 0, 0, 0) # Сохраняем существующие отступы формы.
|
|
row.addWidget(QLabel('Эквивалентный последовательный RLC:')) # Явно называем топологию, к которой относятся формулы R/L и LC.
|
|
self.inductance, self.capacitance, self.resistance = QDoubleSpinBox(), QDoubleSpinBox(), QDoubleSpinBox() # Отдельное неизвестное значение разрешено у каждого элемента.
|
|
self.controls = (self.inductance, self.capacitance, self.resistance) # Общий список позволяет блокировать ввод во время рабочего задания.
|
|
for title, box, suffix in (('L', self.inductance, ' нГн'), ('C', self.capacitance, ' нФ'), ('R', self.resistance, ' Ом')): # Удобные единицы соответствуют обычным масштабам коммутационного контура.
|
|
row.addWidget(QLabel(title)) # Подпись отделяет физическую величину от единицы в поле.
|
|
box.setDecimals(6) # Дробные нГн, нФ и Ом сохраняются без грубого округления.
|
|
box.setRange(0., 1e12) # Ноль означает неизвестное значение; отрицательные пассивные элементы не допускаются.
|
|
box.setSpecialValueText('неизвестно') # Не скрываем отсутствие исходных электрических данных за произвольным номиналом.
|
|
box.setSuffix(suffix) # Единица видна при вводе любого положительного значения.
|
|
box.setMaximumWidth(170) # Ширина в логических пикселях оставляет место всем трём элементам.
|
|
box.setToolTip('Введите известный элемент последовательного эквивалента. Ноль — неизвестно. Это не автоматическая модель топологии RC-снаббера.') # Объяснение предотвращает неверную интерпретацию восстановленных номиналов.
|
|
box.valueChanged.connect(lambda _value: self.changed.emit()) # Любое изменение требует нового численного подбора и отчёта.
|
|
row.addWidget(box) # Поля располагаются в порядке L, C и R.
|
|
row.addStretch(1) # Свободная ширина не растягивает числовые поля.
|
|
|
|
def values(self): # Снимок значений фиксируется до запуска фоновой идентификации.
|
|
return dict(inductance_h=self.inductance.value() * 1e-9, capacitance_f=self.capacitance.value() * 1e-9, resistance_ohm=self.resistance.value()) # нГн и нФ переводятся в СИ; Ом уже соответствует внутренним формулам.
|