AI w automatyce

System wizyjny z AI i Finder OPTA: sortowanie obiektów w Pythonie

Szymon Adamek 13 min czytania

System wizyjny to połączenie oświetlenia, kamery z optyką, procesora (albo smart kamery z wbudowanym AI) i komunikacji ze sterownikiem PLC lub robotem. Kamera robi zdjęcie, algorytm analizuje obraz, a PLC dostaje gotowy wynik: OK albo NG, kod obiektu, wymiar czy współrzędne. W tym artykule pokazujemy, jak taki system zbudować tanio: skrypt w Pythonie z modelem AI rozpoznaje obiekty z kamery i przez Modbus TCP wysyła wynik do sterownika Finder OPTA, który w CODESYS steruje sortowaniem dwoma siłownikami.

Czym jest system wizyjny?

Wizja maszynowa to dla maszyny odpowiednik zmysłu wzroku: zastępuje ludzkie oko na linii produkcyjnej. Różnica jest taka, że kamera się nie męczy, pracuje 24/7 i ocenia każdą sztukę według tych samych kryteriów. Niezależnie od producenta każdy system wizyjny składa się z czterech bloków:

  • Oświetlenie - pierścień LED (ring light), podświetlenie od tyłu (backlight), oświetlacz kopułowy (dome) lub dark field. Od niego zależy, czy szukana cecha będzie w ogóle widoczna na obrazie.
  • Kamera z obiektywem - matrycowa (area scan) albo liniowa (line scan), z migawką globalną, podłączona np. przez GigE. Rozdzielczość, czyli liczba pikseli na milimetr obiektu, decyduje o tym, jak drobną wadę wykryjesz.
  • Procesor lub AI - smart kamera z wbudowanym oprogramowaniem, komputer PC albo moduł edge AI. Tu działa algorytm analizy obrazu: klasyczne narzędzia albo sieci neuronowe do rozpoznawania i klasyfikacji.
  • Komunikacja - Modbus TCP, PROFINET, EtherNet/IP albo OPC UA. Wynik musi trafić do PLC lub robota w czasie rzeczywistym.
Cztery elementy systemu wizyjnego: oświetlenie, kamera z optyką, procesor lub AI, komunikacja
Z czego składa się system wizyjny

Gdy procesor i kamera są zamknięte w jednej obudowie, mówimy o kamerze inteligentnej (smart kamerze). Prostsze urządzenia tego typu, ustawiane z kilku zdjęć wzorcowych, producenci często nazywają czujnikiem wizyjnym.

Jak działa system wizyjny na linii produkcyjnej?

Typowy cykl inspekcji wizyjnej ma cztery kroki:

  • Trigger - obiekt jedzie po taśmie, czujnik fotoelektryczny albo enkoder daje sygnał wyzwolenia do kamery lub do PLC (wtedy PLC wyzwala kamerę programowo).
  • Akwizycja - kamera robi zdjęcie. Liczy się czas ekspozycji, a oświetlenie musi być zsynchronizowane ze zdjęciem.
  • Analiza - algorytm wizyjny szuka wad, mierzy wymiary, czyta kody i generuje wynik: OK, NG (not good), wymiar, treść kodu albo współrzędne.
  • Decyzja PLC - sterownik odbiera dane i decyduje: przepuść, odrzuć siłownikiem, skoryguj pozycję robota albo zapisz wynik w bazie danych lub w systemie MES.
Integracja systemu wizyjnego z PLC: trigger, akwizycja, analiza, decyzja PLC oraz protokoły komunikacyjne
Cykl inspekcji i protokoły komunikacji kamery z PLC

Integracja systemu wizyjnego z PLC jest dziś prosta, bo kamery przemysłowe mają wbudowane popularne protokoły. Wybór zwykle wynika z tego, jaki sterownik masz w szafie:

ProtokółEkosystemCharakterystyka
EtherNet/IPRockwell, Omronstandard w USA, plik EDS
PROFINET IOSiemens, Europawymiana cykliczna, plik GSD, TIA Portal
Modbus TCPwieloplatformowyprosty, otwarty, port 502, dobry do retrofitu
OPC UAniezależny od producentaMES i chmura, szyfrowanie TLS, coraz częściej w kamerach

Jeśli dopiero zaczynasz z protokołem Modbus, zajrzyj do wpisu Python i Modbus - jak połączyć Pythona ze sterownikiem PLC. Opisujemy tam rejestry, adresowanie i pierwsze połączenie.

Kontrola jakości i inne zadania - jakie problemy rozwiązuje system wizyjny?

Systemy wizyjne w produkcji robią przede wszystkim to, czego człowiek nie zrobi szybko i powtarzalnie przy każdej sztuce:

  • Kontrola jakości - rysy na lakierze, brakujący element, niewłaściwy kolor, uszkodzona etykieta.
  • Sortowanie i klasyfikacja - po kształcie, kolorze, rozmiarze albo typie produktu.
  • Identyfikacja i OCR - odczyt numerów seryjnych, dat ważności, kodów kreskowych 1D i kodów 2D (QR, DataMatrix), weryfikacja etykiet.
  • Pomiary - precyzyjne wymiary bezdotykowo, nawet z dokładnością do setnych części milimetra.
  • Weryfikacja montażu - czy wszystkie śruby są na miejscu i czy detal jest kompletny.
  • Robotyka - naprowadzanie robota (vision guided robotics), np. przy pobieraniu detali czy paletyzacji.

Oświetlenie - najważniejszy element systemu wizyjnego

Złe oświetlenie to najczęstsza przyczyna porażki projektu wizyjnego. Nie algorytm, nie kamera, nie oprogramowanie. Zasada jest prosta: dobre oświetlenie maksymalizuje kontrast cechy, którą chcesz zobaczyć, i minimalizuje różnice między kolejnymi zdjęciami. Gdy system wizyjny nie działa poprawnie, zacznij diagnozę od światła.

OświetlenieDo czegoUwagi
Backlight (podświetlenie)sylwetka, pomiary wymiarów, wykrywanie krawędzinajwyższy kontrast
Ring light (bright field)inspekcja powierzchni, drobne rysynajpopularniejsza geometria
Dome (cloudy day)powierzchnie błyszczące, kody na foliioświetlacz ok. 2 razy większy od pola widzenia
Dark field (niski kąt)rysy, grawerowane kody DPM, defekty 3Duwydatnia teksturę
Coaxial (na osi)PCB, LCD, płaskie lustrzane powierzchniebrak cieni
Multi-spectral, IR, UVinspekcja przez folię, kontrast materiałówIR przebija warstwy
Rodzaje oświetlenia w systemach wizyjnych: backlight, ring light, dome, dark field, coaxial, IR i UV
Rodzaje oświetlenia i ich zastosowania

Kolor światła też jest parametrem. Czerwone daje uniwersalny kontrast, niebieskie lepiej pokazuje drobne defekty, a podczerwień przechodzi przez niektóre warstwy materiału. Dlatego wiele kamer monochromatycznych pracuje z kolorowym oświetlaczem dobranym do zadania.

Systemy wizyjne dla przemysłu - producenci

Na rynku przemysłowym najczęściej spotkasz:

  • Cognex - lider smart kamer: seria In-Sight z wbudowanym AI, czytniki kodów DataMan i oprogramowanie VisionPro z narzędziami deep learning do wykrywania anomalii, klasyfikacji i lokalizacji.
  • Keyence - m.in. czujnik wizyjny IV3 z wbudowanym AI. Do konfiguracji wystarczy pokazać mu obraz dobrej sztuki i sztuki wadliwej.
  • Basler, SICK, Omron, Baumer - kamery przemysłowe i smart kamery, od prostych sensorów po systemy z wieloma kamerami.

Co daje wdrożenie systemu wizyjnego?

  • 100% inspekcji inline - sprawdzasz każdą sztukę, a nie co dziesiątą czy co setną. W produkcji baterii do pojazdów elektrycznych czy półprzewodników jedna przepuszczona wada może kosztować bardzo dużo.
  • Redukcja braków - wada wykryta od razu oznacza mniej odrzutów i reklamacji.
  • Eliminacja błędów ludzkich - stała jakość inspekcji niezależna od zmęczenia operatora. Szymon wspomina w filmie, jak w fabryce automotive wracały całe partie produktu przez jedną wadliwą sztukę w kontenerze.
  • Traceability - archiwum obrazów i danych daje pełną historię każdej sztuki, co jest kluczowe w motoryzacji, farmacji i przemyśle spożywczym.
  • Dane do analizy procesu - mapy wad (heatmapy) pokazują, gdzie na produkcie najczęściej pojawiają się defekty. Po skorelowaniu z parametrami procesu (temperatura, ciśnienie, prędkość) naprawisz proces, zanim pojawią się braki.
  • Bezpieczeństwo - kamera pracuje tam, gdzie człowiek nie powinien: wysoka temperatura, chemikalia, promieniowanie.

Jak wybrać i wdrożyć system wizyjny?

Nowoczesne systemy wizyjne są coraz prostsze w parametryzacji, ale wdrożenie systemu i tak warto zacząć od kartki, a nie od katalogu kamer:

  • Zdefiniuj zadanie - co dokładnie jest wadą, jakie odchylenia są dopuszczalne i jaki jest czas cyklu. Od tego zależy wymagana wydajność i rozdzielczość.
  • Zbierz próbki - dobre sztuki i wszystkie znane wady. Bez nich ani klasyczny algorytm, ani sieci neuronowe nie nauczą się poprawnego rozróżniania.
  • Dobierz oświetlenie i optykę - testy na prawdziwych detalach, w warunkach hali.
  • Zaplanuj integrację - protokół, mapę danych do PLC, reakcję na wynik NG i rejestrację obrazów do traceability.
  • Sprawdź niezawodność na produkcji - monitorowanie wyników przez kilka zmian pokaże, czy system kontroli nie odrzuca dobrych sztuk.

Przy złożonych liniach (np. w branży motoryzacyjnej) często pomaga integrator systemów wizyjnych. Proste zadania sortowania czy obecności detalu inżynier automatyk zrobi sam, czego dowodem jest projekt poniżej.

Projekt: system wizyjny ze sztuczną inteligencją, Pythonem i Finder OPTA

W filmie budujemy uproszczoną wersję systemu sortowania. Kamera patrzy na stół, skrypt w Pythonie z modelem AI rozpoznaje siedem klas obiektów: butelkę, kubek, nożyczki, telefon, książkę, klawiaturę i osobę. Aplikacja "Vision + Finder Opta" działa w przeglądarce: pokazuje obraz z ramką wykrytego obiektu, procent pewności, statystyki klas i status połączenia Modbus. Statystyki odświeżają się co 500 ms, a obraz jest analizowany z prędkością około 5 klatek na sekundę.

Aplikacja Vision + Finder Opta wykrywa telefon na obrazie z kamery i wysyła wynik przez Modbus TCP
Detekcja telefonu w aplikacji Python z połączeniem Modbus do OPTA

Wymiana danych: trzy rejestry Modbus TCP

Finder OPTA w wersji CODESYS pracuje jako serwer Modbus TCP (urządzenie ModbusTCP_Server_Device) pod adresem 192.168.0.10, port 502. Skrypt Pythona jest klientem i zapisuje trzy rejestry holding, które w sterowniku widać jako zmienne %QW26-%QW28:

RejestrZmienna w PLCZawartośćZakres
HR 0objectCode_inkod wykrytego obiektu0-7 (0 = brak)
HR 1confidence_inpewność detekcji w procentach0-100
HR 2detectionCount_inliczba detekcji w klatce0 i więcej
KodObiektKodObiekt
0brak4telefon
1butelka5książka
2kubek6klawiatura
3nożyczki7osoba

Mapowanie kodów musi być identyczne po obu stronach. W projekcie z filmu słownik klas siedzi w pliku konfiguracyjnym skryptu Pythona, a ten sam podział jest w instrukcji CASE w PLC.

Python: wysyłka wyniku detekcji do PLC

Poniżej szkic tej samej wymiany danych. To nie jest kod z filmu, tylko minimalny przykład na bibliotece standardowej Pythona (moduły socket i struct). Funkcja Modbus 16 (Write Multiple Registers) zapisuje trzy rejestry naraz. Funkcję `wykryj_obiekt()` podmieniasz na wywołanie swojego modelu AI.

import socket
import struct
import time

PLC_IP = "192.168.0.10"   # Finder OPTA - serwer Modbus TCP
PLC_PORT = 502
UNIT_ID = 1               # ustaw zgodnie z konfiguracja serwera w CODESYS

KLASY = {"butelka": 1, "kubek": 2, "nozyczki": 3, "telefon": 4,
         "ksiazka": 5, "klawiatura": 6, "osoba": 7}


def zapisz_rejestry(sock, adres, wartosci, transakcja):
    """Funkcja Modbus 16: zapis kilku rejestrow holding."""
    liczba = len(wartosci)
    pdu = struct.pack(">BHHB", 16, adres, liczba, liczba * 2)
    pdu += struct.pack(">" + "H" * liczba, *wartosci)
    mbap = struct.pack(">HHHB", transakcja, 0, len(pdu) + 1, UNIT_ID)
    sock.sendall(mbap + pdu)
    odp = sock.recv(256)
    if len(odp) < 8 or odp[7] & 0x80:
        raise IOError("Sterownik odrzucil zapis: " + odp.hex())


def wykryj_obiekt():
    """Tu podpinasz model AI: zwroc (nazwa klasy lub None, pewnosc 0..1, liczba detekcji)."""
    return None, 0.0, 0


with socket.create_connection((PLC_IP, PLC_PORT), timeout=2) as sock:
    nr = 0
    while True:
        nazwa, pewnosc, liczba = wykryj_obiekt()
        kod = KLASY.get(nazwa, 0)
        nr = (nr + 1) % 65536
        zapisz_rejestry(sock, 0, [kod, round(pewnosc * 100), liczba], nr)
        time.sleep(0.2)   # ok. 5 aktualizacji na sekunde

Pewność wysyłamy jako liczbę całkowitą 0-100, bo rejestr Modbus to 16-bitowe słowo bez znaku. Przeliczenie na ułamek robi już PLC. Podobny schemat (Python jako klient Modbus TCP, OPTA jako drugi koniec) pokazaliśmy w artykule Pomiar energii w Pythonie: Finder Opta, licznik energii i Modbus TCP.

CODESYS: dekodowanie danych i instrukcja CASE

Projekt w CODESYS ma dwa programy w zadaniu MainTask: PLC_PRG (logika) i Stats_PRG (statystyki). Na początku PLC_PRG przepisujemy rejestry do zmiennych lokalnych, przeliczamy pewność na zakres 0.0-1.0 i zamieniamy kod na nazwę obiektu:

// Dekodowanie danych wizji wpisanych przez skrypt Python
// (192.168.0.10 : 502, Holding Registers 0..2 -> %QW26..%QW28)
wObjectCode := objectCode_in;                                  // 0 = brak
rConfidence := INT_TO_REAL(WORD_TO_INT(confidence_in)) / 100.0; // 0.0..1.0
wDetectionCount := detectionCount_in;

CASE wObjectCode OF
    0: sObjectName := 'brak';
    1: sObjectName := 'butelka';
    2: sObjectName := 'kubek';
    3: sObjectName := 'nozyczki';
    4: sObjectName := 'telefon';
    5: sObjectName := 'ksiazka';
    6: sObjectName := 'klawiatura';
    7: sObjectName := 'osoba';
ELSE
    sObjectName := 'nieznane';
END_CASE
Program PLC_PRG w CODESYS: dekodowanie rejestrów Modbus i instrukcja CASE dla kodów obiektów
Dekodowanie danych z systemu wizyjnego w CODESYS

Gałąź ELSE łapie każdy kod spoza listy, więc błąd po stronie Pythona nie wywróci logiki. Więcej o CASE, IF i pętlach znajdziesz we wpisie Codesys: kontrola przepływu programu - IF, CASE i pętle.

Flagi obiektów i diody LED na Finder OPTA

W programowaniu PLC wygodniej operować na flagach typu BOOL niż na liczbach. Każdy obiekt dostaje swoją flagę, którą łatwo użyć w ST, w drabince LD albo w wizualizacji. Cztery z nich od razu sterują diodami LED na froncie sterownika, więc wynik detekcji widać na fizycznym sprzęcie:

xObjButelka    := (wObjectCode = 1);
xObjKubek      := (wObjectCode = 2);
xObjNozyczki   := (wObjectCode = 3);
xObjTelefon    := (wObjectCode = 4);
xObjKsiazka    := (wObjectCode = 5);
xObjKlawiatura := (wObjectCode = 6);
xObjOsoba      := (wObjectCode = 7);
xObjDetected   := (wObjectCode <> 0);

// LED1 - telefon, LED2 - klawiatura, LED3 - butelka, LED4 - osoba
xLed1_Telefon    := xObjTelefon;
xLed2_Klawiatura := xObjKlawiatura;
xLed3_Butelka    := xObjButelka;
xLed4_Osoba      := xObjOsoba;
Sterowniki Finder OPTA na szynie DIN w stanowisku PLC Trainer
Finder OPTA sygnalizuje wykryty obiekt diodami LED

W teście po kolei kładziemy przed kamerą telefon (kod 4), nożyczki, klawiaturę (kod 6), książkę (kod 5) i kubek. Model rozpoznaje je z pewnością bliską 100%, w CODESYS zmienia się kod i nazwa obiektu, a na OPTA zapala się odpowiednia dioda. Gdy obiekt zniknie z pola widzenia, wszystkie flagi wracają do FALSE. Jeśli to Twój pierwszy projekt na tym sterowniku, zacznij od wpisu Pierwsze uruchomienie i konfiguracja sterownika Finder OPTA CODESYS, a środowisko CODESYS dla OPTA pobierzesz ze strony Finder.

Sekwencja sortowania z dwoma siłownikami

Sama detekcja to dopiero połowa. W prawdziwej aplikacji obiekty jadą po przenośniku, a spychacz wypycha je na właściwą linię, np. do kompletowania paczki dla klienta. Sekwencja w filmie ma cztery kroki:

  • Krok 1: klasyfikacja - siłownik 1 spycha nożyczki i klawiaturę, siłownik 2 spycha telefon. Butelka, kubek i książka są przepuszczane, a osoba jest ignorowana i nie wyzwala żadnego siłownika.
  • Krok 2: opóźnienie transportu - na zboczu narastającym detekcji startuje timer TP odmierzający czas dojazdu obiektu od kamery do siłownika.
  • Krok 3: impuls siłownika - koniec opóźnienia (zbocze opadające wyjścia TP wykryte przez F_TRIG) uruchamia drugi timer TP, który wysuwa tłok na zadany czas.
  • Krok 4: liczniki - Stats_PRG zlicza zepchnięcia i przepuszczenia dla statystyk.
// Wyjscia przekaznikowe Opta - dostosuj adres do swojego sprzetu
xActuator1_Push AT %QX0.4 : BOOL;   // silownik 1: nozyczki, klawiatura
xActuator2_Push AT %QX0.5 : BOOL;   // silownik 2: telefon
tTransportDelay : TIME := T#1500MS; // dojazd od kamery do silownika
tPulseDuration  : TIME := T#500MS;  // czas wysuniecia silownika

// Krok 1: klasyfikacja
xPushByAct1 := xObjNozyczki OR xObjKlawiatura;
xPushByAct2 := xObjTelefon;

// Wykrycie zbocza pojawienia sie obiektu w kadrze (R_TRIG)
trigPush1(CLK := xPushByAct1);
trigPush2(CLK := xPushByAct2);
trigPassed(CLK := xObjButelka OR xObjKubek OR xObjKsiazka);

// Krok 2: TP opoznienia transportu
tpDelay1(IN := trigPush1.Q, PT := tTransportDelay);
tpDelay2(IN := trigPush2.Q, PT := tTransportDelay);

// Krok 3: koniec opoznienia (F_TRIG) -> puls silownika
fTrigDelayEnd1(CLK := tpDelay1.Q);
fTrigDelayEnd2(CLK := tpDelay2.Q);
tpPulse1(IN := fTrigDelayEnd1.Q, PT := tPulseDuration);
tpPulse2(IN := fTrigDelayEnd2.Q, PT := tPulseDuration);

xActuator1_Push := tpPulse1.Q;
xActuator2_Push := tpPulse2.Q;

Fragment deklaracji wyjść i czasów pochodzi z sekcji VAR, a resztę wykonuje program. Oba czasy da się regulować online, bez zatrzymywania sterownika. Na stanowisku słychać przełączanie przekaźników OPTA, a liczniki rosną przy każdym zadziałaniu spychacza. Zamiast siłownika możesz podłączyć silnik, zwrotnicę albo cokolwiek potrzebujesz na linii. Jak podpiąć i oprogramować prawdziwe siłowniki pneumatyczne, pokazujemy we wpisie Sterowanie siłownikami pneumatycznymi z Finder Opta i Codesys.

System wizyjny - najczęściej zadawane pytania

Co to jest system wizyjny?

To układ oświetlenia, kamery z obiektywem, jednostki przetwarzającej obraz (smart kamera, PC lub moduł AI) i komunikacji z PLC lub robotem. Automatycznie sprawdza, mierzy, identyfikuje albo klasyfikuje obiekty i przekazuje wynik do sterowania maszyną.

Czy system wizyjny musi mieć sztuczną inteligencję?

Nie. Klasyczne narzędzia (wykrywanie krawędzi, pomiar, odczyt kodów) świetnie działają przy powtarzalnych detalach i dobrym świetle. Sztuczna inteligencja przydaje się przy klasyfikacji wielu typów obiektów i wadach trudnych do opisania regułami. W naszym projekcie model AI rozpoznaje siedem klas przedmiotów codziennego użytku.

Jaki protokół wybrać do połączenia kamery z PLC?

Ten, który obsługuje Twój sterownik: PROFINET dla Siemensa, EtherNet/IP dla Rockwella i Omrona, Modbus TCP jako uniwersalne i otwarte rozwiązanie, OPC UA do integracji z MES i chmurą. Finder OPTA z CODESYS i skrypt w Pythonie dogadują się przez Modbus TCP na porcie 502.

Dlaczego system wizyjny nie działa poprawnie?

Najczęściej winne jest oświetlenie: odblaski, cienie, światło z hali zmieniające się w ciągu dnia. Dalej sprawdź ostrość i rozdzielczość (ile pikseli przypada na wadę), czas ekspozycji przy szybkim ruchu oraz to, czy kody obiektów są takie same po stronie kamery i PLC.

Podsumowanie

System wizyjny to cztery elementy: oświetlenie, kamera, procesor lub AI oraz komunikacja z PLC. W filmie łączymy je w działający sortownik: Python z modelem AI rozpoznaje obiekty, przez Modbus TCP wysyła trzy rejestry do Finder OPTA, a program w CODESYS dekoduje je instrukcją CASE, zapala diody i steruje dwoma siłownikami z licznikami zadziałań. Taki układ łatwo dopasujesz do własnych obiektów i własnej linii. Jeśli chcesz pisać podobne skrypty samodzielnie, od komunikacji z PLC po przetwarzanie danych, sprawdź Kurs Python dla automatyków.

Elmark Automatyka

Sprzęt Allen-Bradley wykorzystywany w naszych materiałach (sterowniki Micro800, panele operatorskie i akcesoria) dostarcza nasz partner technologiczny Elmark Automatyka, autoryzowany dystrybutor Rockwell Automation w Polsce.

Autor Szymon Adamek

Dyrektor w ControlByte, automatyk. Autor kursu Predykcyjne utrzymanie ruchu i analiza danych w Pythonie. Prowadzi projekty szkoleniowe dla firm i szkół.

Kursy online

Chcesz programować PLC w praktyce?

Kursy Siemens, CODESYS, komunikacji i safety z certyfikatem i wsparciem instruktora. Zacznij od bezpłatnego minikursu.

Zobacz kursy