Как да получа данни от блок Simulink в GUI на MATLAB?

Имам модел Simulink, който използва вградена MATLAB функция за блок, и не успях да разбера как да премествам данни между вградения MATLAB блок и GUI в реално време (т.е. докато моделът работи). Опитах се да внедря блок "към работно пространство" в моя модел, но не знам как да го използвам правилно.

Някой знае ли как да премести данни от блок Simulink в GUI в реално време?


person Community    schedule 07.08.2009    source източник
comment
моля, изяснете... какви данни, какви стойности, какви параметри, опитвате ли се да прочетете параметри от модела в .m файл, или се опитвате да зададете параметри от модела в .m файл, или се опитвате да използване на променливи на работното пространство в модел? (или нещо друго)   -  person Jason S    schedule 07.08.2009
comment
благодаря много за бързия отговор, джейсън... виж, имам модел на simulink, не много блокове, и в този модел използвам вградена matlab функция... и е невъзможно да използвам входа или изхода на това вграден matlab блок в моя gui в реално време. Опитах се да внедря блок to workspace в моя модел и аз се показвах в реално време в модела, но не знам как да използвам това, как да внедря това в моя графичен интерфейс, че мога да използвам тези стойности на входа или изход на моята вградена функция.   -  person    schedule 07.08.2009


Отговори (2)


Решение извън реално време:

Ако искате да зададете параметри в GUI, да симулирате модел с тези параметри и след това да покажете резултата от симулацията в GUI, има добър урок на blinkdagger.com. Едно решение, което описват, е използването на SIMSET функция, за да определите с кое работно пространство си взаимодейства моделът Simulink. Трябва да можете да замените основното работно пространство, така че вместо това данните да се изпращат към и от работното пространство на GUI функциите, които извикват модела Simulink.

Решение в реално време

Както е предложено от MikeT, можете да използвате RuntimeObject. Първо трябва да използвате функцията get_param за да получите RuntimeObject от блока:

rto = get_param(obj,'RuntimeObject');

Където obj е или пътека на блок, или манипулатор на блок-обект. Можете да получите името на пътя на последния избран блок, като използвате GCB (в който случай можете да замените obj с gcb). След това можете да получите изхода на блока със следното:

blockData = rto.OutputPort(1).Data

Едно допълнително предупреждение от документацията:

За да сте сигурни, че полето за данни съдържа правилния изходен блок, изключете опцията Повторно използване на хранилището на сигнала (вижте Повторно използване на хранилището на сигнала) в панела Оптимизация в Конфигурационни параметри< /strong> диалогов прозорец.

Вероятно ще завършите с цикъл или рутинна програма за таймер, работеща във вашия GUI, която непрекъснато ще получава изходните данни от RuntimeObject, докато се изпълнява симулацията. В документацията се посочва още:

Обект по време на изпълнение съществува само докато моделът, съдържащ блока, се изпълнява или е на пауза. Ако моделът е спрян, get_param връща празен манипулатор. Когато спрете или поставите на пауза модел, всички съществуващи манипулатори за обекти по време на изпълнение стават празни.

По този начин вашата програма за цикъл или таймер ще трябва да продължи да проверява първо дали RuntimeObject съществува и или да спре (ако не съществува), или да получи данните от него (ако съществува). Не съм сигурен точно как да проверя за съществуване на RuntimeObject, но вярвам, че ще проверите дали обектът е празен или дали BlockHandle свойството на обекта е празно:

isempty(rto)  % Check if the RuntimeObject is empty
%OR
isempty(rto.BlockHandle)  % Check if the BlockHandle property is empty
person gnovice    schedule 07.08.2009
comment
добре, но не е ли възможно да зададете параметрите без да използвате работното пространство? Вече мога да задам блока на усилването от моя графичен интерфейс ... искам да кажа, че мога да задам константата на блока от моя графичен интерфейс с плъзгач. но аз не знам как да получа стойностите на от моята вградена matlab функция. трябва да има нещо без използване на работно пространство - person ; 07.08.2009
comment
Мисля, че тук има прекъсване на комуникацията. Погледнахте ли примера, към който дадох връзка на blinkdagger? Това ли е нещото, което се опитвате да направите (задаване на параметри в GUI, симулиране на модел с тези параметри, след това показване на изхода от симулацията в GUI)? - person gnovice; 07.08.2009
comment
Предполагам, че е, но не мога да отворя това или просто не знам как, виждам само 52 коментара :s - person ; 08.08.2009
comment
Връзките са лесни за пропускане. Урокът има 4 страници. След въведението и преди коментарите трябва да видите Страници: 1 2 3 4, като всяко число е връзка към страница от урока. - person gnovice; 08.08.2009

От вашите отговори предполагам, че искате да видите резултатите, докато симулацията работи, така ли е? Урокът на blinkdagger.com ви позволява да преглеждате резултатите от симулацията, след като е направена, но не и докато се изпълнява. Всъщност искате ли да вградите нещо като блок за обхват във вашия GUI?

Има няколко начина да направите това, най-добрият вероятно е да използвате обект по време на изпълнение. Ако използвате това, трябва да можете да гледате изхода на EML блока, докато работи.

person MikeT    schedule 08.08.2009
comment
да, искам да използвам резултата от EML, докато симулацията работи. има пример за извикването ... rto = get_param(gcb,'RuntimeObject') ... така че синтаксисът в моя случай е просто rto = get_param(gcb,'name_simulink_block'), където name_simulink_block е името на моя EML? ?? - person ; 08.08.2009