Composite Component Using import Statements

This example shows how you can use import statements to implement a composite component equivalent to the one described in Composite Component — DC Motor . The two components are identical, but, because of the use of the import statements, the amount of typing in the nodes and components sections is significantly reduced.

import foundation.electrical.electrical;   % electrical domain class definition
import foundation.electrical.elements.*;   % electrical elements
import foundation.mechanical.rotational.*; % mechanical rotational domain and elements
component DC_Motor1
% DC Motor1
% This block models a DC motor with an equivalent circuit comprising a
% series connection of a resistor, inductor, and electromechanical converter.
% Default values are as for the DC Motor Simscape example, ssc_dcmotor.

nodes
p = electrical;               % +:left
n = electrical;               % -:left
R = rotational;               % R:right
C = rotational;               % C:right
end

parameters
rotor_resistance    = { 3.9, 'Ohm' };           % Rotor Resistance
rotor_inductance    = { 12e-6, 'H' };           % Rotor Inductance
motor_inertia       = { 0.01, 'g*cm^2' };       % Inertia
breakaway_torque    = { 0.02e-3, 'N*m' };       % Breakaway friction torque
coulomb_torque      = { 0.02e-3, 'N*m' };       % Coulomb friction torque
viscous_coeff       = { 0, 'N*m*s/rad' };       % Viscous friction coefficient
breakaway_velocity  = { 0.1, 'rad/s' };         % Breakaway friction velocity
back_emf_constant   = { 0.072e-3, 'V/rpm' };    % Back EMF constant
end

components(ExternalAccess=observe)
rotorResistor                  = resistor(R = rotor_resistance);
rotorInductor                  = inductor(l = rotor_inductance);
rotationalElectroMechConverter = rotational_converter(K = back_emf_constant);
friction                       = friction(brkwy_trq = breakaway_torque, Col_trq = coulomb_torque, ...
visc_coef = viscous_coeff, brkwy_vel = breakaway_velocity);
motorInertia                   = inertia(inertia = motor_inertia);
end

connections
connect(p, rotorResistor.p);
connect(rotorResistor.n, rotorInductor.p);
connect(rotorInductor.n, rotationalElectroMechConverter.p);
connect(rotationalElectroMechConverter.n, n);
connect(rotationalElectroMechConverter.R, friction.R, motorInertia.I, R);
connect(rotationalElectroMechConverter.C, friction.C, C);
end

end

Consider the three import statements at the beginning of the file. The first one:

import foundation.electrical.electrical;

is a qualified import of the Foundation electrical domain class. Therefore, in the nodes section, you can define the p and n nodes simply as electrical.

The second statement:

import foundation.electrical.elements.*;

is an unqualified import, which imports all subpackages and classes under the foundation.electrical.elements subpackage and therefore gives you direct access to all the Foundation electrical components in the Elements sublibrary, such as inductor, resistor, and rotational_converter.

The third statement:

import foundation.mechanical.rotational.*;

is an unqualified import, which imports all subpackages and classes under the foundation.mechanical.rotational subpackage and therefore gives you direct access to the Foundation mechanical rotational domain definition (rotational) and components (such as friction and inertia).

The nodes block declares two electrical nodes, p and n, and two mechanical rotational nodes, R and C.

The components block declares all the member (constituent) components, using the following components from the Simscape™ Foundation library:

• Resistor

• Inductor

• Rotational Electromechanical Converter

• Rotational Friction

• Inertia

Because of the import statements at the top of the file, these classes already exist in the scope of the file, and you do not have to specify their complete names starting from the top-level package directory.