Generating Code for Model Referencing

Introduction

This section describes model referencing considerations that apply specifically to code generation by the Real-Time Workshop® software with GRT and ERT system targets. This section assumes that you understand referenced models and their terminology and requirements, as described in Referencing a Model. This section does not repeat information that appears in that chapter.

Overview of Referenced Model Code Generation

When generating code for a referenced model hierarchy, the Real-Time Workshop® software generates a stand-alone executable for the top model, and a library module called a model reference target for each referenced model. When the code executes, the top executable invokes the model reference targets as needed to compute the referenced model outputs. Model reference targets are sometimes called Real-Time Workshop targets.

Be careful not to confuse a model reference target (Real-Time Workshop target) with any of these other types of targets:

The Real-Time Workshop code generator places the code for the top model of a hierarchy in the current working directory, and the code for submodels in a directory named slprj within the current working directory. Subdirectories in slprj provide separate places for different types of files. See Project Directory Structure for Model Reference Targets for details.

By default, the product uses incremental code generation. When generating code, it compares the date, and optionally, the structure of referenced model files with the generated code files to determine whether it is necessary to regenerate model reference targets. You can also force or prevent code generation by using a diagnostic setting Configuration Parameters > Model Referencing > Rebuild options.

In addition to incremental code generation, the Real-Time Workshop software uses incremental loading. The code for a referenced model is not loaded into memory until the code for its parent model executes and needs the outputs of the referenced model. The product then loads the referenced model target and executes. Once loaded, the target remains in memory until it is no longer needed.

Most code generation considerations are the same whether or not a model includes any referenced models: the Real-Time Workshop code generator handles the details automatically insofar as possible. This chapter describes topics that you may need to consider when generating code for a model reference hierarchy.

Custom targets must declare themselves to be model reference compliant if they need to support Model blocks. See Supporting Model Referencing for details.

Referenced Model Code Generation Tutorial

You can get hands-on experience with creating referenced models and generating code for them by working through the model reference tutorial. See Generating Code for a Referenced Model.

Project Directory Structure for Model Reference Targets

Code for models referenced by using Model blocks is generated in project directories within the current working directory. The top-level project directory is always named /slprj. The next level within slprj contains parallel build area subdirectories.

The following table lists principal project directories and files. In the paths listed, model is the name of the model being used as a referenced model, and target is the system target file acronym (for example, grt, ert , rsim, and so on).

Directories and FilesDescription
slprj/sim/model/ Simulation target files for referenced models
slprj/sim/model/tmwinternalMAT-files used during code generation
slprj/target/model/referenced_model_includesHeader files from models referenced by this model
slprj/target/modelModel reference target files
slprj/target/model/tmwinternalMAT-files used during code generation
slprj/sl_proj.tmwMarker file
slprj/target/_sharedutilsUtility functions for model reference targets, shared across models
slprj/sim/_sharedutils Utility functions for simulation targets, shared across models

If you are building code for more than one referenced model within the same working directory, model reference files for all such models are added to the existing slprj directory.

Building Model Reference Targets

By default, the Simulink® engine rebuilds simulation targets as needed before the Real-Time Workshop software generates model reference targets. You can change the rebuild criteria or specify that the engine always or never rebuilds targets. See Rebuild options for details.

The Real-Time Workshop software generates a model reference target directly from the Simulink model. The product automatically generates or regenerates model reference targets as needed.

You can command the Simulink and Real-Time Workshop products to generate a simulation target for an Accelerator mode referenced model, and a model reference target for any referenced model, by executing the slbuild command with appropriate arguments in the MATLAB® Command Window.

The Real-Time Workshop software generates only one model reference target for all instances of a referenced model. See Reusable Code and Referenced Models for details.

Reducing Change Checking Time

You can reduce the time that the Simulink and Real-Time Workshop products spend checking whether any or all simulation targets and model reference targets need to be rebuilt by setting configuration parameter values as follows:

These parameter values exist in a referenced model's configuration set, not in the individual Model block, so setting either value for any instance of a referenced model sets it for all instances of that model.

Real-Time Workshop® Model Referencing Requirements

A model reference hierarchy must satisfy various Real-Time Workshop requirements, as described in this section. In addition to these requirements, a model referencing hierarchy to be processed by the Real-Time Workshop software must satisfy:

Configuration Parameter Requirements

A referenced model uses a configuration set in the same way that any other model does, as described in Configuration Sets. By default, every model in a hierarchy has its own configuration set, which it uses in the same way that it would if the model executed independently.

Because each model can have its own configuration set, configuration parameter values can be different in different models. Furthermore, some parameter values are intrinsically incompatible with model referencing. The response of the Real-Time Workshop software to an inconsistent or unusable configuration parameter depends on the parameter:

When a model reference hierarchy contains many submodels that have incompatible parameter values, or a changed parameter value must propagate to many submodels, manually eliminating all configuration parameter incompatibilities can be tedious. You can control or eliminate such overhead by using configuration references to assign an externally-stored configuration set to multiple models. See Referencing Configuration Sets for details.

The following tables list configuration parameters that can cause problems if set in certain ways, or if set differently in a referenced model than in a parent model. Where possible, the Real-Time Workshop software resolves violations of these requirements automatically, but most cases require changes to the parameters in some or all models.

For general information about setting configuration parameters for code generation, see Adjusting Simulation Configuration Parameters for Code Generation.

Configuration Requirements for Model Referencing with All System Targets

Dialog Box PaneOptionRequirement
SolverStart timeSome system targets require the start time of all models to be zero.

Hardware Implementation

Emulation hardware options

All values must be the same for top and referenced models.

Real-Time Workshop

System target file

Must be the same for top and referenced models.

LanguageMust be the same for top and referenced models.

Generate code only

Must be the same for top and referenced models.

Symbols

Maximum identifier length

Cannot be longer for a referenced model than for its parent model.

Interface

Target function library

 

Must be the same for top and referenced models.

Data exchange Interface

C-API

The C-API Signals and Parameters check boxes must be the same for top and referenced models.

ASAP2

Can be on or off in a top model, but must be off in a referenced model. If it is not, the Real-Time Workshop software temporarily sets it to off during code generation.

Configuration Requirements for Model Referencing with ERT System Targets

Dialog Box PaneOptionRequirement

Real-Time Workshop

Ignore custom storage classes

Must be the same for top and referenced models.

Symbols

Global variables
Global types
Subsystem methods
Local temporary variables
Constant macros
$R token must appear.

Signal naming

Must be the same for top and referenced models.

M-functionIf specified, must be the same for top and referenced models.

Parameter naming

Must be the same for top and referenced models.

#define naming

Must be the same for top and referenced models.

Interface

Support floating- point numbers

If off for top model, must be off for referenced models.

Support non-finite numbers

If off for top model, must be off for referenced models.

Support complex numbers

If off for top model, must be off for referenced models.

Terminate function required

Must be the same for top and referenced models.

Suppress error status in real-time model

If on for top model, must be on for referenced models.

Templates

Target operating system

Must be the same for top and referenced models.

Data Placement

Module Naming

Must be the same for top and referenced models.

Module Name (if specified)

If set, must be the same for top and referenced models.

Signal display level

Must be the same for top and referenced models.

Parameter tune level

Must be the same for top and referenced models.

Naming Requirements

Within a model that uses model referencing, there can be no collisions between the names of the constituent models. When you generate code from a model that uses model referencing, the Maximum identifier length parameter must be large enough to accommodate the root model name and the name mangling string (if needed). A code generation error occurs if Maximum identifier length is not large enough.

When a name conflict occurs between a symbol within the scope of a higher-level model and a symbol within the scope of a referenced model, the symbol from the referenced model is preserved. Name mangling is performed on the symbol from the higher-level model.

Embedded Coder Naming Requirements.   The Real-Time Workshop® Embedded Coder™ product provides a Symbol format field that lets you control the formatting of generated symbols in much greater detail. When generating code with an ERT target from a model that uses model referencing:

See Real-Time Workshop Pane: Symbols and Code Generation Options and Optimizations for more information.

Custom Target Requirements

A custom target must meet various requirements in order to support model referencing. See Supporting Model Referencing for details.

Storage Classes for Signals Used with Model Blocks

Models containing Model blocks can use signals of storage class Auto without restriction. However, when you declare signals to be global, you must be aware of how the signal data will be handled.

A global signal is a signal with a storage class other than Auto:

The above are distinct from SimulinkGlobal signals, which are treated as test points with Auto storage class.

Global signals are declared, defined, and used as follows:

Custom storage classes also follow the above rules. However, certain custom storage classes are not currently supported for use with model reference. See Custom Storage Class Limitations for details.

Storage Classes for Parameters Used with Model Blocks

All storage classes are supported for both simulation and code generation, and all except Auto are tunable. The supported storage classes thus include

Note the following restrictions on parameters in referenced models:

Note the following considerations concerning how global tunable parameters are declared, defined, and used in code generated for targets:

Certain custom storage classes for parameters are not currently supported for model reference. See Custom Storage Class Limitations for details.

Parameters used as Model block arguments must be defined in the referenced model's workspace. See Parameterizing Model References in the Simulink documentation for specific details.

Effects of Signal Name Mismatches

Within a parent model, the name and storage class for a signal entering or leaving a Model block might not match those of the signal attached to the root inport or outport within that referenced model. Because referenced models are compiled independently without regard to any parent model, they cannot adapt to all possible variations in how parent models label and store signals.

The Real-Time Workshop software accepts all cases where input and output signals in a referenced model have Auto storage class. When such signals are test pointed or are global, as described above, certain restrictions apply. The following table describes how mismatches in signal labels and storage classes between parent and referenced models are handled:

Relationships of Signals and Storage Classes Between Parent and Referenced Models

Referenced Model

Parent Model

Signal Passing Method

Signal Mismatch Checking

Auto

Any

Function argument

None

SimulinkGlobal or resolved to Signal Object

Any

Function argument

Label Mismatch Diagnostic (none / warning / error)

Global

Auto or SimulinkGlobal

Global variable

Label Mismatch Diagnostic (none / warning / error)

Global

Global

Global variable

Labels and storage classes must be identical (else error)

To summarize, the following signal resolution rules apply to code generation:

You can set the Signal Mismatch diagnostic to error, warning, or none in the Configuration Parameters > Diagnostics > Connectivity dialog.

Inherited Sample Time for Referenced Models

See Inheriting Sample Times in the Simulink documentation for information about Model block sample time inheritance. In generated code, you can control inheriting sample time by using ssSetModelReferenceSampleTimeInheritanceRule in different ways:

The above code uses the sample times of the block, but only for determining whether there is a hit. Therefore, this S-function should set

ssSetModelReferenceSampleTimeInheritanceRule
(S, USE_DEFAULT_FOR_DISCRETE_INHERITANCE);

Reusable Code and Referenced Models

Models that employ model referencing might require special treatment when generating and using reusable code. The following sections identify general restrictions and discuss how reusable functions with inputs or outputs connected to a referenced model's root Inport or Outport blocks can affect code reuse.

General Considerations

You can generate code for subsystems that contain referenced models using the same procedures and options described in Nonvirtual Subsystem Code Generation. However, the following restrictions apply to such builds:

Code Reuse and Model Blocks with Root Inport or Outport Blocks

Reusable functions with inputs or outputs connected to a referenced model's root Inport or Outport block can affect code reuse. This means that code for certain atomic subsystems cannot be reused in a model reference context the same way it is reused in a standalone model.

For example, suppose you create the following subsystem and make the following changes to the subsystem's block parameters:

Suppose you then create the following model, which includes three instances of the preceding subsystem.

With the Inline parameters option enabled in this stand-alone model, the Real-Time Workshop code generator can optimize the code by generating a single copy of the function for the reused subsystem, as shown below.

void reuse_subsys1_Subsystem1(
                   real_T rtu_0,
                   rtB_reuse_subsys1_Subsystem1 *localB)
{

  /* Gain: '<S1>/Gain' */
  localB->Gain_k = rtu_0 * 3.0;
}

When generated as code for a Model block (into an slprj project directory), the subsystems have three different function signatures:

/* Output and update for atomic system: '<Root>/Subsystem1' */
void reuse_subsys1_Subsystem1(const real_T *rtu_0, 
rtB_reuse_subsys1_Subsystem1
 *localB)
{
  /* Gain: '<S1>/Gain' */
  localB->Gain_w = (*rtu_0) * 3.0;
}

/* Output and update for atomic system: '<Root>/Subsystem2' */
void reuse_subsys1_Subsystem2(real_T rtu_In1, 
rtB_reuse_subsys1_Subsystem2
 *localB)
{
  /* Gain: '<S2>/Gain' */
  localB->Gain_y = rtu_In1 * 3.0;
}

/* Output and update for atomic system: '<Root>/Subsystem3' */
void reuse_subsys1_Subsystem3(real_T rtu_In1, real_T *rty_0)
{
  /* Gain: '<S3>/Gain' */
  (*rty_0) = rtu_In1 * 3.0;
}

One way to make all the function signatures the same — and therefore assure code reuse — is to insert Signal Conversion blocks. Place one between the Inport and Subsystem1 and another between Subsystem3 and the Outport of the referenced model.

The result is a single reusable function:

void reuse_subsys2_Subsystem1(real_T rtu_In1,
                   rtB_reuse_subsys2_Subsystem1 *localB)
{

  /* Gain: '<S1>/Gain' */
  localB->Gain_g = rtu_In1 * 3.0;
}

You can achieve the same result (reusable code) with only one Signal Conversion block. You can omit the Signal Conversion block connected to the Inport block if you select the Pass scalar root inputs by value check box at the bottom of the Model Referencing pane of the Configuration Parameters dialog box. When you do this, you still need to insert a Signal Conversion block before the Outport block.

Customizing the Library File Suffix, Including the File Type Extension

You can control the library file suffix, including the file type extension, that the Real-Time Workshop code generator uses to name generated model reference libraries by specifying the string for the suffix with the model configuration parameter TargetLibSuffix. The string must include a period (.). If you do not set this parameter,

On a...The Real-Time Workshop Software Names the Libraries...
Microsoft®Windows® systemmodel_rtwlib.lib
The Open Group UNIX® systemmodel_rtwlib.a

Real-Time Workshop® Model Referencing Limitations

The following Real-Time Workshop limitations apply to model referencing. In addition to these limitations, a model reference hierarchy used for code generation must satisfy:

Customization Limitations

Data Logging Limitations

Reusability Limitations

If a referenced model used for code generation has any of the following properties, the model must specify Configuration Parameters > Model Referencing > Total number of instances allowed per top model as One, and no other instances of the model can exist in the hierarchy. If the parameter is not set correctly, or more than one instance of the model exists in the hierarchy, an error occurs. The properties are:

S-Function Limitations

Simulink® Tool Limitations

Subsystem Limitations

Target Limitations

Other Limitations

  


 © 1984-2008- The MathWorks, Inc.    -   Site Help   -   Patents   -   Trademarks   -   Privacy Policy   -   Preventing Piracy   -   RSS