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.

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 jest dziś prosta, bo kamery przemysłowe mają wbudowane popularne protokoły. Wybór zwykle wynika z tego, jaki sterownik masz w szafie:
| Protokół | Ekosystem | Charakterystyka |
|---|---|---|
| EtherNet/IP | Rockwell, Omron | standard w USA, plik EDS |
| PROFINET IO | Siemens, Europa | wymiana cykliczna, plik GSD, TIA Portal |
| Modbus TCP | wieloplatformowy | prosty, otwarty, port 502, dobry do retrofitu |
| OPC UA | niezależny od producenta | MES 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świetlenie | Do czego | Uwagi |
|---|---|---|
| Backlight (podświetlenie) | sylwetka, pomiary wymiarów, wykrywanie krawędzi | najwyższy kontrast |
| Ring light (bright field) | inspekcja powierzchni, drobne rysy | najpopularniejsza geometria |
| Dome (cloudy day) | powierzchnie błyszczące, kody na folii | oświetlacz ok. 2 razy większy od pola widzenia |
| Dark field (niski kąt) | rysy, grawerowane kody DPM, defekty 3D | uwydatnia teksturę |
| Coaxial (na osi) | PCB, LCD, płaskie lustrzane powierzchnie | brak cieni |
| Multi-spectral, IR, UV | inspekcja przez folię, kontrast materiałów | IR przebija warstwy |

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ę.

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:
| Rejestr | Zmienna w PLC | Zawartość | Zakres |
|---|---|---|---|
| HR 0 | objectCode_in | kod wykrytego obiektu | 0-7 (0 = brak) |
| HR 1 | confidence_in | pewność detekcji w procentach | 0-100 |
| HR 2 | detectionCount_in | liczba detekcji w klatce | 0 i więcej |
| Kod | Obiekt | Kod | Obiekt |
|---|---|---|---|
| 0 | brak | 4 | telefon |
| 1 | butelka | 5 | książka |
| 2 | kubek | 6 | klawiatura |
| 3 | nożyczki | 7 | osoba |
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

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;

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.
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.


