2009-08-11 12 views
1

Je rencontre un problème lors de l'envoi d'une valeur d'une interface graphique à une fonction MATLAB intégrée (EMF) dans un modèle Simulink. Je reçois cette valeur d'un curseur dans mon interface graphique et l'envoie à un bloc EMF dans mon modèle. Je peux confirmer que la valeur est transférée correctement de mon GUI vers mon bloc Simulink, puisque je peux afficher la valeur avec un bloc d'affichage dans mon modèle et voir la valeur changer quand je change la position du curseur dans mon GUI. Cependant, je continue à obtenir cette erreur quand je lance mon modèle:Pouvez-vous expliquer cette erreur Embedded MATLAB Function?

Could not determine the size of this expression. 

Function 'Kastl' (#18.282.283), line 14, column 1: 
"f" 

Cela fait partie de mon code bloc EMF:

function y = input_par(u,fstart) 
    ... 
    f_end = 1000; 
    f = fstart:f_end; 
    ... 

Répondre

1

Je crois que la question que vous exécutez en est que vous ne pouvez pas changer un paramètre pendant la simulation qui va modifier la dimension d'un signal. Dans votre exemple, le code

f = fstart:f_end; 

change de taille à chaque fois que fstart change. Je pense que c'est ce sur quoi les EMF se plaignent. Je n'ai pas de solution de contournement facile pour ce problème particulier, mais il existe peut-être une façon équivalente de faire ce que vous voulez pour éviter ce problème.

2

Je crois que MikeT est correct: vous ne pouvez pas redéfinir la taille d'une variable dans une fonction incorporée. Si vous regardez ce Embedded MATLAB Function documentation page sous le paragraphe Définition des variables locales, il est dit:

Une fois que vous définissez une variable, vous ne pouvez pas redéfinir à tout autre type ou la taille dans le corps de la fonction.

Vous devrez retravailler votre fonction intégrée de sorte que les variables que vous déclarez ne changent pas de taille. Depuis que je ne sais pas ce que vous faites ensuite avec la variable f, il n'y a pas beaucoup plus spécifique aide que je peux vous donner.

En général, si vous avez absolument besoin de pour utiliser des données qui changent de taille, une solution consiste à remplir les données avec des valeurs "garbage" afin de maintenir une taille constante. Par exemple:

MAX_ELEMS = 1000; % Define the maximum number of elements in the vector 
f = [fstart:MAX_ELEMS nan(1,fstart-1)]; % Create vector and pad with NaNs 

Dans l'exemple ci-dessus, la variable de f faudra toujours 1000 éléments (en supposant que la valeur de fstart est une valeur entière inférieure ou égale à 1000). La valeur NaN est utilisée pour ajuster le vecteur à la taille constante appropriée. Tout code ultérieur devrait être capable de reconnaître qu'une valeur de NaN doit être ignorée. En fonction des calculs effectués ultérieurement dans la fonction intégrée, différentes valeurs de pad peuvent être nécessaires à la place de NaN (telles que 0, valeurs négatives, etc.).

+0

J'ai résolu ceci non pas avec un EMF mais avec une fonction S de niveau M de niveau 2. pour l'entrée, f.e. le fstart j'ai utilisé un Constant et un Gain-Block que j'ai mis à partir de l'interface graphique. Et puis j'ai utilisé cette valeur pour ma fonction S du fichier M de niveau 2. Ça marche. –