Решение извън реално време:
Ако искате да зададете параметри в 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