{"id":27040,"date":"2024-03-12T05:00:00","date_gmt":"2024-03-12T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=27040"},"modified":"2024-03-06T11:14:29","modified_gmt":"2024-03-06T10:14:29","slug":"generowanie-kodu-z-modelu-w-programie-matlab-simulink","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/generowanie-kodu-z-modelu-w-programie-matlab-simulink\/","title":{"rendered":"Generowanie kodu z modelu w programie Matlab Simulink"},"content":{"rendered":"\n<p>Zapewne wielu z Was s\u0142ysza\u0142o b\u0105d\u017a cho\u0107 raz w \u017cyciu korzysta\u0142o z oprogramowania do automatycznego generowania kodu. Dobrym przyk\u0142adem jest bran\u017ca automotive, w kt\u00f3rej na porz\u0105dku dziennym u\u017cywa si\u0119 takich narz\u0119dzi jak DaVinci czy te\u017c EB Tresos.<\/p>\n\n\n\n<p>Innym przyk\u0142adem oprogramowania automatycznie generuj\u0105cego kod jest CubeMX firmy STMicroelectronics. Jest to darmowe narz\u0119dzie do zastosowa\u0144 komercyjnych, kt\u00f3re pozwala na wygenerowaniu kodu odpowiedzialnego za obs\u0142ug\u0119 komponent\u00f3w hardwarowych.<\/p>\n\n\n\n<p>W tym artykule skupimy si\u0119 na narz\u0119dziach, kt\u00f3re pozwalaj\u0105 generowa\u0107 kod na podstawie modelu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Na pocz\u0105tek \u2013 czym s\u0105 Matlab i Simulink?<\/strong><\/h2>\n\n\n\n<p>Matlab to nie tylko program komputerowy \u2013 to zaawansowana platforma do wykonywania oblicze\u0144 naukowych i in\u017cynierskich, umo\u017cliwiaj\u0105ca tworzenie symulacji komputerowych. Ci\u0119\u017cko wymieni\u0107 wszystkie mo\u017cliwe zastosowania Matlaba, ale mo\u017cemy go u\u017cy\u0107 m.in. do:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>analizy danych,<\/li>\n\n\n\n<li>wizualizacji i eksploracji danych,<\/li>\n\n\n\n<li>programowania,<\/li>\n\n\n\n<li>symulacji sprz\u0119towych,<\/li>\n\n\n\n<li>oblicze\u0144 r\u00f3wnoleg\u0142ych (wspiera wykonywanie oblicze\u0144 i symulacji z wykorzystaniem GPU).<\/li>\n<\/ul>\n\n\n\n<p>Jednym z g\u0142\u00f3wnych element\u00f3w Matlaba jest narz\u0119dzie Simulink, b\u0119d\u0105ce platform\u0105 do wielodomenowej symulacji i projektowania system\u00f3w dynamicznych z wykorzystaniem modeli. Stanowi interaktywne \u015brodowisko graficzne oraz zbi\u00f3r bibliotek konfigurowalnych blok\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Po co generowa\u0107 kod z modelu?<\/strong><\/h2>\n\n\n\n<p>Do g\u0142\u00f3wnych zalet automatycznego generowania kodu mo\u017cemy zaliczy\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>uproszczenie procesu projektowania oprogramowania,<\/li>\n\n\n\n<li>wsp\u00f3\u0142praca interdyscyplinarna w projekcie celem szybszego rozwoju oprogramowania,<\/li>\n\n\n\n<li>\u0142atwiejsza certyfikacja kodu generowanego w oparciu o sprawdzony i ceniony generator,<\/li>\n\n\n\n<li>mo\u017cliwo\u015b\u0107 pracy w oparciu o model, kiedy hardware nie jest jeszcze gotowy.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Uproszczenie procesu projektowania oprogramowania<\/strong><\/h3>\n\n\n\n<p>Procesy tworzenia oprogramowania s\u0105 odpowiedzialne za stworzenie jednego lub wielu poziom\u00f3w wymaga\u0144 systemowych (dobrym przyk\u0142adem jest V-model stosowany w bran\u017cy Automotive). Wymagania wysokiego poziomu produkowane s\u0105 bezpo\u015brednio na podstawie analizy wymaga\u0144 systemowych i architektury systemu. S\u0105 one rozwijane w procesie projektowania oprogramowania, tworz\u0105c w ten spos\u00f3b powi\u0105zane ze sob\u0105 wymagania ni\u017cszego poziomu.<\/p>\n\n\n\n<p>Jednak\u017ce, gdy kod \u017ar\u00f3d\u0142owy generowany jest bezpo\u015brednio na podstawie wymaga\u0144 wysokopoziomowych, w\u00f3wczas wymagania te odpowiadaj\u0105 r\u00f3wnie\u017c wymaganiom niskopoziomowym i maj\u0105 do nich zastosowanie zalecenia dotycz\u0105ce wymaga\u0144 niskiego poziomu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wsp\u00f3\u0142praca interdyscyplinarna w projekcie celem szybszego rozwoju oprogramowania<\/strong><\/h3>\n\n\n\n<p>In\u017cynierowie posiadaj\u0105cy umiej\u0119tno\u015bci tworzenia modeli steruj\u0105cych nie musz\u0105 mie\u0107 du\u017cej wiedzy programistycznej, \u017ceby m\u00f3c wygenerowa\u0107 i przetestowa\u0107 model na rzeczywistym obiekcie steruj\u0105cym.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u0141atwiejsza certyfikacja kodu generowanego w oparciu o sprawdzony i ceniony generator<\/strong><\/h3>\n\n\n\n<p>Rozw\u00f3j system\u00f3w o wysokiej integralno\u015bci w przemy\u015ble motoryzacyjnym charakteryzuje si\u0119 wykazaniem zgodno\u015bci z ISO\u00ae 26262, mi\u0119dzynarodowym standardem bezpiecze\u0144stwa funkcjonalnego pojazd\u00f3w drogowych. ISO 26262 klasyfikuje funkcje na poziomach nienaruszalno\u015bci bezpiecze\u0144stwa motoryzacyjnego (ASIL) od A do D \u2013 czyli od najmniej do najbardziej rygorystycznego.<\/p>\n\n\n\n<p>Producenci OEM i dostawcy Tier-1 dostosowuj\u0105 swoje procesy rozwoju ECU do projektowania opartego na modelach zgodnie z norm\u0105 ISO 26262. MATLAB, Simulink, Stateflow, Embedded Coder, narz\u0119dzia do weryfikacji MATLAB i Simulink oraz narz\u0119dzia do weryfikacji kodu Polyspace\u00ae s\u0105 certyfikowane przez T\u00dcV S\u00dcD jako narz\u0119dzia kwalifikowane zgodnie z ISO 26262 dla ASIL A-D.<\/p>\n\n\n\n<p>Kwalifikacje opieraj\u0105 si\u0119 na zautomatyzowanym, specyficznym dla aplikacji procesie weryfikacji. Obs\u0142uguj\u0105 testowanie modelu i kodu w trybie back-to-back, zgodnie z zaleceniami normy ISO 26262-6 dla ASIL C i D, przy u\u017cyciu trybu symulacji procesora w p\u0119tli (PIL) w Simulink. W ten spos\u00f3b in\u017cynierowie mog\u0105 wykorzysta\u0107 optymalizacje kodera i kompilatora, w tym kod specyficzny dla procesora generowany przez Embedded Coder, do tworzenia szybkiego i wydajnego pami\u0119ciowo oprogramowania potrzebnego do masowej produkcji ECU.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Mo\u017cliwo\u015b\u0107 pracy w oparciu o model, kiedy hardware nie jest jeszcze gotowy<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Symulacja oprogramowania w p\u0119tli (ang. Software-In-the-Loop) kompiluje wygenerowany kod \u017ar\u00f3d\u0142owy i wykonuje go jako oddzielny proces na komputerze hosta. Por\u00f3wnuj\u0105c wyniki symulacji normalnej i SIL, mo\u017cna przetestowa\u0107 numeryczn\u0105 r\u00f3wnowa\u017cno\u015b\u0107 modelu i wygenerowanego kodu. Podczas symulacji SIL da si\u0119 zbiera\u0107 metryki pokrycia kodu i czasu wykonania dla wygenerowanego kodu.<\/li>\n\n\n\n<li>Symulacja procesora w p\u0119tli (ang. Processor-In-the-Loop) kompiluje wygenerowany kod \u017ar\u00f3d\u0142owy, a nast\u0119pnie pobiera i uruchamia kod obiektowy na docelowym sprz\u0119cie. Por\u00f3wnuj\u0105c wyniki symulacji normalnej i PIL, mo\u017cna przetestowa\u0107 r\u00f3wnowa\u017cno\u015b\u0107 numeryczn\u0105 modelu i wygenerowanego kodu. Podczas symulacji PIL da si\u0119 zbiera\u0107 metryki pokrycia kodu i czasu wykonania dla wygenerowanego kodu.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wady automatycznej generacji kodu<\/strong><\/h2>\n\n\n\n<p>Automatyczna generacja kodu nie jest te\u017c pozbawiona wad. Nale\u017c\u0105 do nich:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jako\u015b\u0107 kodu generowanego na podstawie modelu zale\u017cy od interpretacji wymaga\u0144 wysokiego poziomu. Ponadto, w normalnym procesie pewne nie\u015bcis\u0142o\u015bci mog\u0105 by\u0107 wykryte na etapie tworzenia wymaga\u0144 niskiego poziomu. W przypadku u\u017cycia modelu weryfikacja mo\u017ce by\u0107 trudniejsza.<\/li>\n\n\n\n<li>Integracja generowanego kodu mo\u017ce by\u0107 utrudniona ze wzgl\u0119du na jego nieprzejrzysto\u015b\u0107 i stopie\u0144 skomplikowania. U\u017cywaj\u0105c kodu generowanego, nale\u017cy pami\u0119ta\u0107 o zarezerwowaniu czasu potrzebnego na jego ewentualne dostosowanie do bardziej przyjaznej dla programisty formy.<\/li>\n\n\n\n<li>Generowany kod wymaga przej\u015bcia procesu przegl\u0105du kodu (ang. Review proces) pod wzgl\u0119dem wydajno\u015bci i zaj\u0119to\u015bci zasob\u00f3w. Mo\u017ce to by\u0107 utrudnione i wymaga\u0107 dodatkowego czasu, aby zrozumie\u0107 wygenerowany automatycznie kod.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Nic tak nie zaciemnia sytuacji jak prosty przyk\u0142ad<\/strong><\/h2>\n\n\n\n<p>W celu prezentacji mo\u017cliwo\u015bci generowania kodu w Matlab Simulink zdecydowa\u0142em si\u0119 stworzy\u0107 przyk\u0142adowy model, a nast\u0119pnie krok po kroku przedstawi\u0107 jak wygenerowa\u0107 kod.<\/p>\n\n\n\n<p>Na co dzie\u0144 pracuj\u0119 w bran\u017cy Automotive, ale ze wzgl\u0119du na odbyte studia temat lotnictwa jest mi szczeg\u00f3lnie drogi. Jednym z istotnych system\u00f3w, kt\u00f3re znajd\u0105 si\u0119 na pok\u0142adzie wsp\u00f3\u0142czesnego samolotu, jest autopilot kursu umo\u017cliwiaj\u0105cy lot w zadanym kierunku. Dlatego postanowi\u0142em <strong>zbudowa\u0107 w Simulinku uproszczony model autopilota kursu dla UAV<\/strong> (bezza\u0142ogowy statek powietrzny) umo\u017cliwiaj\u0105cy zar\u00f3wno zadanie kursu jak i k\u0105ta przechylenia.<\/p>\n\n\n\n<p>Wykonanie pe\u0142nego modelu autopilota zaj\u0119\u0142oby du\u017co czasu, dlatego wybra\u0142em tylko cz\u0119\u015b\u0107 logiki, \u017ceby zaprezentowa\u0107 dzia\u0142anie oprogramowania do generacji kodu. Za\u0142o\u017cenia przy tworzeniu modelu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mamy do czynienia z modelem samolotu wykonuj\u0105cym zakr\u0119t poprzez przechylenie modelu na jedno ze skrzyde\u0142.<\/li>\n\n\n\n<li>Sterujemy tylko wychyleniem lotek \u2013 oznaczanym dalej dA \u2013 ze wzgl\u0119du na uproszczony model, interesuje nas samo wygenerowanie kodu, a nie poprawne sterowanie.<\/li>\n<\/ul>\n\n\n\n<p>\u017beby zacz\u0105\u0107 tworzy\u0107 model, nale\u017cy uruchomi\u0107 program Matlab a nast\u0119pnie wybra\u0107 New => Simulink Model \u2013 jak pokazano na Ryc. 1:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image1.jpeg\"><img decoding=\"async\" width=\"1024\" height=\"544\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image1-1024x544.jpeg\" alt=\"Utworzenie modelu Simulink\" class=\"wp-image-27041\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image1-1024x544.jpeg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image1-300x159.jpeg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image1-768x408.jpeg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image1.jpeg 1125w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 Utworzenie modelu Simulink<\/figcaption><\/figure>\n\n\n\n<p>Otwiera si\u0119 nam w\u00f3wczas puste okno nowego modelu. Najpro\u015bciej je uzupe\u0142ni\u0107, wstawiaj\u0105c gotowe elementy z wykorzystaniem opcji Library browser \u2013 jak wida\u0107 na Ryc. 2.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image2.jpeg\"><img decoding=\"async\" width=\"1024\" height=\"554\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image2-1024x554.jpeg\" alt=\"Nowe puste okno\" class=\"wp-image-27043\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image2-1024x554.jpeg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image2-300x162.jpeg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image2-768x415.jpeg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image2.jpeg 1413w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2 Nowe puste okno<\/figcaption><\/figure>\n\n\n\n<p>Dost\u0119pna w Simunlinku biblioteka jest do\u015b\u0107 rozbudowana i jej \u0142adowanie mo\u017ce zaj\u0105\u0107 do kilku minut. Elementy biblioteczne s\u0105 posegregowane w tematyczne grupy \u2013 jak wida\u0107 na Ryc. 3.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image3.jpeg\"><img decoding=\"async\" width=\"1024\" height=\"579\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image3-1024x579.jpeg\" alt=\"Biblioteka element\u00f3w\" class=\"wp-image-27045\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image3-1024x579.jpeg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image3-300x170.jpeg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image3-768x434.jpeg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image3.jpeg 1419w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 3 Biblioteka element\u00f3w<\/figcaption><\/figure>\n\n\n\n<p>Elementy biblioteki mo\u017cna umie\u015bci w modelu, przeci\u0105gaj\u0105c je z okna biblioteki do okna modelu. Maj\u0105 one na swoim obrysie zaznaczone czarnymi strza\u0142kami wej\u015bcia i wyj\u015bcia. Po\u0142\u0105czenie nast\u0119puje przez przeci\u0105gni\u0119cie kursorem myszy od wyj\u015bcia jednego elementu do wej\u015bcia drugiego z wci\u015bni\u0119tym lewym przyciskiem myszy. Je\u015bli jednak dwa elementy znajduj\u0105 na modelu na jednej linii, program sam zaproponuje po\u0142\u0105czenie s\u0142abo widoczn\u0105 niebiesk\u0105 strza\u0142k\u0105 \u2013 jak wida\u0107 na Ryc. 4. \u017beby u\u017cy\u0107 proponowanego po\u0142\u0105czenia, wystarczy j\u0105 (strza\u0142k\u0119) klikn\u0105\u0107 lewym przyciskiem myszy.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image4.jpeg\"><img decoding=\"async\" width=\"1024\" height=\"529\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image4-1024x529.jpeg\" alt=\"\u0141\u0105czenie element\u00f3w\" class=\"wp-image-27047\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image4-1024x529.jpeg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image4-300x155.jpeg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image4-768x397.jpeg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image4.jpeg 1415w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 4 \u0141\u0105czenie element\u00f3w<\/figcaption><\/figure>\n\n\n\n<p>Podw\u00f3jne klikni\u0119cie lewym przyciskiem myszy pozwala dokona\u0107 dalszych ustawie\u0144 elementu \u2013 jak wida\u0107 na Ryc. 5.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image5.jpeg\"><img decoding=\"async\" width=\"1024\" height=\"475\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image5-1024x475.jpeg\" alt=\"\" class=\"wp-image-27049\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image5-1024x475.jpeg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image5-300x139.jpeg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image5-768x357.jpeg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image5.jpeg 1415w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 5 Ustawienia elementu<\/figcaption><\/figure>\n\n\n\n<p>Na Ryc. 6 znajduje si\u0119 sko\u0144czony model uproszczonego autopilota kursu:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image6.png\"><img decoding=\"async\" width=\"517\" height=\"381\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image6.png\" alt=\"Model autopilota kursu\" class=\"wp-image-27051\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image6.png 517w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image6-300x221.png 300w\" sizes=\"(max-width: 517px) 100vw, 517px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 6 Model autopilota kursu<\/figcaption><\/figure>\n\n\n\n<p>Jak wida\u0107 na Ryc. 6, autopilot ma dost\u0119pnych 5 sygna\u0142\u00f3w wej\u015bciowych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mode \u2013 tryb pracy,<\/li>\n\n\n\n<li>Psi_set \u2013 zadany kurs,<\/li>\n\n\n\n<li>Psi_measured \u2013 aktualnie zmierzony kurs,<\/li>\n\n\n\n<li>Phi_set \u2013 zadany k\u0105t przechylenia,<\/li>\n\n\n\n<li>Phi_measured \u2013 aktualnie zmierzony k\u0105t przechylenia.<\/li>\n<\/ul>\n\n\n\n<p>Autopilot ma dost\u0119pny 1 sygna\u0142 wyj\u015bciowy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dA \u2013 wychylenie lotek.<\/li>\n<\/ul>\n\n\n\n<p>Kiedy mamy sko\u0144czony model, mo\u017cemy przej\u015b\u0107 do generacji kodu. \u017beby to zrobi\u0107, nale\u017cy najpierw ustawi\u0107 \u017c\u0105dane opcje. Ryc. 7 prezentuje widok okna Simulink przy wybieraniu zak\u0142adki opcji generacji kodu.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image7.png\"><img decoding=\"async\" width=\"1021\" height=\"616\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image7.png\" alt=\"Wyb\u00f3r zak\u0142adki opcji generacji kodu\" class=\"wp-image-27053\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image7.png 1021w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image7-300x181.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image7-768x463.png 768w\" sizes=\"(max-width: 1021px) 100vw, 1021px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 7 Wyb\u00f3r zak\u0142adki opcji generacji kodu<\/figcaption><\/figure>\n\n\n\n<p>W zak\u0142adce opcji generacji kodu nale\u017cy wybra\u0107 Coder i j\u0119zyk \u2013 jak wida\u0107 na Ryc. 7. Pozosta\u0142e opcje nie s\u0105 na ten moment potrzebne.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image8.png\"><img decoding=\"async\" width=\"907\" height=\"630\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image8.png\" alt=\"Opcje generacji kodu\" class=\"wp-image-27055\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image8.png 907w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image8-300x208.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image8-768x533.png 768w\" sizes=\"(max-width: 907px) 100vw, 907px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 8 Opcje generacji kodu<\/figcaption><\/figure>\n\n\n\n<p>Nast\u0119pnie, rozpoczynamy proces generacji. Poni\u017cej na Ryc. 9 widoczne jest okno Simulink podczas uruchamiania generatora:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image9.png\"><img decoding=\"async\" width=\"861\" height=\"619\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image9.png\" alt=\"Uruchamianie generatora\" class=\"wp-image-27057\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image9.png 861w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image9-300x216.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image9-768x552.png 768w\" sizes=\"(max-width: 861px) 100vw, 861px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 9 Uruchamianie generatora<\/figcaption><\/figure>\n\n\n\n<p>Narz\u0119dzie przeprowadza u\u017cytkownika krok po kroku, a\u017c do osi\u0105gni\u0119cia sukcesu b\u0105d\u017a raportu b\u0142\u0119d\u00f3w. Pierwsz\u0105 na drodze do generacji jest zak\u0142adka powitalna Ryc. 10.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image10.png\"><img decoding=\"async\" width=\"981\" height=\"588\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image10.png\" alt=\"Zak\u0142adka powitalna\" class=\"wp-image-27059\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image10.png 981w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image10-300x180.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image10-768x460.png 768w\" sizes=\"(max-width: 981px) 100vw, 981px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 10 Zak\u0142adka powitalna<\/figcaption><\/figure>\n\n\n\n<p>W zak\u0142adce \u201eSystem\u201d generatora widocznej na Ryc. 11 mo\u017cemy wybra\u0107 jako \u017ar\u00f3d\u0142o dla procesu ca\u0142y model b\u0105d\u017a subsytem w przypadku wi\u0119kszego, bardziej z\u0142o\u017conego modelu:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image11.png\"><img decoding=\"async\" width=\"985\" height=\"593\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image11.png\" alt=\"Zak\u0142adka System\" class=\"wp-image-27061\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image11.png 985w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image11-300x181.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image11-768x462.png 768w\" sizes=\"(max-width: 985px) 100vw, 985px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 11 Zak\u0142adka System<\/figcaption><\/figure>\n\n\n\n<p>W zak\u0142adce Output widocznej na Ryc. 11 jeszcze raz jeste\u015bmy pytani o j\u0119zyk generowanego kodu:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image12.png\"><img decoding=\"async\" width=\"983\" height=\"589\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image12.png\" alt=\"Zak\u0142adka Output\" class=\"wp-image-27063\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image12.png 983w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image12-300x180.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image12-768x460.png 768w\" sizes=\"(max-width: 983px) 100vw, 983px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 12 Zak\u0142adka Output<\/figcaption><\/figure>\n\n\n\n<p>Nast\u0119pne dwie grafiki Ryc. 13 i Ryc. 14 przedstawiaj\u0105 analiz\u0119, kt\u00f3r\u0105 przeprowadza program przed generacj\u0105:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image13.png\"><img decoding=\"async\" width=\"984\" height=\"591\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image13.png\" alt=\"Start Analizy\" class=\"wp-image-27066\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image13.png 984w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image13-300x180.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image13-768x461.png 768w\" sizes=\"(max-width: 984px) 100vw, 984px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 13 Start analizy<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image14.png\"><img decoding=\"async\" width=\"982\" height=\"591\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image14.png\" alt=\"Rezultat analizy\" class=\"wp-image-27068\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image14.png 982w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image14-300x181.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image14-768x462.png 768w\" sizes=\"(max-width: 982px) 100vw, 982px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 14 Rezultat analizy<\/figcaption><\/figure>\n\n\n\n<p>Kolejna zak\u0142adka zaprezentowana na Ryc. 15 dotyczy rozmiaru u\u017cytych zmiennych. Mo\u017cemy w niej r\u00f3wnie\u017c wybra\u0107 architektur\u0119 docelowego procesora, na kt\u00f3rym mia\u0142by dzia\u0142a\u0107 wygenerowany kod, w moim przypadku ARM Cortex:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image15.png\"><img decoding=\"async\" width=\"982\" height=\"589\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image15.png\" alt=\"Zak\u0142adka Word Size\" class=\"wp-image-27070\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image15.png 982w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image15-300x180.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image15-768x461.png 768w\" sizes=\"(max-width: 982px) 100vw, 982px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 15 Zak\u0142adka Word Size<\/figcaption><\/figure>\n\n\n\n<p>W zak\u0142adce Optimization mo\u017cemy wybra\u0107, pod jakim k\u0105tem ma by\u0107 optymalizowany generowany kod.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image16.png\"><img decoding=\"async\" width=\"984\" height=\"590\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image16.png\" alt=\"Zak\u0142adka Optimization\" class=\"wp-image-27072\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image16.png 984w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image16-300x180.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image16-768x460.png 768w\" sizes=\"(max-width: 984px) 100vw, 984px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 16 Zak\u0142adka Optimization<\/figcaption><\/figure>\n\n\n\n<p>W ostatniej dost\u0119pnej zak\u0142adce przedstawionej na Ryc. 17 znajdziemy podsumowanie wybranych ustawie\u0144:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image17.png\"><img decoding=\"async\" width=\"980\" height=\"589\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image17.png\" alt=\"Podsumowanie wybranych ustawie\u0144\" class=\"wp-image-27074\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image17.png 980w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image17-300x180.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image17-768x462.png 768w\" sizes=\"(max-width: 980px) 100vw, 980px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 17 Podsumowanie wybranych ustawie\u0144<\/figcaption><\/figure>\n\n\n\n<p>Po zako\u0144czonej generacji kodu przechodzimy do widoku ko\u0144cowego, sk\u0105d mo\u017cliwe jest wy\u015bwietlenie raportu ko\u0144cowego, co zosta\u0142o zaprezentowane na Ryc. 18<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image18.png\"><img decoding=\"async\" width=\"982\" height=\"586\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image18.png\" alt=\"Widok ko\u0144cowy\" class=\"wp-image-27076\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image18.png 982w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image18-300x179.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image18-768x458.png 768w\" sizes=\"(max-width: 982px) 100vw, 982px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 18 Widok ko\u0144cowy<\/figcaption><\/figure>\n\n\n\n<p>W raporcie znajdziemy informacje o zadanych ustawieniach, wygenerowanych plikach czy opis zmiennych, co wida\u0107 na zrzutach z programu \u2013 Ryc. 19 i Ryc. 20.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image19.png\"><img decoding=\"async\" width=\"995\" height=\"854\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image19.png\" alt=\"Raport \u2013 podsumowanie\" class=\"wp-image-27078\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image19.png 995w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image19-300x257.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image19-768x659.png 768w\" sizes=\"(max-width: 995px) 100vw, 995px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 19 Raport \u2013 podsumowanie<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image20.png\"><img decoding=\"async\" width=\"914\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image20-914x1024.png\" alt=\"Raport \u2013 interfejs kodu\" class=\"wp-image-27080\" style=\"object-fit:cover\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image20-914x1024.png 914w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image20-268x300.png 268w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image20-768x861.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image20.png 994w\" sizes=\"(max-width: 914px) 100vw, 914px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 20 Raport \u2013 interfejs kodu<\/figcaption><\/figure>\n\n\n\n<p>Sam kod b\u0119dzie zawiera\u0142 nazwy u\u017cyte w modelu dla \u0142atwiejszej integracji, co przedstawia Ryc. 20.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image21.png\"><img decoding=\"async\" width=\"790\" height=\"275\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image21.png\" alt=\"Widok przedstawiaj\u0105cy fragment nag\u0142\u00f3wka wygenerowanego kodu\" class=\"wp-image-27082\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image21.png 790w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image21-300x104.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/image21-768x267.png 768w\" sizes=\"(max-width: 790px) 100vw, 790px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 21 Widok przedstawiaj\u0105cy fragment nag\u0142\u00f3wka wygenerowanego kodu<\/figcaption><\/figure>\n\n\n\n<p>Pliki powsta\u0142e w wyniku generacji kodu zostan\u0105 utworzone w folderze, w kt\u00f3rym stworzyli\u015bmy model. Warto pami\u0119ta\u0107 o tym, \u017ce Coder u\u017cyje nazw u\u017cytych w modelu. Je\u015bli jasno i szczeg\u00f3\u0142owo opiszemy model, nie tylko wej\u015bcia i wyj\u015bcia, ale u\u017cyte elementy biblioteczne i&nbsp;sygna\u0142y, u\u0142atwi to odnalezienie si\u0119 w plikach wyj\u015bciowych.<\/p>\n\n\n\n<p>Wygenerowany kod:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mo\u017ce by\u0107 por\u00f3wnany w symulacji z utworzonym modelem,<\/li>\n\n\n\n<li>mo\u017ce by\u0107 edytowany \u201er\u0119cznie\u201d,<\/li>\n\n\n\n<li>wymaga review pod wzgl\u0119dem wydajno\u015bci,<\/li>\n\n\n\n<li>mo\u017ce wymaga\u0107 refaktoryzacji dla u\u0142atwienia integracji i zrozumienia.<\/li>\n<\/ul>\n\n\n\n<p>Po osi\u0105gni\u0119ciu celu, kiedy uzyskamy pliki \u017ar\u00f3d\u0142owe, mo\u017cemy przyst\u0105pi\u0107 do integracji kodu b\u0105d\u017a\/i symulacji SIL\/PIL.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Celem artyku\u0142u by\u0142o wprowadzenie czytelnika w tematyk\u0119 oprogramowanie do automatycznego generowania kodu i zach\u0119cenie do samodzielnego pog\u0142\u0119biania wiedzy. Simulink jest bardzo rozbudowanym narz\u0119dziem, kt\u00f3re dostarcza sporo gotowych bibliotek, pocz\u0105wszy od transformacji sygna\u0142\u00f3w, przez filtracj\u0119, a\u017c po biblioteki atmosfery, zjawisk pogodowych, dynamiki obiekt\u00f3w i narz\u0119dzi dla system\u00f3w czasu rzeczywistego. Ponadto, z ka\u017cd\u0105 kolejn\u0105 wersj\u0105 dok\u0142adane s\u0105 nowe funkcjonalno\u015bci i biblioteki.<\/p>\n\n\n\n<p>Parafrazuj\u0105c Bilbo Baginnsa \u2013 po\u0142owy z nich nie pozna\u0142em, a mniej ni\u017c po\u0142ow\u0119 chcia\u0142bym zna\u0107, cho\u0107 w po\u0142owie tak dobrze, jak na to zas\u0142uguj\u0105. Matlab jest p\u0142atnym narz\u0119dziem komercyjnym, ale dost\u0119pne s\u0105 30-dniowe wersje darmowe lub licencje studenckie. Firma MathWorks oferuje te\u017c ni\u017csze ceny na produkty do u\u017cytku domowego w stosunku do cen dla firm oraz pe\u0142n\u0105 dowolno\u015b\u0107 przy dostosowywaniu pakietu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Bibliografia<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.mathworks.com\/products\/matlab.html?s_tid=hp_products_matlab\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Mathworks \u2013 Matlab<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.mathworks.com\/products\/simulink.html?s_tid=hp_products_simulink\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Mathworks \u2013 Simulink<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.mathworks.com\/solutions\/automotive\/standards\/autosar.html\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Mathworks \u2013 Autosar<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.mathworks.com\/solutions\/embedded-code-generation\/production-code-automotive-ecu.html\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Mathworks \u2013 Automotive Code Generation<\/a><\/li>\n<\/ol>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli artyku\u0142 Ci\u0119 zainteresowa\u0142, zajrzyj r\u00f3wnie\u017c koniecznie <a href=\"https:\/\/sii.pl\/blog\/all\/embedded\/\" target=\"_blank\" aria-label=\"do innych tekst\u00f3w (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">do innych tekst\u00f3w<\/a> przygotowanych przez naszych ekspert\u00f3w Embedded.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;27040&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;5&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.6&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.6\\\/5 ( votes: 5)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Generowanie kodu z modelu w programie Matlab Simulink&quot;,&quot;width&quot;:&quot;127.9&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 127.9px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.6\/5 ( votes: 5)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Zapewne wielu z Was s\u0142ysza\u0142o b\u0105d\u017a cho\u0107 raz w \u017cyciu korzysta\u0142o z oprogramowania do automatycznego generowania kodu. Dobrym przyk\u0142adem jest &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/generowanie-kodu-z-modelu-w-programie-matlab-simulink\/\">Continued<\/a><\/p>\n","protected":false},"author":616,"featured_media":27085,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[2174,2173,1546,1512,563],"class_list":["post-27040","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-simulink","tag-matlab","tag-przeglad-narzedzi","tag-poradnik","tag-embedded"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/03\/Generowanie-kodu-z-modelu-w-programie-Matlab-Simulink.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/27040"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/616"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=27040"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/27040\/revisions"}],"predecessor-version":[{"id":27088,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/27040\/revisions\/27088"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/27085"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=27040"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=27040"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=27040"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}