Język tekstowy SCL, a programowanie PLC

controlbyte.pl 1 rok temu

Większość programistów PLC stosuje graficzne języki programowania takie jak LAD czy FBD. Czwarta rewolucja przemysłowa stawia przed automatykami nowy wyzwania. Wiele aplikacji wymaga, aby obliczenia i przetwarzanie danych było wykonywane na najniższym poziomie w strukturze urządzeń przemysłowych, czyli przez sterownik PLC.

Aby tworzyć bardziej zaawansowane aplikacje, niezbędna jest znajomość tekstowego języka wysokiego poziomu jakim jest język SCL (Structured Control Language) dla sterowników Siemensa.

Języki programowania dla sterowników PLC

IEC 61131-3 to międzynarodowa norma dotycząca programowania w przemyśle automatyki. Została opracowana przez Międzynarodową Elektrotechniczną Komisję Normalizacyjną (IEC) i określa standardy dotyczące języków programowania, środowisk programistycznych i interfejsów użytkownika dla systemów automatyki przemysłowej. Norma ta zapewnia interoperacyjność różnych systemów automatyki poprzez ustanowienie wspólnych standardów dla programowania i komunikacji. Dzięki temu umożliwia łatwe tworzenie i integrację różnych systemów automatyki w jedną, spójną całość. Norma IEC 61131-3 jest szeroko stosowana w przemyśle automatyki przemysłowej na całym świecie.

Norma IEC 61131-3 określa pięć języków programowania dla systemów automatyki przemysłowej. Są to:

  • Język LD (Ladder Diagram), który umożliwia tworzenie programów dzięki schematów drabinkowych. Jest to język popularny wśród elektryków i znany z jego prostoty i intuicyjności.
  • Język FBD (Function Block Diagram), który pozwala tworzyć programy dzięki bloków funkcyjnych. Jest to język skierowany do inżynierów elektryków i elektroników.
  • Język SFC (Sequential Function Chart), który umożliwia tworzenie programów dzięki diagramów sekwencyjnych. Jest to język skierowany do inżynierów procesów i automatyków.
  • Język ST (Structured Text), który pozwala tworzyć programy dzięki strukturalnego języka tekstowego. Jest to język skierowany do programistów i inżynierów informatyków.
  • Język IL (Instruction List), który umożliwia tworzenie programów dzięki list instrukcji. Jest to język skierowany do elektryków i elektroników.

Wszystkie te języki są zgodne z normą IEC 61131-3 i mogą być stosowane do programowania sterowników PLC w aplikacjach przemysłowych. Każdy z tych języków ma swoje własne zalety i wady, dlatego wybór odpowiedniego języka zależy od indywidualnych potrzeb i preferencji programisty.

Języki SCL a norma IEC 61131-3

Języki programowania sterowników PLC firmy Siemens są zgodne z normą IEC 61131-3, w tym język SCL. Język SCL jest odpowiednikiem języka ST dla sterowników PLC Siemens.

Składnia języka SCL

Składnia języka SCL opiera się na konstrukcjach języków proceduralnych, takich jak pętle i instrukcje warunkowe, co umożliwia tworzenie sprawnych i precyzyjnych algorytmów sterowania. Język SCL posiada również obsługę logiki boolowskiej, co pozwala na wykonywanie operacji na wartościach logicznych (prawda/fałsz) oraz porównywanie wartości logicznych dzięki operatorów porównania (np. większy niż, mniejszy niż).

Operacje boolowskie w języku SCL

Język SCL oferuje instrukcje boolowskie, które umożliwiają wykonywanie operacji logicznych na wartościach boolowskich, czyli wartościach TRUE lub FALSE.

Przykładowe instrukcje boolowskie w języku SCL:

  • AND: Instrukcja AND pozwala na sprawdzenie, czy obie wartości boolowskie są równocześnie prawdziwe. jeżeli obie wartości są prawdziwe, instrukcja zwraca wartość TRUE, w przeciwnym razie zwraca wartość FALSE. Na przykład, instrukcja „A AND B” zwróci wartość TRUE, jeżeli zarówno A jak i B są prawdziwe.
// Sprawdź, czy zarówno A jak i B są prawdziwe IF (A AND B) THEN // Wykonaj instrukcje, jeżeli A i B są prawdziwe ... ELSE // Wykonaj inne instrukcje, jeżeli A lub B jest fałszywe ... END_IF
  • OR: Instrukcja OR pozwala na sprawdzenie, czy co najmniej jedna z wartości boolowskich jest prawdziwa. jeżeli co najmniej jedna wartość jest prawdziwa, instrukcja zwraca wartość TRUE, w przeciwnym razie zwraca wartość FALSE. Na przykład, instrukcja „A OR B” zwróci wartość TRUE, jeżeli zarówno A jak i B są prawdziwe, albo tylko A jest prawdziwe, albo tylko B jest prawdziwe.
// Sprawdź, czy co najmniej jedna z wartości A lub B jest prawdziwa IF (A OR B) THEN // Wykonaj instrukcje, jeżeli co najmniej jedna z wartości A lub B jest prawdziwa ... ELSE // Wykonaj inne instrukcje, jeżeli obie wartości A i B są fałszywe ... END_IF
  • NOT: Instrukcja NOT pozwala na negację wartości boolowskiej. jeżeli wartość jest prawdziwa, instrukcja zwraca wartość FALSE, w przeciwnym razie zwraca wartość TRUE. Na przykład, instrukcja „NOT A” zwróci wartość TRUE, jeżeli A jest FALSE, a wartość FALSE, jeżeli A jest TRUE.
// Neguj wartość zmiennej A A := NOT A;

Instrukcje warunkowe IF… ELSE

Instrukcja warunkowa IF-ELSE w języku SCL umożliwia wykonywanie określonych instrukcji w zależności od spełnienia lub niespełnienia warunku. Składa się z trzech części: warunku w instrukcji IF, sekcji instrukcji wykonywanych w przypadku spełnienia warunku w instrukcji THEN, oraz sekcji instrukcji wykonywanych w przypadku niespełnienia warunku w instrukcji ELSE. Może też zawierać dodatkową instrukcję ELSE IF, która pozwala na sprawdzenie kolejnego warunku w przypadku niespełnienia warunku pierwotnego. Poniższy przykład ilustruje użycie instrukcji warunkowej IF-ELSE w języku SCL:

// Sprawdź, czy zmienna A jest większa od B IF (A > B) THEN // jeżeli tak, to wykonaj instrukcje ... // W przeciwnym razie sprawdź, czy zmienna A jest równa B ELSIF (A = B) THEN // jeżeli tak, to wykonaj inne instrukcje ... // W przeciwnym razie wykonaj instrukcje w sekcji ELSE ELSE ... END_IF

Instrukcja warunkowa IF-ELSE w języku SCL jest przydatna w implementacji różnorodnych algorytmów w sterownikach PLC, pozwalając na dynamiczne reagowanie na zmieniające się warunki w procesie sterowania.

Operatory porównania

Operatory porównania w języku SCL umożliwiają sprawdzanie relacji pomiędzy wartościami zmiennych lub wyrażeń. Operatory porównania zwracają wynik operacji w formie wartości BOOL – TRUE/FALSE.

Są to następujące operatory:

  • = operator równości, sprawdza, czy dwie wartości są równe
  • <> operator nierówności, sprawdza, czy dwie wartości są różne
  • < operator mniejszości, sprawdza, czy lewa wartość jest mniejsza od prawej wartości
  • > operator większości, sprawdza, czy lewa wartość jest większa od prawej wartości
  • <=operator mniejszości lub równości, sprawdza, czy lewa wartość jest mniejsza lub równa prawej wartości
  • >= operator większości lub równości, sprawdza, czy lewa wartość jest większa lub równa prawej wartości

Operatory porównania są często używane w instrukcjach warunkowych IF-ELSE w języku SCL w celu sprawdzenia, czy dane warunki są spełnione lub nie. Poniższy przykład ilustruje użycie operatorów porównania w języku SCL:

// Sprawdź, czy zmienna A jest większa od B IF (A > B) THEN // jeżeli tak, to wykonaj instrukcje ... ELSE // W przeciwnym razie wykonaj inne instrukcje ... END_IF

Program do utrzymania poziomu cieczy w zbiorniku z cyfrowymi czujnikami poziomu

Poniższy program w języku SCL umożliwia sterowanie poziomem cieczy w zbiorniku dzięki cyfrowych czujników poziomu dolnego i górnego oraz pompy 0-1. Program wykorzystuje instrukcję boolowską NOT oraz warunkową instrukcję IF-ELSE.

// Sprawdź, czy poziom cieczy jest poniżej poziomu dolnego IF (NOT xPoziomDolny) THEN // jeżeli tak, to włącz pompę xPompa := TRUE; // W przeciwnym razie sprawdź, czy poziom cieczy jest powyżej poziomu górnego ELSIF (xPoziomGorny) THEN // jeżeli tak, to wyłącz pompę xPompa := FALSE; END_IF

Zjawisko histerezy polega na tym, iż pompa jest włączana dopiero po osiągnięciu poziomu cieczy poniżej poziomu dolnego, a wyłączana dopiero po osiągnięciu poziomu cieczy powyżej poziomu górnego. Dzięki temu unikamy sytuacji, w której pompa ciągle się włącza i wyłącza przy poziomach cieczy blisko poziomów dolnego i górnego, co mogłoby spowodować niepotrzebne zużycie energii i awarie. Wartości poziomów dolnego i górnego mogą być dostosowane do konkretnej aplikacji w celu uzyskania optymalnego działania systemu sterowania poziomem cieczy.

Program do utrzymania poziomu cieczy w zbiorniku z analogowym czujnikiem poziomu

Poniższy program w języku SCL umożliwia sterowanie poziomem cieczy w zbiorniku dzięki analogowego czujnika poziomu oraz pompy 0-1. Program wykorzystuje instrukcję warunkową IF-ELSE oraz operatory porównania w celu sprawdzenia aktualnego poziomu cieczy i włączenia lub wyłączenia pompy we właściwym momencie.

// Przechowaj wartość zadaną poziomu dolnego i górnego w zmiennych rPoziomDolnyZad_mm := 500.0; rPoziomGornyZad_mm := 1000.0; // Sprawdź, czy aktualny poziom cieczy jest poniżej poziomu dolnego IF (rPoziomAkt_mm < rPoziomDolnyZad_mm) THEN // jeżeli tak, to włącz pompę xPompa := TRUE; // W przeciwnym razie sprawdź, czy aktualny poziom cieczy jest powyżej poziomu górnego ELSE IF (rPoziomAkt_mm > rPoziomGornyZad_mm) THEN // jeżeli tak, to wyłącz pompę xPompa := FALSE; END_IF

Ten program pozwala na kontrolowanie poziomu cieczy w zbiorniku dzięki pompy, aby utrzymać go we właściwym zakresie pomiędzy poziomami dolnym i górnym. Można go dowolnie modyfikować i dostosować do konkretnych potrzeb, na przykład zmieniając parametryzację poziomów zadanych cieczy lub dodając dodatkowe instrukcje w celu uzyskania bardziej zaawansowanego działania systemu sterowania.

Podsumowując… do czego język SCL nadaje się idealnie?

SCL posiada bogaty zestaw operatorów matematycznych, umożliwiających wykonywanie podstawowych działań arytmetycznych, takich jak dodawanie, odejmowanie, mnożenie i dzielenie. Język ten umożliwia też wykonywanie bardziej zaawansowanych obliczeń, takich jak obliczanie pierwiastków, potęg czy logarytmów.

Składnia języka SCL pozwala na programowanie funkcji oraz bloków funkcyjnych przetwarzających dane w sposób niezwykle zwarty. Ten sam program w języku graficznych zająłby kilkanaście razy więcej przestrzeni w edytorze kodu.

Poniższy kod w języku SCL implementuje funkcję obliczającą pierwiastki równania kwadratowego o postaci ax^2 + bx + c = 0. Funkcja przyjmuje trzy argumenty: współczynniki a, b i c równania i zwraca dwie wartości – pierwiastki równania. W przypadku braku rozwiązań rzeczywistych funkcja zwraca NaN (Not-a-Number).

FUNCTION fcPierwiastkiRownKwad(REAL a, REAL b, REAL c, REAL rPierwiastek1, REAL rPierwiastek2) VAR // Zmienne przechowujące pierwiastki równania rPierwiastek1, rPierwiastek2 : REAL; BEGIN // Oblicz deltę rDelta := b * b - 4 * a * c; // jeżeli delta jest większa lub równa 0, to oblicz pierwiastki IF (rDelta >= 0) THEN // Oblicz pierwszy pierwiastek rPierwiastek1 := (-b + SQRT(rDelta)) / (2 * a); // Oblicz drugi pierwiastek rPierwiastek2 := (-b - SQRT(rDelta)) / (2 * a); ELSE // jeżeli delta jest mniejsza od 0, to brak rozwiązań rzeczywistych rPierwiastek1 := NaN; rPierwiastek2 := NaN; END_IF END_FUNCTION

Kamil Biedulski

Idź do oryginalnego materiału