View
224
Download
1
Category
Preview:
Citation preview
Sterowniki Programowalne (SP) – Wykład 12Ze ś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ą napodstawowe badania i testy samych algorytmów i struktur
• Implementacja często wymaga dostosowywania konkretnychalgorytmów do wymagań konkretnych rozwiązań sprzętowo-programowych
• Istnieją narzędzia, które pozwalają na zautomatyzowaneprzechodzenie od projektów ze środowisk szybkiegoprototypowania do implementacji, jednak są one częstoobarczone wieloma obostrzeniami
3
Simulink PLC Coder – szybka implementacja na sterowniku PLC
• Simulink PLC Coder jest narzędziem pakietu oprogramowaniaMATLAB, 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 kodudrabinkowego (tylko i wyłącznie operacje binarne nastycznikach i przekaźnikach) oraz w języku ST (Structural Text)
• Simulink PLC Coder wspiera szereg IDE (ang. IntegratedDevelopment Environment) dla sterowników PLC różnychproducentów, jednak nie wszystkie są wspierane wjednakowym stopniu.
• Występują duże ograniczenia w ilości wykorzystywanychbloków z przyborników Simulink czy też możliwych opcjisolverów. 4
Opis podstawowych funkcjonalności Simulink PLC CoderKompatybilność 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 CoderWykorzystywane bloki
6
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki – Additional Math & Discrete
7
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki – Commonly Used Blocks
8
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Discontinuities
9
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Discrete
10
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Logic and Bit Operations
11
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Lookup Tables
12
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Math Operations
13
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Model Verification
14
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Model-Wide Utilities
15
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Ports & Subsystems
16
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Signal Attributes
17
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Signal Routing
18
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Sinks
19
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Sources
20
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - User-Defined Functions
21
Opis podstawowych funkcjonalności Simulink PLC CoderWykorzystywane bloki - Supported Stateflow Blocks
Stateflow Blocks• Chart• State Transition Table• Truth Table
22
Opis podstawowych funkcjonalności Simulink PLC CoderOgraniczenia
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 CoderProcedura 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 CoderProcedura generowania kodu dla PLC
1. Zdefiniować model Simulink.
25
Opis podstawowych funkcjonalności Simulink PLC CoderProcedura generowania kodu dla PLC
2. Zidentyfikować elementy, dla których należywygenerować kod źródłowy.
3. Umieścić wybrane elementy w subsystemie.
26
Opis podstawowych funkcjonalności Simulink PLC CoderProcedura generowania kodu dla PLC
4. Wybrać „target” IDE (np. Tia Portal).Należy pamiętać by także zadeklarować odpowiednią ścieżkę dostępudo IDE. W systemach 64 bitowych Windows, biblioteki często sąinstalowane w folderze Program Files (x86). Domyślna ścieżka nie musiwięc być poprawna.
27
Opis podstawowych funkcjonalności Simulink PLC CoderProcedura generowania kodu dla PLC
5. Wybrać solver.Parametry modelu do ustawienia:
Solver:
Model Ustawienia
Variable-step Wybrać solver typu continuous. Skonfigurowaćstały „sample time” subsystemów.
Fixed-step 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 CoderProcedura generowania kodu dla PLC
6. Skonfigurować subsystem aby był traktowany jako „atomicblock”.
29
Opis podstawowych funkcjonalności Simulink PLC CoderProcedura generowania kodu dla PLC
7. Sprawdzić kompatybilność subsytemu z Simulink PLCCoderem.
30
Opis podstawowych funkcjonalności Simulink PLC CoderProcedura generowania kodu dla PLC
8. Wygenerować kod ST.
Wygenerowany kod pojawi się w aktywnym folderzeustawionym w Workspace MATLABA w podfolderzezadeklarowanym przy wybieraniu IDE. Można go otworzyć zapomocą Notatnika Windows.
31
9. Sprawdzić otrzymany kod źródłowy.10. Zaimportować kod do sterownika PLC.
Procedura zależna od typu IDE.
Struktura generowanego kodu źródłowego Kod ogólny
32
(*
*
* 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;
END_VAR
VAR_OUTPUT
Y: LREAL;
END_VAR
VAR
UnitDelay_DSTATE: LREAL;
END_VAR
VAR_TEMP
rtb_Gain: LREAL;
END_VAR
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
Struktura generowanego kodu źródłowego Kod ogólny
33
(*
*
* 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;
END_VAR
VAR_OUTPUT
Y: LREAL;
END_VAR
Struktura kodu:1. Komentarze z informacjami.2. Rozpoczęcie bloku funkcji.3. Deklaracja zmiennych
1.
2.
3.
Struktura generowanego kodu źródłowego Kod ogólny
34
VAR
UnitDelay_DSTATE: LREAL;
END_VAR
VAR_TEMP
rtb_Gain: LREAL;
END_VAR
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
Struktura kodu:3. cd. Deklaracja zmiennych4. 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
4a..
4.
3.cd.
4b.
Przykładowe zastosowania Simulink PLC CoderProcedura 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 wskazujekompatybilność z TIA 13 jednak generowany kod podrobnym przystosowaniu działa bez zarzutu.
Zmienna TRYB (typu INT) to zmienna odpowiedzialna zaprzełączanie trybów w głównej funkcji CASEwygenerowanego kodu ST.
35
Przykładowe zastosowania Simulink PLC CoderProcedura 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 CoderProcedura 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óremożna wykorzystać w kodzie sterownika.
37
Przykładowe zastosowania Simulink PLC CoderProcedura wdrażania kodu z Simulink PLC Coder na PLC Siemens
3. Dodać blok „Cyclic interrupt” w „Program blocks” w celuzapewnienia pracy z określonym okresem wcześniejzadeklarowanym 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 CoderProcedura wdrażania kodu z Simulink PLC Coder na PLC Siemens
39
Przykładowe zastosowania Simulink PLC CoderProcedura 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 TYPEGdzie X-1 to liczba elementów macierzy minus 1, TYPE zaś typ danych np. LREALZmienne zostaną utworzone automatycznie. Dopuszczalne są tylko jednowymiarowe. Jeśli kodkorzysta z tablicy dwuwymiarowej, należy zadeklarować tablicę o długości wszystkich pól macierzydwuwymiarowej 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 CoderProcedura 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 (wykonasię wtedy część kodu dla warunków początkowych wygenerowanego kodu), anastępnie przestawić TRYB na 1 aby kolejne iteracje wykonywane były już wnormalnym trybie pracy,
• za pomocą bloków MOVE (dla zmiennych) oraz FIELDWRITE (dlazmiennych macierzowych) przypisać wartości początkowe wszystkichwymaganych zmiennych w bloku „Startup”, a następnie przestawić TRYB na 1aby kolejne iteracje wykonywane były już w normalnym trybie pracy,
W niektórych wypadkach (w zależności od kopatybilności wybranego IDE) przyblokach funkcyjnych nie pojawia się wejście związane ze zmienną TRYB (jest onaustawiana automatycznie), wtedy nie ma potrzeby deklarować warunkówpoczątkowych dla samej funkcji wewnątrz bloku „Startup”.W bloku FIELDWRITE na wyjściu zawsze wskazujemy element początkowymacierzy, zaś w polu INDEX wskazujemy, które pole macierzy ma zostać zapisane.
41
Przykładowe zastosowania Simulink PLC CoderProcedura wdrażania kodu z Simulink PLC Coder na PLC Siemens
8. Sprawdzić przepływ danych przez wszystkie bloki iuruchomić program.
Zmienne można podglądać za pomocą tablic „Watch table” lubw oknie kodu wykonywanego przez sterownik.
42
Przykładowe zastosowania Simulink PLC CoderProcedura wdrażania kodu z Simulink PLC Coder na PLC Siemens
43
Przykładowe zastosowania Simulink PLC CoderProcedura 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 wygenerowaniekodu źródłowego w języku ST, które następnie po drobnychmodyfikacjach można wykorzystać w sterownikach typuGeFanuc PAC.
Zmienna TRYB (typu INT) to zmienna odpowiedzialna zaprzełączanie trybów w głównej funkcji CASEwygenerowanego kodu ST.
44
Przykładowe zastosowania Simulink PLC CoderProcedura wdrażania kodu z Simulink PLC Coder na GeFanuc
1. Dodać w projekcie w Proficy Machine w sekcji blokówprogramu blok typu ST.
2. Skopiować wygenerowany kod programu do nowegobloku metodą kopiuj-wklej (wygenerowany kod jest wpostaci tekstowej, który może być otwarty np.Notatnikiem Windows)
3. W oparciu o sekcję deklaracji zmiennych języka ST należyw projekcie w zakładce „Variables” utworzyć ręczniewszystkie wymagane zmienne.
4. Po deklaracji zmiennych należy z kodu usunąć wszystkiedeklaracje zmiennych oraz początkowy i kończący tagFUNCTION_BLOCK.
45
Przykładowe zastosowania Simulink PLC CoderProcedura 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 wypadkusterowników Siemiens, należy zadeklarować wartościpoczą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 wsterownikach Siemens, należy dokonać zapisania wartości odpowiednichzmiennych (np. blokami MOVE) lub wywołać dodany kod ze zmienną TRYB owartości 0. Po deklaracji wszystkich wymaganych zmiennych należyprzestawić zmienną TRYB na wartość 1.
7. Sprawdzić przepływ danych przez wszystkie bloki iuruchomić program.
46
Przykładowe zastosowania Simulink PLC CoderProcedura wdrażania kodu z Simulink PLC Coder na GeFanuc
47
Przykładowe zastosowania Simulink PLC CoderPrzykładowe wygenerowane kody i ogólne wskazówki
Proste mnożenie macierzowe przez stałe wartości
48
FUNCTION_BLOCK Subsystem
VAR_INPUT
In1: ARRAY [0..2] OF LREAL;
END_VAR
VAR_OUTPUT
Out1: ARRAY [0..2] OF LREAL;
END_VAR
VAR_IN_OUT
END_VAR
VAR
END_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
Przykładowe zastosowania Simulink PLC CoderPrzykładowe wygenerowane kody i ogólne wskazówki
Mnożenie dwóch macierzy o stałych 2x4 i 4x2 oraz macierz odwrotna wyniku
49
FUNCTION_BLOCK Subsystem2
VAR_INPUT
A: ARRAY [0..7] OF LREAL;
B: ARRAY [0..7] OF LREAL;
END_VAR
VAR_OUTPUT
Out1: ARRAY [0..3] OF LREAL;
END_VAR
VAR_IN_OUT
END_VAR
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;
END_VAR
(* 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);
Przykładowe zastosowania Simulink PLC CoderPrzykładowe wygenerowane kody i ogólne wskazówki
Układ wykorzystujący RLS do estymacji parametrów inercji pierwszego rzędu oraz inercjapierwszego rzędu jako obiekt z sygnałem quasi-sinusoidalnym na wejściu obiektu
50
Przykładowe zastosowania Simulink PLC CoderPrzykładowe wygenerowane kody i ogólne wskazówki
51
FUNCTION rt_floord: LREAL
VAR_INPUT
u: LREAL;
END_VAR
VAR_TEMP
END_VAR
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;
END_VAR
VAR_OUTPUT
Out1: LREAL;
END_VAR
VAR_IN_OUT
END_VAR
VAR
Output_DSTATE: DINT;
y: LREAL;
END_VAR
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
Sygnał quasi-sinusoidalny generowany w oparciu o modulo 10 wartości licznika
Przykładowe zastosowania Simulink PLC CoderPrzykładowe wygenerowane kody i ogólne wskazówki
52
FUNCTION_BLOCK Inercja
VAR_INPUT
u: LREAL;
A: LREAL;
B: LREAL;
yp: LREAL;
END_VAR
VAR_OUTPUT
y: LREAL;
END_VAR
VAR_IN_OUT
END_VAR
VAR
END_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
Inercja pierwszego rzędu o zadawanych parametrach A i B
Przykładowe zastosowania Simulink PLC CoderPrzykładowe wygenerowane kody i ogólne wskazówki
53
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;
END_VAR
VAR_OUTPUT
b: ARRAY [0..1] OF LREAL;
Pn: ARRAY [0..3] OF LREAL;
END_VAR
VAR_IN_OUT
END_VAR
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;
END_VAR
(* 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]; *)
Implementacja RLS do estymacji parametrów A i B
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
Przykładowe zastosowania Simulink PLC CoderPrzykładowe wygenerowane kody i ogólne wskazówki
54
Przykładowe zastosowania Simulink PLC CoderWskazówki
55
Blok MATLAB Function jest wspierany, przez co ciągi operacji na macierzach można wbardzo prosty sposób przenosić na sterownik PLC.
W wypadku, gdy kompilator ma problem z ustaleniem wielkości macierzy, możnaposiłkować się przypisaniem jako warunek początkowy tablicy z przykładowymiwartościami.
Każdy subsystem generuje plik z językiem ST o nazwie modelu Simulink. Przez togenerowanie kolejnych subsystemów nadpisuje kody pozostałych subsystemów. Należy otym pamiętać i np. po generacji kodu zmieniać nazwę pliku wynikowego.
Etykiety używane w Simulinku dla subsystemów będą domyślnymi nazwamigenerowanych bloków funkcyjnych w TIA Portal.
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
Recommended