Перейти к содержанию

    

Matlab\Simulink. Глобальные константы/переменные

Вроде простой вопрос, а никак не могу найти ответ: нужны глобальные константы (можно инициализированные переменные), которые были бы видны во всех блоках Simulink-а. В том числе и внутри блоков m-функций.

Пока создаю такие константы в "Model Workspace" (MATLAB variable). Но такие переменные не видны внутри m-блоков. Если же задаю global x внутри m-блока, то Matlab ругается "Unsupported: GLOBAL variables".

В инете тоже не могу найти решения. Неужто нет способа для такой очевидно-необходимой вещи?  :(

 

PS: У меня MATLAB 7.5.0 (R2007b)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Даже в последней версии так не получится. Вот что пишут:

Цитата

In MATLAB functions in Simulink, global declarations are not mapped to the MATLAB global workspace. Instead, you register global data with the MATLAB Function block to map the data to data store memory. This difference allows global data in MATLAB functions to inter-operate with the Simulink solver and to provide diagnostics if they are misused.

https://www.mathworks.com/help/simulink/ug/using-global-data-with-the-matlab-function-block.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Grizzly сказал:

Даже в последней версии так не получится. Вот что пишут:

И как же быть, если нужна глобальная константа, которую используют многие блоки???  :((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, jcxz сказал:

И как же быть, если нужна глобальная константа, которую используют многие блоки???  :((

Честно признаться, для меня неожиданное поведение. Я никогда прежде не использовал такие модели. Когда одни блоки, то добавлял переменные в Model Explorer, но это аналогично Workspace, только поближе к проекту.

Вдруг как-то получится "обхитрить", но я не уверен: https://www.mathworks.com/help/simulink/ug/workspace-variables-in-model-explorer.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
16 минут назад, Grizzly сказал:

Честно признаться, для меня неожиданное поведение. Я никогда прежде не использовал такие модели. Когда одни блоки, то добавлял переменные в Model Explorer, но это аналогично Workspace, только поближе к проекту.

Я тоже раньше строил или полностью из блоков симулинка или чисто m-файл. Но сейчас нужно использовать готовые блоки и в то же время - свой m-код. И, при необходимости поменять значение константы, приходится лазить по всем m-блокам где она используется + менять её в "Model Workspace". Если ещё внутри блоков я как-то теоретически могу обойти это, сделав чтение например из внешнего файла в persistent переменную, то в готовом блоке - никак. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему нельзя в готовом блоке? Есть же функции типа set_param. Я раньше писал матлабовский скрипт, который в рекурсии раскидывал коэффициенты фильтров, соединял блоки и т.д. Модель была для реализации фильтра с понижением частоты, на которой он работает. Кроме того, в старых версиях MATLAB *.mdl есть текстовый файл. Можно прямо в нем изменить что-то. Это в последние годы стали зипованные архивы slx. Но у меня задач нынче в Simulink нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 hours ago, jcxz said:

Я тоже раньше строил или полностью из блоков симулинка или чисто m-файл. Но сейчас нужно использовать готовые блоки и в то же время - свой m-код. И, при необходимости поменять значение константы, приходится лазить по всем m-блокам где она используется + менять её в "Model Workspace". Если ещё внутри блоков я как-то теоретически могу обойти это, сделав чтение например из внешнего файла в persistent переменную, то в готовом блоке - никак. :(

а сделать дополнительный порт, через который передать глобальную константу не получается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 часов назад, des00 сказал:

а сделать дополнительный порт, через который передать глобальную константу не получается?

Ну во-первых: неудобно - много лишних линий на схеме; во-вторых - в готовые блоки Simulink-а так всё равно не заведёшь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 hour ago, jcxz said:

Ну во-первых: неудобно - много лишних линий на схеме; во-вторых - в готовые блоки Simulink-а так всё равно не заведёшь.

много, но это всяко лучше чем "И, при необходимости поменять значение константы, приходится лазить по всем m-блокам где она используется + менять её в "Model Workspace". Речь же в основном про них идет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
22 часа назад, jcxz сказал:

Вроде простой вопрос, а никак не могу найти ответ: нужны глобальные константы (можно инициализированные переменные), которые были бы видны во всех блоках Simulink-а. В том числе и внутри блоков m-функций.

Пока создаю такие константы в "Model Workspace" (MATLAB variable). Но такие переменные не видны внутри m-блоков. Если же задаю global x внутри m-блока, то Matlab ругается "Unsupported: GLOBAL variables".

В инете тоже не могу найти решения. Неужто нет способа для такой очевидно-необходимой вещи?  :(

 

PS: У меня MATLAB 7.5.0 (R2007b)

Model Properties -> Callbacks -> InitFcn -> задаете в виде обычного m-кода Ваши константы. Они будут видны во всех блоках Simulink-а.

 

Внутри блоков m-функций:

 

MATLAB Function Block Editor -> Edit Data (Editor tab) -> The Ports and Data Manager -> Add Data -> задаете название Вашей константы -> General -> Scope -> Parameter

 

Но, будет ли это работать в R2007b, я не знаю.

Изменено пользователем Самурай

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
15 минут назад, Самурай сказал:

Model Properties -> Callbacks -> InitFcn -> задаете в виде обычного m-кода Ваши константы. Они будут видны во всех блоках Simulink-а.

...

Я уже решил эту проблему. Сделал так:

В каждой m-функции прописал в её начале секцию чтения глобальных констант (g_ts, g_pwmF, ...) из ModelWorkspace:

eml.extrinsic('open_system'); eml.extrinsic('close_system'); eml.extrinsic('get_param'); eml.extrinsic('assignin'); eml.extrinsic('evalin');
persistent g_ts; persistent g_pwmF;
persistent ix;
if isempty(ix)
  ix = 0;
  mdl = bdroot;
  open_system(mdl);
  ws = get_param(mdl, 'ModelWorkspace');
  g_ts = evalin(ws, 'g_ts');
  g_pwmF = evalin(ws, 'g_pwmF');
end

Теперь при старте эти константы копируются в локальные копии каждого такого блока, а блоки simulink-а берут значения этих констант напрямую из ModelWorkspace, где я их редактирую вручную (в одном общем месте).

Но всё равно спасибо за Ваш совет. Позже попробую сделать и по Вашему совету.

PS: И спасибо Grizzly - это его совет по set_param натолкнул меня на правильный путь поиска, который через день поисков привёл меня к решению выше.  :smile:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 часа назад, Самурай сказал:

Но, будет ли это работать в R2007b, я не знаю.

Прописал почти как Вы посоветовали. Только поместил код:

eml.extrinsic('open_system'); eml.extrinsic('close_system'); eml.extrinsic('get_param'); eml.extrinsic('assignin'); eml.extrinsic('evalin');
mdl = bdroot;
open_system(mdl);
ws = get_param(mdl, 'ModelWorkspace');
g_ts = evalin(ws, 'g_ts');
g_pwmF = evalin(ws, 'g_pwmF');

в InitFcn для каждого m-блока и добавил все эти параметры в "The Ports and Data Manager" для каждого m-блока. Так работает даже быстрее чем мой метод  :smile:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти