This example shows how to trace a signal using a software triggered Simulink® Real-Time™ host scope. After the script builds and downloads the oscillator model, xpcosc, to the target computer, it adds a scope of type 'host' to the real-time application and the signals 'Integrator1' and 'Signal Generator' to the scope. The scope is then configured in the software trigger mode.
Once the trigger is initiated, the scope is monitored to determine when its data acquisition is complete. Next, the scope data is uploaded to the development computer and plotted. This process repeats 25 times. The software trigger is re-enabled each run after a random pause (between 0 and 4 seconds). After every fifth run, the damping gain 'Gain1/Gain' is set to a new random value (between 0 and 2000).
Use 'slrtpingtarget' to test the connection between the development and target computers.
if ~strcmp(slrtpingtarget, 'success') error(message('xPCTarget:examples:Connection')); end
Open the oscillator model, xpcosc. Under the model's configuration parameter Simulink Real-Time option settings, the system target file has been set to slrt.tlc. Hence, building the model will create an executable image, xpcosc.mldatx, that can be run on a target computer booted with the Simulink Real-Time kernel.
Build the model and download the image, xpcosc.mldatx, to the target computer.
Configure for a non-Verbose build.
Build and download application.
set_param('xpcosc','RTWVerbose','off'); rtwbuild('xpcosc'); tg = slrt('TargetPC1'); load(tg,'xpcosc');
### Starting Simulink Real-Time build procedure for model: xpcosc Warning: This model contains blocks that do not handle sample time changes at runtime. To avoid incorrect results, only change the sample time in the original model, then rebuild the model. ### Successful completion of build procedure for model: xpcosc Warning: Unable to configure logging for model 'xpcosc' because it is already configured. ### Created MLDATX ..\xpcosc.mldatx ### Looking for target: TargetPC1 ### Download model onto target: TargetPC1
This code accomplishes a number of tasks.
Task 1: Create Target Object
Create the MATLAB® variable, tg, containing the Simulink Real-Time target object. This object allows you to communicate with and control the target computer.
Create a Simulink Real-Time target object
Set sample time to 250us
Set stop time to a high value (10000s)
Start model execution
Task 2: Create, configure, and plot to the host scope during each run.
Get index of parameter 'Gain1/Gain'
Get index of signal 'Integrator1'
Get index of signal 'Signal Generator'
Define (add) a host scope object
Add signals to signal list of scope object
Set number of samples
Set decimation factor
Set trigger mode
Task 3: Check for Plot Figure
Does the plot figure exist?
If no, create figure
If yes, make it the current figure
Task 4: Loop to acquire 25 data packages from the scope object.
Change parameter Gain1/Gain every fifth acquisition loop to a random value between 0 and 2000.
Task 5: Start scope object and trigger randomly
Start scope object
Wait until scope object has 'ready' state.
Randomize the amount of wait time before triggering scope.
Wait a random period (0..4s).
Software trigger the scope object.
Wait until scope-object has 'finished' state.
Task 6: Create time vector, upload scope data and display it.
Upload time vector
Upload acquired data and plot
tg = slrt; % create target object tg.SampleTime = 0.000250; tg.StopTime = 10000; start(tg); tPar = getparamid(tg, 'Gain1', 'Gain'); % get indexes signals(1) = getsignalid(tg, 'Integrator1'); signals(2) = getsignalid(tg, 'Signal Generator'); sc = addscope(tg, 'host'); % define scope object addsignal(sc, signals); sc.NumSamples = 200; sc.Decimation = 4; sc.TriggerMode ='Software'; figh = findobj('Name', 'scsoftwaredemo'); % check for plot figure if isempty(figh) figh = figure; set(figh, 'Name', 'scsoftwaredemo', 'NumberTitle', 'off'); else figure(figh); end m = 1; flag = 0; % loop to acquire data for n = 1 : 25 if isempty(find(get(0, 'Children') == figh, 1)), flag = 1; break; end if ~m setparam(tg, tPar, 2*1000*rand); end m = rem(m + 1, 5); start(sc); % start scope object while ~strcmp(sc.Status, 'Ready for being Triggered'), end ttrigger = rand * 4; % randomized trigger time title(['scsoftwaredemo: ', num2str(n), ... ' of 25 data packages, will be triggered in ', ... num2str(ttrigger), 's']); pause(ttrigger); if isempty(find(get(0, 'Children') == figh, 1)), flag = 1; break; end trigger(sc); % software trigger scope while ~strcmpi(sc.Status,'finished') end t = sc.Time; % create time vector and display it plot(t, sc.Data); set(gca, 'XLim', [t(1), t(end)], 'YLim', [-10, 10]); drawnow; end if ~flag, title('scsoftwaredemo: finished'); end
When done, stop the application and close the model.