Sterowniki Programowalne (SP) Wykład 12 Ze środowiska szybkiego prototypowania do implementacji na sterowniku: przykłady w oparciu o Simulink PLC Coder WYDZIAŁ ELEKTROTECHNIKI I AUTOMATYKI KATEDRA INŻYNIERII SYSTEMÓW STEROWANIA Tomasz Karla Październik 2016 1
Plan prezentacji Środowisko szybkiego prototypowania a implementacja Simulink PLC Coder szybka implementacja na sterowniku PLC Opis podstawowych funkcjonalności Simulink PLC Coder Kompatybilność IDE Wykorzystywane bloki Ograniczenia Procedura generowania kodu dla PLC w języku ST Struktura generowanego kodu źródłowego Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na sterownikach GeFanuc oraz Siemens Przykładowe wygenerowane kody i ogólne wskazówki 2
Środowisko szybkiego prototypowania a implementacja Środowiska szybkiego prototypowania nastawione są na podstawowe badania i testy samych algorytmów i struktur Implementacja często wymaga dostosowywania konkretnych algorytmów do wymagań konkretnych rozwiązań sprzętowoprogramowych Istnieją narzędzia, które pozwalają na zautomatyzowane przechodzenie od projektów ze środowisk szybkiego prototypowania do implementacji, jednak są one często obarczone wieloma obostrzeniami 3
Simulink PLC Coder szybka implementacja na sterowniku PLC Simulink PLC Coder jest narzędziem pakietu oprogramowania MATLAB, który pozwala na targetowanie (generowanie kodu źródłowego kompatybilnego z konkretnym urządzeniem) bloków z modeli Simulink do sterowników PLC Generowany kod źródłowy aplikacji może być w postaci kodu drabinkowego (tylko i wyłącznie operacje binarne na stycznikach i przekaźnikach) oraz w języku ST (Structural Text) Simulink PLC Coder wspiera szereg IDE (ang. Integrated Development Environment) dla sterowników PLC różnych producentów, jednak nie wszystkie są wspierane w jednakowym stopniu. Występują duże ograniczenia w ilości wykorzystywanych bloków z przyborników Simulink czy też możliwych opcji solverów. 4
Opis podstawowych funkcjonalności Simulink PLC Coder Kompatybilność IDE Kompatybilność ze sterownikami PLC dla języka ST: 3S-Smart Software Solutions CODESYS Version 2.3 or 3.3 or 3.5 (SP4 or later) B&R Automation Studio 3.0 or 4 Beckhoff TwinCAT 2.11 or 3 KW-Software MULTIPROG 5.0 or 5.5 OMRON Sysmac Studio Version 1.04, 1.05, 1.09 or 1.12 Phoenix Contact PC WORX 6.0 Rexroth IndraWorks version 13V12 IDE Rockwell Automation RSLogix 5000 Series Version 17, 18, 19 or 20 and Rockwell Studio 5000 Logix Designer Version 21 or 24 Siemens SIMATIC STEP 7 Version 5.3, 5.4 or 5.5 Siemens TIA Portal V13 Generic PLCopen XML Kompatybilność ze sterownikami PLC dla języka drabinkowego: 3S-Smart Software Solutions CODESYS Version 3.5 SP6 Rockwell Automation RSLogix 5000 Series Version 20 and Rockwell Studio 5000 Logix Designer Version 24 PLCopen XML 5
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki 6
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki Additional Math & Discrete 7
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki Commonly Used Blocks 8
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Discontinuities 9
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Discrete 10
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Logic and Bit Operations 11
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Lookup Tables 12
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Math Operations 13
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Model Verification 14
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Model-Wide Utilities 15
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Ports & Subsystems 16
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Signal Attributes 17
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Signal Routing 18
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Sinks 19
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Sources 20
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - User-Defined Functions 21
Opis podstawowych funkcjonalności Simulink PLC Coder Wykorzystywane bloki - Supported Stateflow Blocks Stateflow Blocks Chart State Transition Table Truth Table 22
Opis podstawowych funkcjonalności Simulink PLC Coder Ograniczenia Najważniejsze ograniczenia Simulink PLC Coder: brak obsługi złożonych typów danych ograniczone wsparcie dla zaawanasowanych funkcji matematycznych (przykład: funkcja rand nie jest wspierana), brak obsługi sygnałów o różnej zmiennej wielkości (wszystkie dane/macierze muszą mieć z góry ustalone wymiary) brak obsługi bloków MATLAB System, brak obsługi danych typu cell, blok MATLAB Function obsługuje tylko standardowe funkcje MATLABa, funkcje z dodatkowych toolboxów nie są obsługiwane, brak bezpośredniej obsługi bloków w trybie multirate brak obsługi bloków typu continuous, import subsystemów, nie można przetworzyć bezpośrednio całego modelu z powiązaniami 23
Opis podstawowych funkcjonalności Simulink PLC Coder Procedura generowania kodu dla PLC w języku ST Procedura: 1. Zdefiniować model Simulink. 2. Zidentyfikować elementy, dla których należy wygenerować kod źródłowy. 3. Umieścić wybrane elementy w subsystemie. 4. Wybrać target IDE (np. Tia Portal). 5. Wybrać solver i ustawić parametry modelu. 6. Skonfigurować subsystem aby był traktowany jako atomic block. 7. Sprawdzić kompatybilność subsytemu z Simulink PLC Coderem. 8. Wygenerować kod ST. 9. Sprawdzić otrzymany kod źródłowy. 10.Zaimportować kod do sterownika PLC. 24
Opis podstawowych funkcjonalności Simulink PLC Coder Procedura generowania kodu dla PLC 1. Zdefiniować model Simulink. 25
Opis podstawowych funkcjonalności Simulink PLC Coder Procedura generowania kodu dla PLC 2. Zidentyfikować elementy, dla których należy wygenerować kod źródłowy. 3. Umieścić wybrane elementy w subsystemie. 26
Opis podstawowych funkcjonalności Simulink PLC Coder Procedura generowania kodu dla PLC 4. Wybrać target IDE (np. Tia Portal). Należy pamiętać by także zadeklarować odpowiednią ścieżkę dostępu do IDE. W systemach 64 bitowych Windows, biblioteki często są instalowane w folderze Program Files (x86). Domyślna ścieżka nie musi więc być poprawna. 27
Opis podstawowych funkcjonalności Simulink PLC Coder Procedura generowania kodu dla PLC 5. Wybrać solver. Parametry modelu do ustawienia: Solver: Model Variable-step Fixed-step Ustawienia Wybrać solver typu continuous. Skonfigurować stały sample time subsystemów. Wybrać solver discrete. Tasking mode: W parametrach modelu należy przestawić generowanie kodu na tryb Single-tasking. Dodatkowo zaznaczyć opcję Treat each discrete rate as a separate task. 28
Opis podstawowych funkcjonalności Simulink PLC Coder Procedura generowania kodu dla PLC 6. Skonfigurować subsystem aby był traktowany jako atomic block. 29
Opis podstawowych funkcjonalności Simulink PLC Coder Procedura generowania kodu dla PLC 7. Sprawdzić kompatybilność subsytemu z Simulink PLC Coderem. 30
Opis podstawowych funkcjonalności Simulink PLC Coder Procedura generowania kodu dla PLC 8. Wygenerować kod ST. Wygenerowany kod pojawi się w aktywnym folderze ustawionym w Workspace MATLABA w podfolderze zadeklarowanym przy wybieraniu IDE. Można go otworzyć za pomocą Notatnika Windows. 9. Sprawdzić otrzymany kod źródłowy. 10. Zaimportować kod do sterownika PLC. Procedura zależna od typu IDE. 31
Struktura generowanego kodu źródłowego Kod ogólny (* * * File: plcdemo_simple_subsystem.st * * IEC 61131-3 Structured Text (ST) code generated for subsystem "plcdemo_simple_subsystem/simplesubsystem" * * Model name : plcdemo_simple_subsystem * Model version : 1.61 * Model creator : The MathWorks, Inc. * Model last modified by : The MathWorks, Inc. * Model last modified on : Sat Jul 23 05:44:03 2016 * Model sample time : 0.1s * Subsystem name : plcdemo_simple_subsystem/simplesubsystem * Subsystem sample time : 0.1s * Simulink PLC Coder version : 2.2 (R2016b) 25-Aug- 2016 * ST code generated on : Fri Oct 28 12:30:55 2016 * * Target IDE selection : Generic * Test Bench included : No * *) FUNCTION_BLOCK SimpleSubsystem VAR_INPUT ssmethodtype: SINT; U: LREAL; VAR_OUTPUT Y: LREAL; VAR UnitDelay_DSTATE: LREAL; VAR_TEMP rtb_gain: LREAL; CASE ssmethodtype OF 0: (* InitializeConditions for UnitDelay: '<S1>/Unit Delay' *) UnitDelay_DSTATE := 0.0; 1: (* Gain: '<S1>/Gain' incorporates: * Inport: '<Root>/U' * Sum: '<S1>/Sum' * UnitDelay: '<S1>/Unit Delay' *) rtb_gain := (U - UnitDelay_DSTATE) * 1.1; (* Outport: '<Root>/Y' *) Y := rtb_gain; (* Update for UnitDelay: '<S1>/Unit Delay' *) UnitDelay_DSTATE := rtb_gain; END_CASE; END_FUNCTION_BLOCK 32
Struktura generowanego kodu źródłowego Kod ogólny Struktura kodu: 1. Komentarze z informacjami. 2. Rozpoczęcie bloku funkcji. 3. Deklaracja zmiennych 1. 2. 3. (* * * File: plcdemo_simple_subsystem.st * * IEC 61131-3 Structured Text (ST) code generated for subsystem "plcdemo_simple_subsystem/simplesubsystem" * * Model name : plcdemo_simple_subsystem * Model version : 1.61 * Model creator : The MathWorks, Inc. * Model last modified by : The MathWorks, Inc. * Model last modified on : Sat Jul 23 05:44:03 2016 * Model sample time : 0.1s * Subsystem name : plcdemo_simple_subsystem/simplesubsystem * Subsystem sample time : 0.1s * Simulink PLC Coder version : 2.2 (R2016b) 25-Aug- 2016 * ST code generated on : Fri Oct 28 12:30:55 2016 * * Target IDE selection : Generic * Test Bench included : No * *) FUNCTION_BLOCK SimpleSubsystem VAR_INPUT ssmethodtype: SINT; U: LREAL; VAR_OUTPUT Y: LREAL; 33
Struktura generowanego kodu źródłowego Kod ogólny Struktura kodu: 3. cd. Deklaracja zmiennych 4. Funkcja CASE: pozwala na podział na kilka etapów, takich jak: sekcja warunków początkowych (4a), główny kod programu (4b) Kontrola trybu następuje poprzez zmianę wartości zmiennej użytej w funkcji CASE (tutaj ssmethodtype) 5. Zakończenie bloku funkcji 3.cd. 4. VAR UnitDelay_DSTATE: LREAL; VAR_TEMP rtb_gain: LREAL; CASE ssmethodtype OF 0: 4a.. (* InitializeConditions for UnitDelay: '<S1>/Unit Delay' *) UnitDelay_DSTATE := 0.0; 1: 4b. (* Gain: '<S1>/Gain' incorporates: * Inport: '<Root>/U' * Sum: '<S1>/Sum' * UnitDelay: '<S1>/Unit Delay' *) rtb_gain := (U - UnitDelay_DSTATE) * 1.1; (* Outport: '<Root>/Y' *) Y := rtb_gain; (* Update for UnitDelay: '<S1>/Unit Delay' *) UnitDelay_DSTATE := rtb_gain; END_CASE; END_FUNCTION_BLOCK 34
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na PLC Siemens Uwagi wstępne: w laboratorium używane jest oprogramowanie TIA 11, Simulink PLC Coder w MATLAB 2016a wskazuje kompatybilność z TIA 13 jednak generowany kod po drobnym przystosowaniu działa bez zarzutu. Zmienna TRYB (typu INT) to zmienna odpowiedzialna za przełączanie trybów w głównej funkcji CASE wygenerowanego kodu ST. 35
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na PLC Siemens 1. Zaimportować kod źródłowy z Simulink PLC Coder. Zakładka External source files. 36
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na PLC Siemens 2. Wygenerować bloki funkcyjne z kodu źródłowego. Zostaną wygenerowane nowe bloki funkcyjne, które można wykorzystać w kodzie sterownika. 37
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na PLC Siemens 3. Dodać blok Cyclic interrupt w Program blocks w celu zapewnienia pracy z określonym okresem wcześniej zadeklarowanym w modelu Simulink. 4. Umieszczenie wybranych funkcji w drabince programu. 5. Zadeklarowanie wymaganych zmiennych i przypisanie im pamięci. 6. Zmienne macierzowe dodaje się w blokach typu Data block w zakładce Program blocks 38
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na PLC Siemens 39
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na PLC Siemens Dla macierzy deklarujemy nazwę zmiennej, następnie jej typ wpisując wg wzoru: Array [0..X-1] of TYPE Gdzie X-1 to liczba elementów macierzy minus 1, TYPE zaś typ danych np. LREAL Zmienne zostaną utworzone automatycznie. Dopuszczalne są tylko jednowymiarowe. Jeśli kod korzysta z tablicy dwuwymiarowej, należy zadeklarować tablicę o długości wszystkich pól macierzy dwuwymiarowej np. macierz 3x2 to będzie Array [0.. 5] of LREAL W wypadku korzystania z macierzy jako danych wejściowych/wyjściowych z bloków funkcyjnych, należy podać tylko nazwę bloku pamięci Data block oraz nazwę zmiennej bez uzupełniana indeksu (nawiasy [] należy skasować jeśli zostaną podpowiedziane w czasie wpisywania nazwy zmiennej) 40
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na PLC Siemens 7. Dodać blok Startup. Blok ten wykorzystany zostanie do wprowadzenia warunków początkowych. Można to zrobić na dwa sposoby: dodać blok funkcyjny z przygotowanym kodem do bloku Startup, wykonać go przy zmiennej procesowej nazwanej TRYB o wartości 0 (wykona się wtedy część kodu dla warunków początkowych wygenerowanego kodu), a następnie przestawić TRYB na 1 aby kolejne iteracje wykonywane były już w normalnym trybie pracy, za pomocą bloków MOVE (dla zmiennych) oraz FIELDWRITE (dla zmiennych macierzowych) przypisać wartości początkowe wszystkich wymaganych zmiennych w bloku Startup, a następnie przestawić TRYB na 1 aby kolejne iteracje wykonywane były już w normalnym trybie pracy, W niektórych wypadkach (w zależności od kopatybilności wybranego IDE) przy blokach funkcyjnych nie pojawia się wejście związane ze zmienną TRYB (jest ona ustawiana automatycznie), wtedy nie ma potrzeby deklarować warunków początkowych dla samej funkcji wewnątrz bloku Startup. W bloku FIELDWRITE na wyjściu zawsze wskazujemy element początkowy macierzy, zaś w polu INDEX wskazujemy, które pole macierzy ma zostać zapisane. 41
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na PLC Siemens 8. Sprawdzić przepływ danych przez wszystkie bloki i uruchomić program. Zmienne można podglądać za pomocą tablic Watch table lub w oknie kodu wykonywanego przez sterownik. 42
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na PLC Siemens 43
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na GeFanuc Uwagi wstępne: IDE GeFanuc nie jest bezpośrednio wspierane przez Simulink PLC Coder, jednak możliwe jest wygenerowanie kodu źródłowego w języku ST, które następnie po drobnych modyfikacjach można wykorzystać w sterownikach typu GeFanuc PAC. Zmienna TRYB (typu INT) to zmienna odpowiedzialna za przełączanie trybów w głównej funkcji CASE wygenerowanego kodu ST. 44
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na GeFanuc 1. Dodać w projekcie w Proficy Machine w sekcji bloków programu blok typu ST. 2. Skopiować wygenerowany kod programu do nowego bloku metodą kopiuj-wklej (wygenerowany kod jest w postaci tekstowej, który może być otwarty np. Notatnikiem Windows) 3. W oparciu o sekcję deklaracji zmiennych języka ST należy w projekcie w zakładce Variables utworzyć ręcznie wszystkie wymagane zmienne. 4. Po deklaracji zmiennych należy z kodu usunąć wszystkie deklaracje zmiennych oraz początkowy i kończący tag FUNCTION_BLOCK. 45
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na GeFanuc 5. Aby wykorzystać dodany kod, w bloku programu _MAIN, blokiem funkcyjnym CALL należy wywołać kod ST. 6. Przed uruchomieniem, podobnie jak w wypadku sterowników Siemiens, należy zadeklarować wartości początkowe wymaganych zmiennych. W tym celu można skorzystać ze zmiennej systemowej %S1, która jest uruchamiana w pierwszym cyklu sterownika. Procedura jest podobna jak w sterownikach Siemens, należy dokonać zapisania wartości odpowiednich zmiennych (np. blokami MOVE) lub wywołać dodany kod ze zmienną TRYB o wartości 0. Po deklaracji wszystkich wymaganych zmiennych należy przestawić zmienną TRYB na wartość 1. 7. Sprawdzić przepływ danych przez wszystkie bloki i uruchomić program. 46
Przykładowe zastosowania Simulink PLC Coder Procedura wdrażania kodu z Simulink PLC Coder na GeFanuc 47
Przykładowe zastosowania Simulink PLC Coder Przykładowe wygenerowane kody i ogólne wskazówki Proste mnożenie macierzowe przez stałe wartości FUNCTION_BLOCK Subsystem VAR_INPUT In1: ARRAY [0..2] OF LREAL; VAR_OUTPUT Out1: ARRAY [0..2] OF LREAL; VAR_IN_OUT VAR (* Outport: '<Root>/Out1' incorporates: * Gain: '<S1>/Gain' * Inport: '<Root>/In1' *) Out1[0] := 3.0 * In1[0]; Out1[1] := 4.0 * In1[1]; Out1[2] := 5.0 * In1[2]; END_FUNCTION_BLOCK 48
Przykładowe zastosowania Simulink PLC Coder Przykładowe wygenerowane kody i ogólne wskazówki Mnożenie dwóch macierzy o stałych 2x4 i 4x2 oraz macierz odwrotna wyniku FUNCTION_BLOCK Subsystem2 VAR_INPUT A: ARRAY [0..7] OF LREAL; B: ARRAY [0..7] OF LREAL; VAR_OUTPUT Out1: ARRAY [0..3] OF LREAL; VAR_IN_OUT VAR y: ARRAY [0..3] OF LREAL; b_r: LREAL; t: LREAL; tmp: ARRAY [0..7] OF LREAL; tmp_0: ARRAY [0..7] OF LREAL; b_i: DINT; i_0: DINT; rtb_y_idx_0: LREAL; rtb_y_idx_1: LREAL; rtb_y_idx_2: LREAL; (* MATLAB Function: '<S1>/MATLAB Function' incorporates: * Inport: '<Root>/A' * Inport: '<Root>/B' *) (* MATLAB Function 'Subsystem2/MATLAB Function': '<S2>:1' *) (* '<S2>:1:3' A = [a b c d; e f g h]; *) (* '<S2>:1:4' B = [i j ; k l; m n; o p]; *) (* '<S2>:1:5' y= [1 1; 1 1]; *) (* '<S2>:1:6' y = inv(a * B); *) tmp[0] := A[0]; tmp[2] := A[1]; tmp[4] := A[2]; tmp[6] := A[3]; tmp[1] := A[4]; tmp[3] := A[5]; tmp[5] := A[6]; tmp[7] := A[7]; tmp_0[0] := B[0]; tmp_0[4] := B[1]; tmp_0[1] := B[2]; tmp_0[5] := B[3]; tmp_0[2] := B[4]; tmp_0[6] := B[5]; tmp_0[3] := B[6]; tmp_0[7] := B[7]; (* MATLAB Function: '<S1>/MATLAB Function' *) FOR i_0 := 0 TO 1 DO FOR b_i := 0 TO 1 DO y[b_i + (i_0 * 2)] := 0.0; y[b_i + (i_0 * 2)] := y[(i_0 * 2) + b_i] + (tmp_0[i_0 * 4] * tmp[b_i]); y[b_i + (i_0 * 2)] := (tmp_0[(i_0 * 4) + 1] * tmp[b_i + 2]) + y[(i_0 * 2) + b_i]; y[b_i + (i_0 * 2)] := (tmp_0[(i_0 * 4) + 2] * tmp[b_i + 4]) + y[(i_0 * 2) + b_i]; y[b_i + (i_0 * 2)] := (tmp_0[(i_0 * 4) + 3] * tmp[b_i + 6]) + y[(i_0 * 2) + b_i]; END_FOR; END_FOR; IF ABS(y[1]) > ABS(y[0]) THEN b_r := y[0] / y[1]; t := 1.0 / ((b_r * y[3]) - y[2]); rtb_y_idx_0 := (y[3] / y[1]) * t; rtb_y_idx_1 := -t; rtb_y_idx_2 := (( -y[2]) / y[1]) * t; t := b_r * t; ELSE b_r := y[1] / y[0]; t := 1.0 / (y[3] - (b_r * y[2])); rtb_y_idx_0 := (y[3] / y[0]) * t; rtb_y_idx_1 := ( -b_r) * t; rtb_y_idx_2 := (( -y[2]) / y[0]) * t; END_IF; (* Outport: '<Root>/Out1' *) Out1[0] := rtb_y_idx_0; Out1[1] := rtb_y_idx_1; Out1[2] := rtb_y_idx_2; Out1[3] := t; END_FUNCTION_BLOCK function y = fcn(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) %#codegen A = [a b c d; e f g h]; B = [i j ; k l; m n; o p]; y= [1 1; 1 1]; y = inv(a * B); 49
Przykładowe zastosowania Simulink PLC Coder Przykładowe wygenerowane kody i ogólne wskazówki Układ wykorzystujący RLS do estymacji parametrów inercji pierwszego rzędu oraz inercja pierwszego rzędu jako obiekt z sygnałem quasi-sinusoidalnym na wejściu obiektu 50
Przykładowe zastosowania Simulink PLC Coder Przykładowe wygenerowane kody i ogólne wskazówki Sygnał quasi-sinusoidalny generowany w oparciu o modulo 10 wartości licznika FUNCTION rt_floord: LREAL VAR_INPUT u: LREAL; VAR_TEMP rt_floord := DINT_TO_LREAL(TRUNC(u)); IF u = rt_floord THEN rt_floord := u; ELSIF u < 0.0 THEN rt_floord := rt_floord - 1.0; END_IF; END_FUNCTION FUNCTION_BLOCK Sygnal VAR_INPUT ssmethodtype: INT; VAR_OUTPUT Out1: LREAL; VAR_IN_OUT VAR Output_DSTATE: DINT; y: LREAL; CASE ssmethodtype OF 0: (* InitializeConditions for UnitDelay: '<S2>/Output' *) Output_DSTATE := 0; 1: (* MATLAB Function: '<S1>/MATLAB Function' incorporates: * UnitDelay: '<S2>/Output' *) (* MATLAB Function 'Sygnal U/MATLAB Function': '<S3>:1' *) (* '<S3>:1:6' y=sin(mod(double(t)/100,100)); *) y := DINT_TO_LREAL(Output_DSTATE) / 100.0; (* Outport: '<Root>/Out1' incorporates: * MATLAB Function: '<S1>/MATLAB Function' *) Out1 := SIN(y - (rt_floord(u := y / 100.0) * 100.0)); (* Update for UnitDelay: '<S2>/Output' incorporates: * Constant: '<S4>/FixPt Constant' * Sum: '<S4>/FixPt Sum1' * Switch: '<S5>/FixPt Switch' * UnitDelay: '<S2>/Output' *) Output_DSTATE := Output_DSTATE + 1; END_CASE; END_FUNCTION_BLOCK 51
Przykładowe zastosowania Simulink PLC Coder Przykładowe wygenerowane kody i ogólne wskazówki Inercja pierwszego rzędu o zadawanych parametrach A i B FUNCTION_BLOCK Inercja VAR_INPUT u: LREAL; A: LREAL; B: LREAL; yp: LREAL; VAR_OUTPUT y: LREAL; VAR_IN_OUT VAR (* MATLAB Function 'Inercja/MATLAB Function': '<S2>:1' *) (* '<S2>:1:6' y=yp*a + u*b; *) (* Outport: '<Root>/y' incorporates: * Inport: '<Root>/A' * Inport: '<Root>/B' * Inport: '<Root>/u' * Inport: '<Root>/yp' * MATLAB Function: '<S1>/MATLAB Function' *) y := (yp * A) + (u * B); END_FUNCTION_BLOCK 52
Przykładowe zastosowania Simulink PLC Coder Przykładowe wygenerowane kody i ogólne wskazówki Implementacja RLS do estymacji parametrów A i B FUNCTION_BLOCK RLS0 VAR_INPUT y: LREAL; u: LREAL; bp: ARRAY [0..1] OF LREAL; Pp: ARRAY [0..3] OF LREAL; lambda: LREAL; yk1: LREAL; VAR_OUTPUT b: ARRAY [0..1] OF LREAL; Pn: ARRAY [0..3] OF LREAL; VAR_IN_OUT VAR fi: ARRAY [0..1] OF LREAL; e: LREAL; b_b: LREAL; rtb_pn: ARRAY [0..3] OF LREAL; tmp: ARRAY [0..3] OF LREAL; b_i: DINT; temp1: LREAL; fi_idx_0: LREAL; fi_idx_2: LREAL; fi_idx_1: LREAL; fi_idx_3: LREAL; (* MATLAB Function: '<S1>/MATLAB Function' incorporates: * Inport: '<Root>/Pp' * Inport: '<Root>/bp' * Inport: '<Root>/lambda ' * Inport: '<Root>/u ' * Inport: '<Root>/yk1 ' * Inport: '<Root>/yn' *) (* MATLAB Function 'RLS/MATLAB Function': '<S2>:1' *) (* '<S2>:1:3' b= [ 1;1]; *) (* '<S2>:1:4' fi = [yk1; u]; *) fi[0] := yk1; fi[1] := u; (* '<S2>:1:5' Pn = [1 1; 1 1]; *) (* '<S2>:1:7' Pn = (Pp - ((Pp*(fi*fi')*Pp)/(lambda + (fi'*pp*fi))))/lambda; *) b_b := ((((yk1 * Pp[0]) + (u * Pp[1])) * yk1) + (((yk1 * Pp[2]) + (u * Pp[3])) * u)) + lambda; fi_idx_0 := yk1 * yk1; fi_idx_2 := yk1 * u; fi_idx_1 := u * yk1; fi_idx_3 := u * u; (* '<S2>:1:8' K = Pn*fi; *) (* '<S2>:1:9' e= yn - bp'*fi; *) temp1 := 0.0; FOR b_i := 0 TO 1 DO tmp[b_i] := 0.0; tmp[b_i] := (Pp[b_i] * fi_idx_0) + tmp[b_i]; tmp[b_i] := (Pp[b_i + 2] * fi_idx_1) + tmp[b_i]; tmp[b_i + 2] := 0.0; tmp[b_i + 2] := tmp[b_i + 2] + (Pp[b_i] * fi_idx_2); tmp[b_i + 2] := (Pp[b_i + 2] * fi_idx_3) + tmp[b_i + 2]; rtb_pn[b_i] := (Pp[b_i] - (((tmp[b_i + 2] * Pp[1]) + (tmp[b_i] * Pp[0])) / b_b)) / lambda; rtb_pn[b_i + 2] := (Pp[b_i + 2] - (((tmp[b_i + 2] * Pp[3]) + (tmp[b_i] * Pp[2])) / b_b)) / lambda; temp1 := (bp[b_i] * fi[b_i]) + temp1; END_FOR; e := y - temp1; (* '<S2>:1:10' b= bp + K * e; *) (* Outport: '<Root>/b' incorporates: * Inport: '<Root>/bp' * Inport: '<Root>/u ' * Inport: '<Root>/yk1 ' * MATLAB Function: '<S1>/MATLAB Function' *) b[0] := (((rtb_pn[0] * yk1) + (rtb_pn[2] * u)) * e) + bp[0]; b[1] := (((rtb_pn[1] * yk1) + (rtb_pn[3] * u)) * e) + bp[1]; (* Outport: '<Root>/Pn' *) Pn[0] := rtb_pn[0]; Pn[1] := rtb_pn[1]; Pn[2] := rtb_pn[2]; Pn[3] := rtb_pn[3]; END_FUNCTION_BLOCK 53
Przykładowe zastosowania Simulink PLC Coder Przykładowe wygenerowane kody i ogólne wskazówki 54
Przykładowe zastosowania Simulink PLC Coder Wskazówki Blok MATLAB Function jest wspierany, przez co ciągi operacji na macierzach można w bardzo prosty sposób przenosić na sterownik PLC. W wypadku, gdy kompilator ma problem z ustaleniem wielkości macierzy, można posiłkować się przypisaniem jako warunek początkowy tablicy z przykładowymi wartościami. Każdy subsystem generuje plik z językiem ST o nazwie modelu Simulink. Przez to generowanie kolejnych subsystemów nadpisuje kody pozostałych subsystemów. Należy o tym pamiętać i np. po generacji kodu zmieniać nazwę pliku wynikowego. Etykiety używane w Simulinku dla subsystemów będą domyślnymi nazwami generowanych bloków funkcyjnych w TIA Portal. 55
Bibliografia Materiał przygotowany w oparciu o dokumentacje Simulink PLC Coder MATLAB 2016a Proficy Machine Edition TIA Portal 11 56
Dziękuję za uwagę 57
58