jcxz 184 13 ноября, 2018 Опубликовано 13 ноября, 2018 · Жалоба Вроде простой вопрос, а никак не могу найти ответ: нужны глобальные константы (можно инициализированные переменные), которые были бы видны во всех блоках Simulink-а. В том числе и внутри блоков m-функций. Пока создаю такие константы в "Model Workspace" (MATLAB variable). Но такие переменные не видны внутри m-блоков. Если же задаю global x внутри m-блока, то Matlab ругается "Unsupported: GLOBAL variables". В инете тоже не могу найти решения. Неужто нет способа для такой очевидно-необходимой вещи? :( PS: У меня MATLAB 7.5.0 (R2007b) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grizzly 0 13 ноября, 2018 Опубликовано 13 ноября, 2018 · Жалоба Даже в последней версии так не получится. Вот что пишут: Цитата 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 13 ноября, 2018 Опубликовано 13 ноября, 2018 · Жалоба 2 минуты назад, Grizzly сказал: Даже в последней версии так не получится. Вот что пишут: И как же быть, если нужна глобальная константа, которую используют многие блоки??? :(( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grizzly 0 13 ноября, 2018 Опубликовано 13 ноября, 2018 · Жалоба Только что, jcxz сказал: И как же быть, если нужна глобальная константа, которую используют многие блоки??? :(( Честно признаться, для меня неожиданное поведение. Я никогда прежде не использовал такие модели. Когда одни блоки, то добавлял переменные в Model Explorer, но это аналогично Workspace, только поближе к проекту. Вдруг как-то получится "обхитрить", но я не уверен: https://www.mathworks.com/help/simulink/ug/workspace-variables-in-model-explorer.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 13 ноября, 2018 Опубликовано 13 ноября, 2018 · Жалоба 16 минут назад, Grizzly сказал: Честно признаться, для меня неожиданное поведение. Я никогда прежде не использовал такие модели. Когда одни блоки, то добавлял переменные в Model Explorer, но это аналогично Workspace, только поближе к проекту. Я тоже раньше строил или полностью из блоков симулинка или чисто m-файл. Но сейчас нужно использовать готовые блоки и в то же время - свой m-код. И, при необходимости поменять значение константы, приходится лазить по всем m-блокам где она используется + менять её в "Model Workspace". Если ещё внутри блоков я как-то теоретически могу обойти это, сделав чтение например из внешнего файла в persistent переменную, то в готовом блоке - никак. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grizzly 0 13 ноября, 2018 Опубликовано 13 ноября, 2018 · Жалоба А почему нельзя в готовом блоке? Есть же функции типа set_param. Я раньше писал матлабовский скрипт, который в рекурсии раскидывал коэффициенты фильтров, соединял блоки и т.д. Модель была для реализации фильтра с понижением частоты, на которой он работает. Кроме того, в старых версиях MATLAB *.mdl есть текстовый файл. Можно прямо в нем изменить что-то. Это в последние годы стали зипованные архивы slx. Но у меня задач нынче в Simulink нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 10 hours ago, jcxz said: Я тоже раньше строил или полностью из блоков симулинка или чисто m-файл. Но сейчас нужно использовать готовые блоки и в то же время - свой m-код. И, при необходимости поменять значение константы, приходится лазить по всем m-блокам где она используется + менять её в "Model Workspace". Если ещё внутри блоков я как-то теоретически могу обойти это, сделав чтение например из внешнего файла в persistent переменную, то в готовом блоке - никак. :( а сделать дополнительный порт, через который передать глобальную константу не получается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 6 часов назад, des00 сказал: а сделать дополнительный порт, через который передать глобальную константу не получается? Ну во-первых: неудобно - много лишних линий на схеме; во-вторых - в готовые блоки Simulink-а так всё равно не заведёшь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 1 hour ago, jcxz said: Ну во-первых: неудобно - много лишних линий на схеме; во-вторых - в готовые блоки Simulink-а так всё равно не заведёшь. много, но это всяко лучше чем "И, при необходимости поменять значение константы, приходится лазить по всем m-блокам где она используется + менять её в "Model Workspace". Речь же в основном про них идет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 14 ноября, 2018 Опубликовано 14 ноября, 2018 (изменено) · Жалоба 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, я не знаю. Изменено 14 ноября, 2018 пользователем Самурай Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 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 натолкнул меня на правильный путь поиска, который через день поисков привёл меня к решению выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 ноября, 2018 Опубликовано 14 ноября, 2018 · Жалоба 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-блока. Так работает даже быстрее чем мой метод Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться