synchronization of matlab function blocks

조회 수: 2 (최근 30일)
sali
sali 2015년 3월 19일
댓글: sali 2015년 3월 20일
Dear all, I have a simulink model who contains 9 subsystems connected to each other via GoTo-From blocks, each subsystem has a matlab function block (should be the same block, I just copy past from the first subsystem to the other subsystems), my question is regarding the matlab function block, I need to change some variables inside the matlab function in the subsystem number one these variables should be changed instantly in the other blocks as well, I was looking for a way to define the matlab function block to be global or on other words how can I tell the simulink that this matlab function block is the same block in all subsystems so any change in any block either adding a code or updating variables during the simulation time will be instantly applied to the other blocks.
Also I have a question regarding the output of the matlab function block, can this output be treated as an array instead of separated values? The matlab function block code is :
function [UB11,UB12,UB13,UB21,UB22,UB23,UB31,UB32,UB33,I] = fcn %coder.extrinsic('fcn') coder.extrinsic('xlsread'); persistent U; U=zeros(3,3); U=xlsread('C:\Users\Documents\MATLAB\InputImage.xlsx'); UB11=U(1,1); UB12=U(1,2); UB13=U(1,3); UB21=U(2,1); UB22=U(2,2); UB23=U(2,3); UB31=U(3,1); UB32=U(3,2); UB33=U(3,3); I=1; Thank you in advance, Sali

채택된 답변

Mike Hosea
Mike Hosea 2015년 3월 19일
편집: Mike Hosea 2015년 3월 19일
The MATLAB Function Block can return arrays. The problem with your code is probably just that you can't return the persistent array. If you create an array UB = U and return UB instead of U, it should work.
As for the synchronization, there may be more direct ways of solving the problem that I don't know much about (tunable parameters?), but I think it should be possible to create a MATLAB function with persistent (or global) variables that acts as a repository. Something like
function [a,b,c] = myrepository(a,b,c)
persistent asaved bsaved csaved
if isempty(asaved)
asaved = 0;
bsaved = 0;
csaved = 0;
end
if nargin == 0
a = asaved;
b = bsaved;
c = csaved;
else
asaved = a;
bsaved = b;
csaved = c;
end
That's a MATLAB function that lives in MATLAB somewhere on the path, not in your MATLAB function block. Then in your MATLAB function block you retrieve the data
[a,b,c] = feval('myrepository');
and set the data
feval('myrepository',a,b,c);
or declare it extrinsic near the beginning of your function
coder.extrinsic('myrepository');
and get/set the data with
[a,b,c] = myrepository;
myrepository(a,b,c);
Of course you'll need to be sure to initialize the data in myrepository as appropriate before the simulation begins.
  댓글 수: 1
sali
sali 2015년 3월 20일
Thank you so much for your help I'll try this solution.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Simulink Functions에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by