Operacje Porównania
Logika decyzyjna i Zakresy
Porównywanie wartości to silnik przemysłowej logiki decyzyjnej. Opanuj standardowe komparatory, testy zakresu i weryfikację poprawności.
Czym są operacje porównania w TIA Portal?
Operacje porównania pozwalają na porównanie dwóch wartości tego samego typu danych (Liczby całkowite, Rzeczywiste, Czas itp.) lub sprawdzenie, czy wartość znajduje się wewnątrz lub na zewnątrz zdefiniowanego zakresu. Są one fundamentalne dla tworzenia progów alarmowych, warunków przejścia i pętli regulacji.
TIA Portal oferuje standardowe komparatory (==, <>, >= itp.), instrukcje zakresu (IN_Range, OUT_Range), testy poprawności dla liczb zmiennoprzecinkowych oraz zaawansowane instrukcje dla typów danych Variant i wskaźników DB.
Standardowe Komparatory
Ocena równości i nierówności między dwoma operandami
CMP == — Równy (Equal)
==Co robi
Porównuje dwa operandy (IN1 i IN2). Jeśli IN1 jest równy IN2, instrukcja zwraca TRUE. Obsługuje prawie wszystkie proste typy danych.
Kiedy używać
Sprawdzenie, czy licznik osiągnął cel, czy wartość zadana HMI odpowiada wartości aktualnej lub czy konkretny stan maszyny jest aktywny.
Porady Pro
Uwaga na typy Real: ścisła równość może zawieść z powodu precyzji. Preferuj margines lub zakres.
W SCL: IF value1 = value2 THEN ...
Możesz porównywać ciągi znaków (String), aby zweryfikować kody identyfikacyjne.
CMP <> — Nierówny (Not equal)
<>Co robi
Zwraca TRUE, jeśli oba operandy IN1 i IN2 są różne. Jest to odwrotność równości.
Kiedy używać
Wykrycie zmiany wartości, upewnienie się, że czujnik nie zwraca 0 lub zweryfikowanie, czy tryb pracy nie jest tym zabronionym.
Porady Pro
Często używane do wyzwalania akcji, gdy tylko wartość odchyli się od zadanej.
W SCL: IF value1 <> value2 THEN ...
Może być użyte do porównywania znaczników czasu (DTL), aby sprawdzić, czy data się zmieniła.
CMP >= — Większy lub równy
>=Co robi
Zwraca TRUE, jeśli pierwsza wartość (IN1) jest większa lub równa drugiej (IN2).
Kiedy używać
Wyzwalanie alarmu wysokiego poziomu, zezwolenie na grzanie, dopóki temperatura nie zostanie osiągnięta.
Porady Pro
Idealne dla progów bezpieczeństwa, gdzie wartość graniczna musi być zawarta w warunku.
W SCL: IF level >= setpoint THEN ...
Może być używane z typami Time, aby sprawdzić, czy upłynął minimalny czas.
CMP <= — Mniejszy lub równy
<=Co robi
Zwraca TRUE, jeśli IN1 jest mniejszy lub równy IN2.
Kiedy używać
Monitorowanie niskiego poziomu, zatrzymanie pompy, walidacja minimalnego ciśnienia.
Porady Pro
Często łączone z histerezą, aby uniknąć drgań wyjścia.
Działa natywnie z typami Date i Time.
W SCL: IF pressure <= min_limit THEN ...
CMP > — Większy (Greater than)
>Co robi
Zwraca TRUE, jeśli IN1 jest ściśle większy niż IN2.
Kiedy używać
Ścisłe porównanie, które nie powinno zawierać wartości docelowej.
Porady Pro
Rzadziej używane niż >= w automatyce, ale przydatne w algorytmach matematycznych.
W SCL: IF current > max THEN ...
Preferowane do porównywania indeksów pętli (FOR).
CMP < — Mniejszy (Less than)
<Co robi
Zwraca TRUE, jeśli IN1 jest ściśle mniejszy niż IN2.
Kiedy używać
Testy ścisłych dolnych granic.
Porady Pro
Przydatne do sprawdzania, czy wartość jest 'ujemna' (val < 0).
W SCL: IF val < 0 THEN ...
Działa ze znakami (sortowanie alfabetyczne).
Operacje Zakresu
Sprawdzanie przynależności do przedziału [MIN..MAX]
IN_Range — W zakresie
IN_RangeCo robi
Sprawdza, czy wartość (VAL) znajduje się między dolną granicą (MIN) a górną granicą (MAX). Przedział jest domknięty: MIN <= VAL <= MAX.
Kiedy używać
Monitorowanie okna pracy (np. ciśnienie między 2 a 5 bar), walidacja prędkości maszyny.
Porady Pro
Korzystnie zastępuje dwa komparatory połączone szeregowo, czyniąc segment bardziej czytelnym.
Jeśli MIN > MAX, instrukcja zawsze zwraca FALSE.
Bardzo przydatne dla blokad 'Ready to Run', wymagających wielu warunków analogowych.
OUT_Range — Poza zakresem
OUT_RangeCo robi
Zwraca TRUE, jeśli wartość (VAL) znajduje się poza przedziałem zdefiniowanym przez MIN i MAX. Albo VAL < MIN, albo VAL > MAX.
Kiedy używać
Wykrywanie anomalii lub przekroczenia skrajnych progów (alarm zakresu).
Porady Pro
Jest to dokładna odwrotność IN_Range.
Użyj go do uproszczenia logiki alarmów procesowych.
W SCL: res := (val < min) OR (val > max);
Testy Poprawności
Sprawdzanie integralności liczb zmiennoprzecinkowych
|OK| — Sprawdź poprawność
|OK|Co robi
Sprawdza, czy wartość zmiennoprzecinkowa (Real lub LReal) jest poprawną liczbą. Zwraca FALSE, jeśli wartością jest NaN (Not a Number) lub Inf (Infinity).
Kiedy używać
Po złożonych obliczeniach (dzielenie, pierwiastkowanie, log), aby uniknąć propagacji błędów matematycznych, które mogłyby zatrzymać PLC.
Porady Pro
Niezbędne przed wysłaniem wartości Real do wyjścia analogowego lub napędu.
Pozwala wykryć pośrednie dzielenie przez zero.
Pomocne przy filtrowaniu sygnałów z uszkodzonych czujników.
|NOT_OK| — Sprawdź niepoprawność
|NOT_OK|Co robi
Zwraca TRUE, jeśli wartość zmiennoprzecinkowa jest niepoprawna (NaN lub Inf).
Kiedy używać
Wyzwalanie bitu błędu obliczeń lub wymuszenie wartości bezpiecznej.
Porady Pro
Użyj go, aby wprowadzić maszynę w stan bezpieczny, jeśli obliczenie trajektorii zawiedzie.
Jest to odpowiednik IS_NAN w innych językach.
W SCL: IF NOT OK(value) THEN ...
Zaawansowane porównania (Variant)
Instrukcje do programowania dynamicznego i typów złożonych
EQ_Type / NE_Type
Co robi
Porównuje typ danych zmiennej Variant z typem innej zmiennej lub typem zdefiniowanym.
Kiedy używać
W blokach generycznych, które muszą przetwarzać różne typy danych (np. blok logowania akceptujący Int lub Real).
Porady Pro
Kluczowe dla programowania obiektowego i bibliotek wielokrotnego użytku.
Pozwala na zabezpieczenie dynamicznego dostępu do pamięci.
Używane z instrukcją VariantGet.
IS_NULL / NOT_NULL
Co robi
Sprawdza, czy wskaźnik (Variant lub DB_ANY) jest pusty (nie wskazuje na nic).
Kiedy używać
Unikanie błędów dostępu przy używaniu bloków DB adresowanych pośrednio.
Porady Pro
Zawsze testuj NOT_NULL przed wywołaniem metody lub odczytem danych przez wskaźnik.
Odpowiednik obiektu 'Nothing' lub 'null' w C#/Java.
Niezbędne do zarządzania listami powiązanymi lub strukturami dynamicznymi w PLC.
IS_ARRAY
Co robi
Sprawdza, czy zmienna Variant wskazuje na tablicę (Array).
Kiedy używać
Programowanie funkcji przetwarzania wsadowego lub buforów danych.
Porady Pro
Połącz z CountOfElements, aby poznać rozmiar tablicy.
Pozwala na tworzenie uniwersalnych funkcji sortowania.
Działa również dla tablic struktur (UDT).
Porównanie komparatorów — Którego użyć?
Wybór odpowiedniej instrukcji dla Twojej logiki PLC
| Chcesz... | Użyj tego | Przykład |
|---|---|---|
| Testować ścisłą równość | CMP == | Kod produktu poprawny |
| Wysoki próg bezpieczeństwa | CMP >= | Ciśnienie > 10 bar |
| Utrzymać w strefie | IN_Range | Temp między 18 a 24°C |
| Monitorować błędy Real | |OK| | Sprawdzić wynik dzielenia |
| Zweryfikować wskaźnik DB | NOT_NULL | DB receptury załadowany |
| Sprawdzić typ Variant | EQ_Type | Wejście to rzeczywiście Int |
Często Zadawane Pytania
Dlaczego moje porównanie == czasem zawodzi przy liczbach Real?
Liczby Real (zmiennoprzecinkowe) mają ograniczoną precyzję. Obliczenie może dać wynik 10.000001 zamiast 10.0. Zawsze używaj IN_Range z małą tolerancją (np. między 9.99 a 10.01) do porównywania wartości zmiennoprzecinkowych.
Jaka jest różnica między IN_Range a dwoma komparatorami w szeregu?
Funkcjonalnie jest to identyczne. Jednakże IN_Range jest graficznie bardziej kompaktowy, łatwiejszy do odczytania i wydajniejszy, ponieważ PLC przetwarza instrukcję w jednym kroku.
Do czego służą instrukcje |OK| i |NOT_OK|?
Służą do wykrywania 'cichych' błędów w obliczeniach Real. Jeśli wyciągniesz pierwiastek kwadratowy z liczby ujemnej, wynikiem jest NaN. Bez testu |OK|, to NaN zanieczyści wszystkie Twoje inne obliczenia i może spowodować zatrzymanie CPU.
Czy można porównywać kompletne struktury (UDT)?
Instrukcja CMP == nie pozwala na bezpośrednie porównanie dwóch struktur. Musisz porównać każdy składnik indywidualnie lub użyć specyficznego bloku, który porównuje obszary pamięci.