Sterowniki Programowalne (SP) –Wykład í î · • Beckhoff®TwinCAT®2.11 or 3 • KW-Software...

Post on 07-Jul-2018

221 views 1 download

Transcript of Sterowniki Programowalne (SP) –Wykład í î · • Beckhoff®TwinCAT®2.11 or 3 • KW-Software...

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