Main Content

Configure Processor-In-The-Loop (PIL) for a Custom Target

Create a target connectivity configuration by using target connectivity APIs. With a target connectivity configuration, you can run processor-in-the-loop (PIL) simulations on custom embedded hardware.

You learn how to:

  • Adapt the build process to support PIL simulations.

  • Configure a tool for downloading and starting execution of a PIL executable on your target hardware.

  • Configure a communication channel between host and target to support PIL simulation on the target hardware.

Start with a model configured for software-in-the-loop (SIL) simulation. This example guides you through the process of creating a target connectivity configuration so that you can simulate the model in PIL mode. The example runs entirely on your development computer. You can use the same steps to create a connectivity configuration for your own embedded target hardware.

See also Test Generated Code with SIL and PIL Simulations and Create a Target Communication Channel for Processor-in-the-Loop (PIL) Simulation.

Preliminaries

Later in this example, you will add a folder to the search path. Create the folder path.

sl_customization_path = pwd;

If this folder is already on the search path, remove it.

if contains(path,sl_customization_path)
    rmpath(sl_customization_path)
end

Reset customizations.

sl_refresh_customizations

Test Generated Code with SIL Simulation

Simulate a model configured for SIL. Verify the generated code compiled for your development computer by comparing the SIL simulation behavior with the normal simulation behavior.

Make sure that the example model is newly opened.

close_system('SILModelBlock',0);
close_system('SILCounter',0)
open_system('SILModelBlock')

The CounterA Model block displays the text (SIL), which indicates that its referenced model is configured for SIL simulation.

Run a simulation of the system.

set_param('SILModelBlock','StopTime','10');
sim('SILModelBlock');
### Searching for referenced models in model 'SILModelBlock'.
### Found 1 model reference targets to update.
### Starting build procedure for: SILCounter
### Successful completion of build procedure for: SILCounter

Build Summary

Top model targets:

Model       Build Reason                                         Status                        Build Duration
=============================================================================================================
SILCounter  Information cache folder or artifacts were missing.  Code generated and compiled.  0h 0m 9.5864s 

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 10.477s
### Preparing to start SIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Updating code generation report with SIL files ...
### Starting SIL simulation for component: SILCounter
### Application stopped
### Stopping SIL simulation for component: SILCounter

Target Connectivity Configuration

Start work on a target connectivity configuration for PIL.

Make a local copy of the target connectivity configuration classes.

src_dir = ...
    fullfile(matlabroot,'toolbox','coder','simulinkcoder','+coder','+mypil');
if exist(fullfile('.','+mypil'),'dir')
    rmdir('+mypil','s')
end
mkdir +mypil
copyfile(fullfile(src_dir,'Launcher.m'), '+mypil');
copyfile(fullfile(src_dir,'TargetApplicationFramework.m'), '+mypil');
copyfile(fullfile(src_dir,'ConnectivityConfig.m'), '+mypil');

Make the copied files writable.

fileattrib(fullfile('+mypil', '*'),'+w');

Update the namespace to reflect the new location of the files.

coder.mypil.Utils.UpdateClassName(...
    './+mypil/ConnectivityConfig.m',...
    'coder.mypil',...
    'mypil');

Verify that you now have a folder +mypil in the current folder, which has the files Launcher.m, TargetApplicationFramework.m, and ConnectivityConfig.m.

dir './+mypil'
.                             ..                            ConnectivityConfig.m          Launcher.m                    TargetApplicationFramework.m  

Review Code to Launch the PIL Executable

The class that configures a tool for launching the PIL executable is mypil.Launcher. Open this class in the editor.

edit(which('mypil.Launcher'))

Review the content of this file. The method setArgString supplies additional command-line parameters to the executable. These parameters can include a TCP/IP port number. For an embedded processor implementation, you can choose to hard-code these settings.

Configure the Overall Target Connectivity Configuration

View the class mypil.ConnectivityConfig.

edit(which('mypil.ConnectivityConfig'))

Review the content of this file. You should be able to identify:

  • The creation of an instance of rtw.connectivity.RtIOStreamHostCommunicator that configures the host side of the TCP/IP communications channel.

  • A call to the setArgString method of Launcher that configures the target side of the TCP/IP communications channel.

  • A call to setTimer that configures a timer for execution time measurement

To define your own target-specific timer for execution time profiling, you must use the Code Replacement Library to specify a replacement for the function code_profile_read_timer. Use a command-line API or the crtool user interface.

Review the Target-Side Communications Drivers

View the file rtiostream_tcpip.c.

rtiostreamtcpip_dir=fullfile(matlabroot,'toolbox','coder','rtiostream','src',...
    'rtiostreamtcpip');
edit(fullfile(rtiostreamtcpip_dir,'rtiostream_tcpip.c'))

Scroll down to the end of this file. See that this file contains a TCP/IP implementation of the functions rtIOStreamOpen, rtIOStreamSend, and rtIOStreamRecv. These functions are required for the target hardware to communicate with your development computer. You must provide an implementation for each of these functions that is specific to your target hardware and communication channel.

Add Target-Side Communications Drivers to the Connectivity Configuration

The class that configures additional files to include in the build is mypil.TargetApplicationFramework. Open this class in the editor.

edit(which('mypil.TargetApplicationFramework'))

Use sl_customization to Register the Target Connectivity Configuration

To use the new target connectivity configuration, you must provide an sl_customization file. The sl_customization file registers your new target connectivity configuration and specifies the required conditions for its use. The conditions specified in this file can include the name of your system target file and your hardware implementation settings.

You can view the sl_customization file. For this example, you do not have to make changes to the file.

edit(fullfile(sl_customization_path,'sl_customization.m'))

Add the sl_customization folder to the search path and refresh the customizations.

addpath(sl_customization_path);
sl_refresh_customizations;

Test Generated Code with PIL Simulation

Run the PIL simulation.

close_system('SILModelBlock',0)
open_system('SILModelBlock')
set_param('SILModelBlock/CounterA','SimulationMode','processor-in-the-loop (pil)');
set_param('SILModelBlock','StopTime','10');
sim('SILModelBlock');
### Searching for referenced models in model 'SILModelBlock'.
### Found 1 model reference targets to update.
### Starting build procedure for: SILCounter
### Generated code for 'SILCounter' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of build procedure for: SILCounter

Build Summary

Top model targets:

Model       Build Reason                             Status          Build Duration
===================================================================================
SILCounter  Compilation artifacts were out of date.  Code compiled.  0h 0m 1.9447s 

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 2.29s
### Connectivity configuration for component "SILCounter": My PIL Example ###
EXECUTING METHOD SETARGSTRING
SETARGSTRING called from line 65 of ConnectivityConfig.m
### Preparing to start PIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Updating code generation report with PIL files ...
### Starting application: 'SILCounter_ert_rtw/pil/SILCounter'
Starting PIL simulation
Started new process, pid = 147507
Stopping PIL simulation
Terminated process, pid = 147507

Review the preceding messages. Confirm that the simulation ran without errors. You have now implemented a target connectivity configuration for PIL. You can use the same APIs to implement a connectivity configuration for your own combination of embedded processor, download tool, and communications channel.

Cleanup

Remove the search path for this example.

rmpath(sl_customization_path)

Reset customizations.

sl_refresh_customizations

Close the models.

close_system('SILModelBlock',0)
close_system('SILCounter',0)

Related Topics