2013-06-09 11 views
7

Chcę pobrać dane z simulink podczas symulacji i użyć funkcji sieci szeregowej, aby wysłać te dane do innego programu. Ponieważ muszę użyć innego programu, aby wykonać pewne sztuczki i wysłać polecenie z powrotem do simulink, więc muszę pobierać dane z simulink podczas pracy, aby inny program mógł wykonać odpowiednie polecenie.Jak wyeksportować dane Simulink do obszaru roboczego podczas symulacji?

Próbowałem już za pomocą To Workspace bloku, aby wyeksportować dane.

enter image description here

Mogę jednak tylko dostał wartość na samym początku symulacji.

Próbowałem też użyć zakresu i zmienić niektóre właściwości: zaznacz Zapisz dane w obszarze roboczym i odznacz Limituj dane do Ostatniej.

enter image description here

enter image description here

Najpierw zacząłem symulacji i znalazłem ScopeData nie pojawiają się w obszarze roboczym. Dopiero po zatrzymaniu symulacji ScopeData pojawi się w przestrzeni roboczej.

enter image description here

A potem mogę wykorzystać ScopeData.signals.values ​​uzyskać wartości.

Ale ja chcę: kiedy rozpocznę symulację, ScopeData pojawi się w przestrzeni roboczej, dzięki czemu będę mógł wysłać te dane do innego programu.

Czy ktoś wie, jak to osiągnąć?

Znalazłem this page może być pomocne, ale nadal nie wiem jak do ciągłego eksportu danych podczas symulacji.

+0

Czy wysyłasz dane do programu Matlab lub innego programu, takiego jak Excel lub coś podobnego? Jeśli tak, to jaki inny program? –

+0

Wysyłam dane do Proteus, ponieważ chcę napisać kilka poleceń na mikroczipie, aby kontrolować bloki w simulink. –

+0

Wiem, że można uzyskać dane na liniach simulin za pomocą ['get_param'] (http://www.mathworks.com/help/simulink/slref/get_param.html) cammand, gdy Simulink jest ustawiony na ** zewnętrzny Tryb ** podczas symulacji (nie jestem pewien innych trybów). Możesz ustawić timer (z tą samą częstotliwością simulink) i zrobić to w swoim "callbacku". – pm89

Odpowiedz

10

Użyj get_param, aby odczytać dane właśnie w bieżącym czasie. Przesłać również dane do Simulink z set_param wzmocnienia lub innego bloku.

Przykładem z get_param

Pierwszy obciążenie i początku symulacji:

load_system('myModel') 
set_param('myModel','SimulationCommand','Start'); 

Aby odczytać dane na każdej linii modelu Simulink:

  1. Uzyskaj blok simulink obje ct (spróbujmy zegar z nazwą Clock):

    block = 'myModel/Clock'; 
    rto = get_param(block, 'RuntimeObject'); 
    
  2. Następnie uzyskać dane na jego pierwszy (lub dowolny) port wyjściowy (lub wejścia) tego bloku.

    time = rto.OutputPort(1).Data; 
    

Można zrobić odczyt, w zwrotnego czasomierza.

Również może to być pomocne: Command Line Functionality for Simulink

+3

Mimo że dostarczyłoby ci to trochę danych, zegar pracuje w MATLAB i ma nie ma nic wspólnego z symulacją Simulink, więc nie ma gwarancji uzyskania danych w czasie symulacji, który może być potrzebny. –

+0

Zgadzam się z tobą @PhilGoddard, ale uznałem to za jedyny sposób. Istnieje jednak kilka obejść i brudnych sztuczek, aby zapobiec brakowi jakichkolwiek danych, takich jak zwiększenie częstotliwości zegara (w celu zmniejszenia prawdopodobieństwa utraty jakichkolwiek danych) i ustawienie licznika w simulink (aby zapobiec otrzymaniu tych samych danych dwa razy i skanowanie, jeśli jakiekolwiek dane są zagubiony lub nie). – pm89

+0

Obejścia nie zapobiegną brakującym danym. Mogą pomóc w utracie mniejszej ilości danych, ale nie mogą zagwarantować, że stracisz brak danych. –

3

Podczas symulacji Simulink przechowuje zarejestrowane dane w buforze wewnętrznym i zapisuje dane tylko w obszarze roboczym, gdy symulacja jest wstrzymana lub zatrzymana. To brzmi tak, jakbyś naprawdę musiał napisać funkcję S (która otrzyma wartości sygnału na podstawie czasu i czasu) i komunikować się z Proteus w ten sposób.

Oczywiście Simulink jest symulatorem nie działającym w czasie rzeczywistym, więc jeśli mówisz o zrobieniu czegoś przypominającego kontrolę w czasie rzeczywistym, najprawdopodobniej podejmiesz całkowicie niewłaściwe podejście.

+0

Chcę sterować ramieniem robota w symulatorze (w rzeczy samej, symulując), używając mikroprocesora w Porteus jako kontrolera. Czy to nie jest osiągalne? Nie rozumiem znaczenia Simulinka jako symulatora nie działającego w czasie rzeczywistym ~ –

+2

Żaden system operacyjny uruchamiany przez MATLAB/Simulink nie działa w czasie rzeczywistym. Między innymi oznacza to, że 1 jednostka czasu symulacji jest (prawie na pewno) równa 1 jednostce czasu rzeczywistego. Zegar w Simulink może powiedzieć, że działa przez 10 sekund, ale zegar na ścianie może powiedzieć coś mniej niż 10 lub więcej niż 10 sekund (w zależności od złożoności modelu). O ile nie potrzebujesz tylko niskiej częstotliwości próbkowania i nie zależy Ci na gwarantowanej wydajności, to do sterowania w czasie rzeczywistym musisz przekonwertować model na C (używając Simulink Coder), a następnie skompilować i uruchomić ten kod w systemie czasu rzeczywistego. –

+0

Zawsze możesz przetestować swoją logikę, przesyłając strumieniowe dane na żywo do kontrolera, biorąc pod uwagę, że nie jest to czas rzeczywisty. Główna logika może być przetestowana, ale krytyczne zadania synchronizacji nie będą możliwe (np. Czas reakcji w mikrosekundach zdarzenia, które ma miejsce w przypadku przerwania lub czegoś podobnego). – Karim

2

W dowolnym momencie podczas symulacji można wymusić Simulink zapisywać dane wyjściowe symulacji do obszaru roboczego:

set_param(bdroot,'SimulationCommand','WriteDataLogs'); 

Odkryłam, że to polecenie jest dość unstable w moim Matlab 2010a dla Win64. W szczególności muszę tego uniknąć, gdy symulacja zostanie zatrzymana (tj. Pierwsza kontrola: get_param(bdroot,'SimulationStatus')), w przeciwnym razie Matlab pokazuje błąd i prosi o ponowne uruchomienie.

+0

Tego właśnie szukałem! Działa również podczas symulacji w czasie rzeczywistym. –

Powiązane problemy