Разделение на подклассы позволяет вам создавать модели компонента на основе других моделей компонента следовательно. Разделение на подклассы применяется только к моделям компонента, не моделям предметной области. Синтаксис для разделения на подклассы основан на MATLAB® системный синтаксис класса для разделения на подклассы использования < символ на линии объявления модели компонента:
component MyExtendedComponent < PackageName.MyBaseComponent % component implementation here end
Путем разделения на подклассы подкласс наследовал все члены (такие как параметры, переменные, узлы) от базового класса и может добавить собственные члены. При использовании подкласса как внешний клиент, весь public члены базового класса доступны. Весь public и protected члены базового класса доступны для событий, уравнения, структуры и других разделов подкласса. Подкласс не может объявить член с тем же идентификатором как public или protected член базового класса.
setup функция базового класса выполняется перед setup функция подкласса.
Примечание
Запуск в R2019a, использование setup не рекомендуется. Другие построения, доступные на языке Simscape™, позволяют вам достигнуть тех же результатов, не ставя под угрозу возможности во время выполнения. Для получения дополнительной информации смотрите, что настройка не рекомендуется.
Уравнения и подкласса и базового класса включены в полную систему уравнений.
Например, можно создать базовый класс ElectricalBranch.ssc, который задает электрическую ветвь с положительными и отрицательными внешними узлами, начальный ток и напряжение и отношение между переменными компонента и узлами (и поэтому, соединяет переменные компонента с Через и Через доменные переменные). Такой компонент не очень полезен как библиотечный блок, поэтому если вы не хотите, чтобы базовый класс появился как блок в пользовательской библиотеке, устанавливаете Hidden=true значение атрибута:
component (Hidden=true) ElectricalBranch
nodes
p = foundation.electrical.electrical; % +:left
n = foundation.electrical.electrical; % +:right
end
variables
i = { 0, 'A' };
v = { 0, 'V' };
end
branches
i : p.i -> n.i;
end
equations
v == p.v - n.v;
end
end
Если, например, ваш базовый класс находится в пакете под названием +MyElectrical, затем можно задать компонент подкласса Capacitor.ssc можно следующим образом:
component Capacitor < MyElectrical.ElectricalBranch
% Ideal Capacitor
parameters
c = { 1, 'F' };
end
equations
assert(c>0, 'Capacitance must be greater than zero');
i == c * v.der;
end
end
Компонент подкласса наследовал p и n узлы, i и v переменные с начальными значениями и отношение между и доменными переменными компонента из базового класса. Таким образом, Capacitor.ssc файл содержит только параметры и уравнения, характерные для конденсатора.
Можно заменить определенные члены базового класса в производных классах. Например, вы можете:
Замените значения по умолчанию параметров базового класса
Замените начальные значения по умолчанию, приоритеты и другие атрибуты переменных базового класса
Замените промежуточные звенья, объявленные в базовом классе
Замените атрибуты аннотации, объявленные в базовом классе, такие как Icon или ExternalAccess из членов базового класса
Вы не можете заменить Access атрибут членов базового класса. Например, если член базового класса объявляется как protected, это остается protected во всех производных классах.
Вы не можете заменить значения или атрибуты членов базового класса, объявленных как private.
Переопределение аннотации может быть условным выражением, за исключением типов аннотации, которые не принимают условное определение, такое как Side. Если активная ветвь явным образом не задает переопределение аннотации, или если ни одна из ветвей не активна и else ветвь явным образом не задана, аннотация наследовала атрибут от самого близкого базового класса в иерархии.
В этом примере, компонент подкласса Sub:
Заменяет значение параметра базового класса bp1.
Заменяет значение и приоритет переменной bv1 базового класса.
Заменяет промежуточное звено базового класса bm1.
Условно заменяет значок блока и видимость параметра базового класса bp2 на основе значения параметра управления cp1.
component Base
parameters
bp1 = 1;
bp2 = 2;
end
variables
bv1 = 0;
end
intermediates
bm1 = 2*bv1+bp1;
end
annotations
Icon = 'file1.jpg';
bp1 : ExternalAccess = modify;
bp2 : ExternalAccess = observe;
end
end
component Sub < Base(bp1 = 0.1,...
bv1.value = 1.1, ...
bv1.priority = priority.high, ...
bm1 = 2*bv1+v1+p1)
% override base class parameters, variables, intermediates
parameters
p1 = 1;
cp1 = true;
end
variables
v1 = 0;
end
if cp1
annotations
Icon = 'file2.jpg'; % override the block icon
bp2 : ExternalAccess = modify; % override bp2 visibility to 'modify'
end
else
annotations
bp2 : ExternalAccess = none; % override bp2 visibility to 'none'
end
end
equations
v1 == 2*p1+bp2
end
endОграничения для переопределяющих значений по умолчанию параметров и переменных из базового класса:
Вы не можете сослаться на другие параметры от базового класса. Например, при переопределении значения bp1, вы не можете сослаться на bp2.
Вы не можете сослаться на условные параметры.
Если подкласс является составным компонентом, вы не можете параметры ссылки от его компонентов члена.
Параметры, используемые в переопределяющих параметрах и переменных из базового класса, не могут быть конфигурируемым временем выполнения.
Эти ограничения не применяются к промежуточным звеньям. В примере, параметр p1 может быть время выполнения, конфигурируемое, потому что оно используется в переопределении промежуточного bm1. Однако, если это заменяло параметр базового класса bp1 (bp1 = p1), затем p1 был бы ограничен временем компиляции только.