2013-06-20 4 views
1

У меня есть функция, которая использует 2 постоянные переменные. Входной сигнал функции - gcb, для фактического блока симуляции. Я хочу использовать функцию на разных блоках, поэтому я хотел бы, чтобы постоянные переменные объявлялись с именем, которое ссылается на имя блока.Динамически постоянная переменная

function testBlock(blk) 
    blkName = get_param(blk, 'name') 
    persistent blkValues % this works for one block 
    % but I want something like this 
    persistent eval([blkName 'Values']) % doesn't work 
    ... 
end 
+1

Рассматривали ли вы использование поля «UserData» на блоке? Это было бы гораздо более надежным решением. – macduff

+0

@macduff Итак, мне нужно было сделать что-то вроде 'set_param (gcb, 'UserData', [blkName 'Values'])'? –

ответ

1

Если все, что вы хотели сделать, это сохранить название блока, то да. Если вы хотите некоторые данные и описательное имя, я думаю, что структура будет работать как:

data = struct([blkName 'Values'],[]); 
set_param(gcb,'UserData',data); 

Затем, когда вы получите данные, которые вы используете,

ud = get_param(gcb,'UserData'); 
% ud.([blkName 'Values']) <- your data 

Или вы могли бы использовать глобальную appdata хранения :

setappdata(0,[blkName 'Values'],data); 

data = getappdata(0,[blkName 'Values']); 

Или вы могли бы переписать функцию во время выполнения, чтобы создать переменную с именем, которое вы хотите, Ик, но я видел подобные вещи. НТН!

EDIT UserData является методом, который я использовал много раз для диалогового обратного вызова, так что я уверен, что он будет работать, однако я не могу полностью понять ваше приложение. :-)

EDIT Если вам нужны данные сохраняться каждый раз при загрузке модели, то вы должны установить параметр UserDataPersistent в 'on'. Это раздражающая, но, по-видимому, необходимая функция, чтобы выбрать, следует ли забывать о том, что произошло после закрытия модели и вымывания памяти. Поскольку это ваш прецедент, переменные persistent в m-скрипте не будут работать, поскольку они забываются, когда Matlab завершается. Я считаю, что вам нужно будет использовать как setpref, чтобы он сохранялся между сессиями Matlab.

+0

Я не уверен, что это сработает с моей фактической функцией. Мне нужна постоянная переменная, потому что скрипт находится в обратном вызове маски. Таким образом, постоянная переменная позволяет сохранять значения между вызовами функции. –

+0

Я использовал (а) ваше предлагаемое решение. Я узнал, что у меня нет выбора, кроме как использовать 'set_param (gcb, 'UseDataPersistent', 'on')'. Если я не использую его, UserData теряется при закрытии и повторном открытии модели simulink. Может быть, я все еще делаю что-то неправильно. –

+0

Я подумал об этом, я исправлю ответ. – macduff

1

Функция с постоянными данными и повторное использование этой функции в разных местах для разных целей является взаимоисключающим. Вы не можете обойти оба. Вы должны поместить свои данные вне функции. Некоторые способы сделать это: a) уже предложенное поле UserData, b) внешний файл, например. файл мата или в) контейнер, такой как карта для поиска на основе ввода.

Смежные вопросы