Documentation

Subsystem, Atomic Subsystem, Nonvirtual Subsystem, CodeReuse Subsystem

Group blocks to create model hierarchy

  • Library:
  • Ports & Subsystems

Description

A Subsystem block contains a subset of blocks within a model or system. The Subsystem block can represent a virtual subsystem or a nonvirtual subsystem.

  • Nonvirtual subsystem – Control when the contents of the subsystem are evaluated as a single unit (atomic execution). Create conditionally executed subsystems that run only when an event occurs on a triggering, function-call, action, or enabling input (see Conditionally Executed Subsystems).

  • Virtual subsystems – Subsystem is neither conditionally nor atomically execuited. Virtual subsystems do not have checksums.To determine if a subsystem is virtual, use the get_param function for the Boolean block parameter IsSubsystemVirtual.

An atomic subsystem is a Subsystem block with the block parameter Treat as atomic unit selected.

A codereuse subsystem is a Subsystem block with the parameter Treat as atomic unit selected and the parameter Function packaging set to Reusable function, specifying the function code generation format for the subsystem.

To create a subsystem, do one of the following:

  • Copy a Subsystem block from the Ports & Subsystems library into your model. Then add blocks to the subsystem by opening the Subsystem block and copying blocks into it.

  • Select all blocks and lines that make up the subsystem, and select Diagram > Subsystem & Model Reference > Create Subsystem from Selection. Simulink® replaces the blocks with a Subsystem block, along with the necessary Inport and Outport blocks to reflect signals entering and leaving the subsystem.

The number of input ports drawn on the Subsystem block icon corresponds to the number of Inport blocks in the subsystem. Similarly, the number of output ports drawn on the block corresponds to the number of Outport blocks in the subsystem.

The Subsystem block supports signal label propagation through subsystem Inport and Outport blocks.

Ports

Input

expand all

Placing an Inport block in a subsystem block adds an external input port to the block. The port label matches the name of the Inport block.

Use Inport blocks to get signals from the local environment.

Data Types: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | Boolean | fixed point | enumerated | bus

Output

expand all

Placing an Outport block in a subsystem block adds an output port from the block. The port label on the subsystem block is the name of the Outport block.

Use Outport blocks to send signals to the local environment.

Data Types: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | Boolean | fixed point | enumerated | bus

Parameters

expand all

Parameters on the Code Generation tab require a Simulink Coder™ or Embedded Coder® license.

Main

Select how to display port lables on the Subsystem block icon.

none

Do not display port labels.

FromPortIcon

If the corresponding port icon displays a signal name, display the signal name on the Subsystem block. Otherwise, display the port block name.

FromPortBlockName

Display the name of the corresponding port block on the Subsystem block.

SignalName

If a signal name exists, display the name of the signal connected to the port on the Subsystem block. Otherwise, display the name of the corresponding port block.

Programmatic Use

Parameter: ShowPortLabels
Type: character vector
Value: 'FromPortIcon' | 'FromPortBlockName' | 'SignalName'
Default: 'FromPortIcon'

Control user access to the contents of the subsystem.

ReadWrite

Enable opening and modification of subsystem contents.

ReadOnly

Enable opening but not modification of the subsystem. If the subsystem resides in a block library, you can create and open links to the subsystem and can make and modify local copies of the subsystem but cannot change the permissions or modify the contents of the original library instance.

NoReadOrWrite

Disable opening or modification of subsystem. If the subsystem resides in a library, you can create links to the subsystem in a model but cannot open, modify, change permissions, or create local copies of the subsystem.

Programmatic Use

Parameter: Permissions
Type: character vector
Value: 'ReadWrite' | 'ReadOnly' | 'NoReadOrWrite'
Default: 'ReadWrite'

Enter name of a function to be called if an error occurs while Simulink is executing the subsystem.

Simulink passes two arguments to the function: the handle of the subsystem and a character vector that specifies the error type. If no function is specified, Simulink displays a generic error message if executing the subsystem causes an error.

Programmatic Use

Parameter: ErrorFcn
Type: character vector
Value: '' | '<function name>'
Default: ''

Select whether to resolve names of workspace variables referenced by this subsystem.

See Symbol Resolution and Symbol Resolution Process in the Simulink User's Guide for more information.

All

Resolve all names of workspace variables used by this subsystem, including those used to specify block parameter values and Simulink data objects (for example, Simulink.Signal objects).

ExplicitOnly

Resolve only names of workspace variables used to specify block parameter values, data store memory (where no block exists), signals, and states marked as “must resolve”.

None

Do not resolve any workspace variable names.

Programmatic Use

Parameter: PermitHierarchicalResolution
Type: character vector
Value: 'All' | 'ExplicitOnly' | 'None'
Default: 'All'

Causes Simulink to treat the subsystem as a unit when determining the execution order of block methods.

off

Treat all blocks in the subsystem as being at the same level in the model hierarchy as the subsystem when determining block method execution order. This can cause execution of methods of blocks in the subsystem to be interleaved with execution of methods of blocks outside the subsystem.

on

Treat the subsystem as a unit when determining the execution order of block methods. For example, when it needs to compute the output of the subsystem, Simulink invokes the output methods of all the blocks in the subsystem before invoking the output methods of other blocks at the same level as the subsystem block.

Dependency

Selecting this parameter, enables the Minimize algebraic loop occurrences, Sample time, and Function packaging parameters. Using Function packaging requires a Simulink Coder license.

Programmatic Use

Parameter: TreatAsAtomicUnit
Type: character vector
Value: 'off' | 'on'
Default: 'off'

Try to eliminate any artificial algebraic loops that include the atomic subsystem

See also Eliminate Artificial Algebraic Loops Caused by Atomic Subsystems.

off

Do not try to eliminate any artificial algebraic loops that include the atomic subsystem.

on

Try to eliminate any artificial algebraic loops that include the atomic subsystem.

Dependency

To enable this parameter, select the Treat as atomic unit parameter.

Programmatic Use

Parameter: MinAlgLoopOccurrences
Type: character vector
Value: 'off' | 'on'
Default: 'off'

Specify whether all blocks in this subsystem must run at the same rate or can run at different rates.

  • If the blocks in the subsystem can run at different rates, specify the subsystem's sample time as inherited (-1).

  • If all blocks must run at the same rate, specify the sample time corresponding to this rate as the value of the Sample time parameter.

  • If any of the blocks in the subsystem specify a different sample time (other than -1 or inf), Simulink displays an error message when you update or simulate the model. For example, suppose all the blocks in the subsystem must run 5 times a second. To ensure this, specify the sample time of the subsystem as 0.2. In this example, if any of the blocks in the subsystem specify a sample time other than 0.2, -1, or inf, Simulink displays an error when you update or simulate the model.

-1

Specify inherited sample time. Use this sample time if the blocks in the subsystem can run at different rates.

[Ts 0]

Specify periodic sample time.

Dependency

To enable this parameter, select the Treat as atomic unit parameter.

Programmatic Use

Parameter: SystemSampleTime
Type: character vector
Value: '-1' | '[Ts 0]'
Default: '-1'

Enable execution context propagation across the boundary of this subsystem.

off

Do not enable execution context propagation across this subsystem's boundary.

on

Enable execution context propagation across this subsystem's boundary.

Dependency

Enable this parameter by adding an Enable port or Trigger port block to the Subsystem block.

Programmatic Use

Parameter: PropExecContextOutsideSubsystem
Type: character vector
Value: 'off' | 'on'
Default: 'off'

Specify variant control (condition) expression that executes a variant Simulink Function block when the expression evaluates to true.

See also Simulink.Variant

Variant

Default name for a logical (Boolean) expression.

logical expression

A logical (Boolean) expression or a Simulink.Variant object representing a logical expression.

The function is activated when the expression evaluates to true.

If you want to generate code for your model, define the variables in the expression as Simulink.Parameter objects.

Dependency

Enable this parameter by adding a Subsystem block inside a Variant Subsystem block.

Programmatic Use

Block parameter: VariantControl
Type: character vector
Value: 'Variant' | '<logical expression>'
Default: 'Variant'

Causes Simulink to treat the subsystem as a unit when propagating variant conditions from Variant Source blocks or to Variant Sink blocks.

on

Simulink treats the subsystem as a unit when propagating variant conditions from Variant Source blocks or to Variant Sink blocks. For example, when Simulink computes the variant condition of the subsystem, it propagates that condition to all the blocks in the subsystem.

off

Simulink treats all blocks in the subsystem as being at the same level in the model hierarchy as the subsystem itself when determining their variant condition.

Programmatic Use

Parameter: TreatAsGroupedWhenPropagatingVariantConditions
Type: character vector
Value: 'on' | 'off'
Default: 'on'

Code Generation

Select the code format to be generated for an atomic (nonvirtual) subsystem.

Auto

Simulink Coder chooses the optimal format for you based on the type and number of instances of the subsystem that exist in the model.

Inline

Simulink Coder inlines the subsystem unconditionally.

Nonreusable function

Simulink Coder explicitly generates a separate function in a separate file. Subsystems with this setting generate functions that might have arguments depending on the Function interface parameter setting. You can name the generated function and file using parameters Function name and File name (no extension). These functions are not reentrant.

Reusable function

Simulink Coder generates a function with arguments that allows reuse of subsystem code when a model includes multiple instances of the subsystem.

This option also generates a function with arguments that allows subsystem code to be reused in the generated code of a model reference hierarchy that includes multiple instances of a subsystem across referenced models. In this case, the subsystem must be in a library.

Tips

  • When you want multiple instances of a subsystem to be represented as one reusable function, you can designate each one of them as Auto or as Reusable function. It is best to use one or the other, as using both creates two reusable functions, one for each designation. The outcomes of these choices differ only when reuse is not possible. Selecting Auto does not allow control of the function or file name for the subsystem code.

  • The Reusable function and Auto options both try to determine if multiple instances of a subsystem exist and if the code can be reused. The difference between the options' behavior is that when reuse is not possible:

    • Auto yields inlined code, or if circumstances prohibit inlining, separate functions for each subsystem instance.

    • Reusable function yields a separate function with arguments for each subsystem instance in the model.

  • If you select Reusable function while your generated code is under source control, set File name options to Use subsystem name, Use function name, or User specified. Otherwise, the names of your code files change whenever you modify your model, which prevents source control on your files.

Dependency

  • This parameter requires a Simulink Coder license.

  • To enable this parameter, select Treat as atomic unit.

  • Setting this parameter to Nonreusable function or Reusable function enables the following parameters:

    • Function name options

    • File name options

    • Memory section for initialize/terminate functions (requires a license for Embedded Coder® and an ERT-based system target file)

    • Memory section for execution functions (requires a license for Embedded Coder and an ERT-based system target file)

  • Setting this parameter to Nonreusable function enables Function with separate data (requires a license for Embedded Coder and an ERT-based system target file).

Programmatic Use

Parameter: RTWSystemCode
Type: character vector
Value: 'Auto' | 'Inline' | 'Nonreusable function' | 'Reusable function'
Default: 'Auto'

See also

Select how Simulink Coder names the function it generates for the subsystem.

If you have an Embedded Coder license, you can control function names with options on the Configuration Parameter Code Generation > Symbols pane.

Auto

Assign a unique function name using the default naming convention, model_subsystem(), where model is the name of the model and subsystem is the name of the subsystem (or that of an identical one when code is being reused).

If you select Reusable function for the Function packaging parameter and there are multiple instances of the reusable subsystem in a model reference hierarchy, in order to generate reusable code for the subsystem, Function name options must be set to Auto.

Use subsystem name

Use the subsystem name as the function name. Be default, the function name uses the naming convention model_subsystem.

Note

When a subsystem is in a library block and the subsystem parameter Function packaging is set to Reusable function, if you set the Use subsystem name option, the code generator uses the name of the library block for the subsystem's function name and file name.

User specified

Enable the Function name field. Enter any legal C or C++ function name, which must be unique.

Dependency

  • This parameter requires a Simulink Coder license.

  • Setting Code generation function packaging to Nonreusable function or Reusable function enables this parameter.

  • Setting this parameter to User specified enables the Code generation function name parameter.

Programmatic Use

Parameter: RTWFcnNameOpts
Type: character vector
Value: 'Auto' | 'Use subsystem name' | 'User specified'
Default: 'Auto'

See also

For more information, see Code Generation of Subsystems (Simulink Coder).

Specify a unique, valid C or C++ function name for subsystem code.

Use this parameter if you want to give the function a specific name instead of allowing the Simulink Coder code generator to assign its own autogenerated name or use the subsystem name. For more information, see Code Generation of Subsystems (Simulink Coder).

Dependency

  • This parameter requires a Simulink Coder license.

  • To enable this parameter, set the Function name options parameter to User specified.

Programmatic Use

Parameter: RTWFcnName
Type: character vector
Value: '' | '<function name>'
Default: ''

Select how Simulink Coder names the separate file for the function it generates for the subsystem.

See Block-Specific Parameters for the command-line information.

Auto

Depending on the configuration of the subsystem and how many instances are in the model, Auto yields different results:

  • If the code generator does not generate a separate file for the subsystem, the subsystem code is generated within the code module generated from the subsystem's parent system. If the subsystem's parent is the model itself, the subsystem code is generated within model.c or model.cpp.

  • If you select Reusable function for the Function packaging parameter and your generated code is under source control, consider specifying a File name options value other than Auto. This prevents the generated file name from changing due to unrelated model modifications, which is problematic for using source control to manage configurations.

  • If you select Reusable function for the Function packaging parameter and there are multiple instances of the reusable subsystem in a model reference hierarchy, in order to generate reusable code for the subsystem, File name options must be set to Auto.

Use subsystem name

The code generator generates a separate file, using the subsystem (or library block) name as the file name.

Note

When File name options is set to Use subsystem name, the subsystem file name is mangled if the model contains Model blocks, or if a model reference target is being generated for the model. In these situations, the file name for the subsystem consists of the subsystem name prefixed by the model name.

Use function name

The code generator uses the function name specified by Function name options) as the file name.

User specified

This option enables the File name (no extension) text entry field. The code generator uses the name you enter as the file name. Enter any file name, but do not include the .c or .cpp (or any other) extension. This file name need not be unique.

Note

While a subsystem source file name need not be unique, you must avoid giving nonunique names that result in cyclic dependencies (for example, sys_a.h includes sys_b.h, sys_b.h includes sys_c.h, and sys_c.h includes sys_a.h).

Dependency

  • This parameter requires a Simulink Coder license.

  • To enable this parameter, set Function packaging to Nonreusable function or Reusable function.

  • Setting this parameter to User specified enables the File name (no externsion) parameter.

Programmatic Use

Parameter: RTWFileNameOpts
Type: character vector
Value: 'Auto' | 'Use subsystem name' | 'Use function name' | 'User specified'
Default: 'Auto'

The filename that you specify does not have to be unique. However, avoid giving non-unique names that result in cyclic dependencies (for example, sys_a.h includes sys_b.h, sys_b.h includes sys_c.h, and sys_c.h includes sys_a.h).

For more information, see Code Generation of Subsystems (Simulink Coder).

Dependency

  • This parameter requires a Simulink Coder license.

  • To enable this parameter, set File name options to User specified.

Programmatic Use

Parameter: RTWFileName
Type: character vector
Value: '' | '<file name>'
Default: ''

Generate subsystem function code in which the internal data for an atomic subsystem is separated from its parent model and is owned by the subsystem.

off

Do not generate subsystem function code in which the internal data for an atomic subsystem is separated from its parent model and is owned by the subsystem.

on

Generate subsystem function code in which the internal data for an atomic subsystem is separated from its parent model and is owned by the subsystem. The subsystem data structure is declared independently from the parent model data structures. A subsystem with separate data has its own block I/O and DWork data structure. As a result, the generated code for the subsystem is easier to trace and test. The data separation also tends to reduce the maximum size of global data structures throughout the model, because they are split into multiple data structures.

Dependency

  • This parameter requires a license for Embedded Coder and an ERT-based system target file.

  • To enable this parameter, set Function packaging to Nonreusable function.

  • Selecting this parameter enables these parameters:

    • Memory section for constants

    • Memory section for internal data

    • Memory section for parameters

Programmatic Use

Parameter: FunctionWithSeparateData
Type: character vector
Value: 'off' | 'on'
Default: 'off'

See also

Select to use arguments with generated function.

void_void

Generate a function without arguments and pass data as global variables. For example:

void subsystem_function(void)

Allow arguments

Generate a function that uses arguments instead of passing data as global variables. This specification reduces global RAM. It might reduce code size and improve execution speed, and allow the code generator to apply additional optimizations. For example:

void subsystem_function(real_T rtu_In1, real_T rtu_In2, 
                        real_T *rty_Out1)

Dependency

  • This parameter requires an Embedded Coder license and an ERT-based system target file.

  • To enable this parameter, set Function packaging to Nonreusable function.

Programmatic Use

Parameter: FunctionInterfaceSpec
Type: character vector
Value: 'void_void' | 'Allow arguments'
Default: 'void_void'

See also

Select how Embedded Coder applies memory sections to the subsystem initialization and termination functions.

Inherit from model

Apply the root model's memory sections to the subsystem's function code

Default

Do not apply memory sections to the subsystem's system code, overriding any model-level specification

The memory section of interest

Apply one of the model's memory sections to the subsystem

Tips

Dependency

  • This parameter requires a license for Embedded Coder software and an ERT-based system target file.

  • To enable this parameter, set Function packaging to Nonreusable function or Reusable function.

Programmatic Use

Parameter: RTWMemSecFuncInitTerm
Type: character vector
Value: 'Inherit from model' | 'Default' | 'The memory section of interest'
Default: 'Inherit from model'

See also

Select how Embedded Coder applies memory sections to the subsystem's execution functions.

Inherit from model

Apply the root model's memory sections to the subsystem's function code

Default

Do not apply memory sections to the subsystem system code, overriding any model-level specification

The memory section of interest

Apply one of the model's memory sections to the subsystem

Tips

Dependency

  • This parameter requires a license for Embedded Coder software and an ERT-based system target file.

  • To enable this parameter, set Function packaging to Nonreusable function or Reusable function.

Programmatic Use

Parameter: RTWMemSecFuncExecute
Type: character vector
Value: 'Inherit from model' | 'Default' | 'The memory section of interest'
Default: 'Inherit from model'

See also

Select how Embedded Coder applies memory sections to the subsystem constants.

Inherit from model

Apply the root model's memory sections to the subsystem's data

Default

Not apply memory sections to the subsystem's data, overriding any model-level specification

The memory section of interest

Apply one of the model's memory sections to the subsystem

Tips

  • The memory section that you specify applies to the corresponding global data structures in the generated code. For basic information about the global data structures generated for atomic subsystems, see Default Data Structures in the Generated Code (Simulink Coder).

  • Can be useful for overriding the model's memory section settings for the given subsystem.

  • The possible values vary depending on what (if any) package of memory sections you have set for the model's configuration. See Control Data and Function Placement in Memory by Inserting Pragmas (Embedded Coder) in the Embedded Coder documentation.

  • If you have not configured the model with a package, Inherit from model is the only value that appears. Otherwise, the list includes Default and all memory sections the model's package contains.

Dependency

  • This parameter requires a license for Embedded Coder and an ERT-based system target file.

  • To enable this parameter, set Function packaging to Nonreusable function and select the Function with separate data parameter

Programmatic Use

Parameter: RTWMemSecDataConstants
Type: character vector
Value: 'Inherit from model' | 'Default' | 'The memory section of interest'
Default: 'Inherit from model'

See also

Select how Embedded Coder applies memory sections to the subsystem internal data.

Inherit from model

Apply the root model's memory sections to the subsystem's data

Default

Not apply memory sections to the subsystem's data, overriding any model-level specification

The memory section of interest

Apply one of the model's memory sections to the subsystem

Tips

  • The memory section that you specify applies to the corresponding global data structures in the generated code. For basic information about the global data structures generated for atomic subsystems, see Default Data Structures in the Generated Code (Simulink Coder).

  • Can be useful for overriding the model's memory section settings for the given subsystem.

  • The possible values vary depending on what (if any) package of memory sections you have set for the model's configuration. See Control Data and Function Placement in Memory by Inserting Pragmas (Embedded Coder) in the Embedded Coder documentation.

  • If you have not configured the model with a package, Inherit from model is the only value that appears. Otherwise, the list includes Default and all memory sections the model's package contains.

Dependency

  • This parameter requires a license for Embedded Coder and an ERT-based system target file.

  • To enable this parameter, set Function packaging to Nonreusable function and select the Function with separate data parameter.

Programmatic Use

Parameter: RTWMemSecDataInternal
Type: character vector
Value: 'Inherit from model' | 'Default' | 'The memory section of interest'
Default: 'Inherit from model'

See also

Select how Embedded Coder applies memory sections to the subsystem parameters.

Inherit from model

Apply the root model's memory sections to the subsystem's function code

Default

Not apply memory sections to the subsystem's system code, overriding any model-level specification

The memory section of interest

Apply one of the model's memory sections to the subsystem

Tips

  • The memory section that you specify applies to the corresponding global data structure in the generated code. For basic information about the global data structures generated for atomic subsystems, see Default Data Structures in the Generated Code (Simulink Coder).

  • Can be useful for overriding the model's memory section settings for the given subsystem.

  • The possible values vary depending on what (if any) package of memory sections you have set for the model's configuration. See Control Data and Function Placement in Memory by Inserting Pragmas (Embedded Coder) in the Embedded Coder documentation.

  • If you have not configured the model with a package, Inherit from model is the only value that appears. Otherwise, the list includes Default and all memory sections the model's package contains.

Dependency

  • This parameter requires a license for Embedded Coder and an ERT-based system target file.

  • To enable this parameter, set Function packaging to Nonreusable function and select the Function with separate data parameter.

Programmatic Use

Parameter: RTWMemSecDataParameters
Type: character vector
Value: 'Inherit from model' | 'Default' | 'The memory section of interest'
Default: 'Inherit from model'

See also

Introduced in R2007a

Was this topic helpful?