Варианты компонента — тепловой резистор

Следующий пример показывает линейный резистор с дополнительным тепловым портом. Компонент использует условные разделы, чтобы реализовать управляющую логику. annotations разделы в рамках условных переходов выборочно отсоединяют или скрывают соответствующие порты, параметры и переменные на основе значения параметра управления. Два варианта блока имеют различное количество портов, и поэтому значок пользовательского блока также изменяется соответственно.

component CondResistor
% Linear Resistor with Optional Thermal Port
% If "Model thermal effects" is set to "Off", the block represents a
% linear resistor. The voltage-current (V-I) relationship is V=I*R,
% where R is the constant resistance in ohms.
%
% If "Model thermal effects" is set to "On", the block represents a
% resistor with a thermal port. The resistance at temperature T1 is given by
% R(T) = R0*(1+alpha(T1-T0)), where R0 is the Nominal resistance at the
% Reference temperature T0, and alpha is the Temperature coefficient.

nodes
    p = foundation.electrical.electrical; % +:left
    n = foundation.electrical.electrical; % -:right
    H = foundation.thermal.thermal;       % H:left
end

parameters
    thermal_effects = simscape.enum.onoff.off; % Model thermal effects
end

parameters(ExternalAccess=none)
    R = { 1, 'Ohm' };         % Nominal resistance
    T0 = {300,'K'};           % Reference temperature
    alpha = {50e-6,'1/K'};    % Temperature coefficient
    tc = {10,'s'};            % Thermal time constant
    K_d = {1e-3,'W/K'};       % Dissipation factor
end

variables(ExternalAccess=none)
    i = { 0, 'A' };                                         % Current
    v = { 0, 'V' };                                         % Voltage
    T1 = {value = {300,'K'}, priority = priority.high};  % Temperature
end

branches
    i : p.i -> n.i;
end

equations
    v == p.v - n.v;
end

if thermal_effects == simscape.enum.onoff.off
    annotations
        % Show non-thermal settings
        Icon = 'custom_resistor.png';
        [R, i, v] : ExternalAccess=modify;
        % Hide thermal node
        H : ExternalAccess=none;
    end
    connections
        connect(H, *); % Connect hidden thermal node to reference
    end
    equations
        R*i == v;
        T1 == T0;    % Temperature is constant
    end

else
    annotations
        % Show thermal settings
        Icon = 'custom_resistor_thermal.png';
        [T1, T0, alpha, tc, K_d, H] : ExternalAccess=modify;
    end

    % Add heat flow + thermal equations
    variables(Access=private)
        Q = { 0, 'J/s' }; % Heat flow
    end
    branches
        Q : H.Q -> *
    end
    equations
        T1 == H.T;
        let
            mc = tc*K_d; % mc in Q = m*c*dT
            % Calculate R(T), protecting against negative values
            Rdem = R*(1+alpha*(T1-T0));
            R_T = if Rdem > 0, Rdem else {0,'Ohm'} end;
        in
            R_T*i == v; % Electrical equation
            mc * T1.der == Q + R_T*i*i; % Thermal equation
        end
    end

end
end

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

Если параметр управления, Model thermal effects, устанавливается на Off, блок представляет линейный резистор. Единственными отсоединенными параметрами блоков является Nominal resistance, вкладка Variables позволяет вам поставить цели для Current и Voltage, и значок блока имеет два порта, + и -.

Если параметр Model thermal effects устанавливается на On, блок представляет резистор тепловым портом температурно-зависимым сопротивлением. Параметры блоков, переменные, порты и значки пользовательского блока изменяются соответственно.

Похожие темы