error using global to save value of parameter

hi,
how can i resolve this error; Global declaration not resolved to a Data Store Memory block registered via the Ports and Data Manager.
my code is:
function [y1, y2] = fcn(u)
%#codegen
coder.extrinsic('degtorad');
coder.extrinsic('radtodeg');
coder.varsize('Az','El','In','Or');
global k
Az=0;
El=0;
In=0;
Or=0;
n=0;
%k=0;
y1=0;
y2=0;
Azk =degtorad( u(1));
Elk= degtorad(u(2));
Ink=degtorad(u(3));
Ork=degtorad(u(4));
Az = [Az ; Azk];
El= [El ; Elk];
In=[In; Ink];
Or=[Or; Ork];
n=size(Az,1);
if (n==1)
k=1;
end
X2=cos(El(n))*cos(Az(n));
X3=sin(Az(n))*cos(El(n));
I=cos(In(k))*sin(El(n))-sin(In(n))*X2*cos(Or(k))-sin(In(k))*X3*sin(Or(k));
if (0.9<I && I<=1)
y1=radtodeg(In(k));
y2=radtodeg(Or(k));
else
if (n>1)
k=n-1;
I=cos(In(k))*sin(El(n))-sin(In(n))*X2*cos(Or(k))-sin(In(k))*X3*sin(Or(k));
y1=radtodeg(In(k));
y2=radtodeg(Or(k));
end
end

回答 (1 件)

Walter Roberson
Walter Roberson 2015 年 5 月 31 日

0 投票

You use the Ports and Data Manager to define the global variable. See http://www.mathworks.com/help/simulink/ug/using-global-data-with-the-matlab-function-block.html

2 件のコメント

Walter Roberson
Walter Roberson 2015 年 5 月 31 日
Reminder: As discussed in http://uk.mathworks.com/matlabcentral/answers/218308-error-in-function-output-cannot-be-of-matlab-type it is not possible for n to ever be 1 in your code, so your code will not assign a value to k before it is used.
With the flow of your code, if you do use k as a global, then the first time you execute the block, k will use whatever initial value you assigned in the Ports and Data Manager, and if the first condition is satisfied based upon the inputs, then you do not change k and so it will continue to be whatever that value was. But if the first condition is not satisfied based upon the inputs, then you will change k to n-1, and since n is the length of the something that is always two elements long in your code, k will be changed to 2-1 = 1. As it is a change to a global variable, that value will be remembered for the next time you enter the block. Once it has become 1 in this way, further iterations of the block will either leave it untouched (if the condition holds for their input) or else it they will re-change it to n-1 which will still be 2-1.
Therefore, whatever initial value you assign in the Data and Ports Manager will be used until the first time the condition fails on input; after that the value will be set to 1, and there is no way to change it to anything else in your code.
The condition is therefore acting as a trigger, so you should be considering coding it as a trigger. You should be considering selector blocks with two different versions of the code, one of which knows the trigger is not set but might update the trigger, and the other knows the trigger is already set and does not update it.
studentU
studentU 2015 年 6 月 2 日
thank's Roberson for ur replly, sorry, i have just see it...
so in my code it's sur that the first condition is always verified at the begenin because, the input parametrs has before their injection, calculated with this condition...
howerver adding data stor memory for 'k' in my model have not modified the error!!!

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeEvent Functions についてさらに検索

製品

タグ

質問済み:

2015 年 5 月 27 日

コメント済み:

2015 年 6 月 2 日

Community Treasure Hunt

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

Start Hunting!

Translated by