#1 TIA Portal ve Factory I/O ile Python: Sanal Ayıklama Uygulaması

Python Programlama ile Sanal Ayıklama Uygulaması

Python programlama kullanarak Factory I/O ve TIA Portal haberleşmesiyle Factory I/O ortamında konveyörde bulunan hammaddeleri renklerine göre ayırma uygulaması.
Yayınlanma Tarihi

13 Aralık 2025

İpucuKullanılan Yazılımlar

TIA Portal V20, PLCSIM V20, Factory I/O, Spyder IDE, NetToPLCsim

Proje Özeti

Bu projede, TIA Portal ve Factory I/O ortamları kullanılarak bir Sanal Ayıklama Uygulaması geliştirilmiştir. Görüntü işleme senaryosu, Python programlama dili ve OpenCV kütüphanesi kullanılarak gerçekleştirilmiştir. Simülasyon ortamları arasındaki veri alışverişi, NetToPLCSim aracılığıyla TIA Portal (PLCSIM) ve Factory I/O arasında sağlanmıştır. Geliştirilen sistemde, kamera görüntüsünden elde edilen renk bilgileri işlenerek ayıklama mekanizmalarının kontrolü sağlanmış ve sistemin senaryo doğrultusunda çalışması sağlanmıştır.

Senaryo

Factory I/O ortamında sahneye eklenen konveyör üzerinde yayıcı (Emitter) aracılığı ile mavi hammadde ve yeşil hammadde (Blue Raw Material, Green Raw Material) üretilecektir. Simülasyon çalışmaya başladığında “Start” butonuna basılınca konveyör hareket etmeye başlayacak, 1. kontrol noktasında kamera mavi hammadeyi görünce “Pusher-1” mavi hammaddeyi ileri itecek ve başlangıç konumuna dönecektir. 2. kontrol noktasında kamera yeşil hammaddeyi görünce “Pusher-2” yeşil hammaddeyi ileri itecek ve başlangıç konumuna dönecektir. Simülasyonun herhangi bir anında “Acil Stop” veya “Stop” butonuna basılınca konveyör hareketini durduracaktır. Tekrardan “Start” butonuna basılması durumunda sistem kaldığı yerden çalışmasını sürdürecektir.

İşlem Adımları

1. Factory I/O TIA Portal Template İndirme

Bu projede gerçekleştirilen senaryoda TIA Portal V20 ile PLCSIM üzerinden Factory I/O haberleşmektedir. Bu işlemin gerçekleşebilmesi için Factory I/O template dosyası gerekmektedir. Bunun için Factory I/O Template adresinden ilgili dosya edinilmiştir.

DikkatUyarı

Gerçekleştirilen senaryoda TIA Portal V20 ile PLCSIM V20 kullanıldığı için
FactoryIO_Template_S7-1200_V20.zip” dosyası indirilmiştir. Farklı bir sürüm kullanılması durumunda
kullanılan sürüme uygun template dosyasını edinilmelidir.

2. Factory I/O Template ile TIA Portal Programı Oluşturma

İndirilen bu template dosyası TIA Portal ile birlikte açılarak kullanılmıştır.

Template dosyası ayrıca TIA Portal arayüzü üzerinden “Open Project” menüsünden de açılabilmektedir.

Template dosyası TIA Portal arayüzünde açıldıktan sonra uygulanmak istenen senaryoya yönelik program hazırlanmıştır.
Aşağıdaki resimlerde belirtilen senaryoya yönelik LD (Ladder Diagram) programı gösterilmektedir.

UyarıPUT/GET İzni

Bu aşamada aşağıdaki PUT/GET izni verilmelidir.
TIA Portal > Device Configuration > General > Connection mechanisms > Permit access with PUT/GET communication from remote partner” kutucuğu işaretlenerek izin verilebilmektedir.
Bu ayar yapıldıktan sonra PLC’ye sağ tıklayarak Compile > Hardware (rebuild all) seçeneği ile rebuild işlemi gerçekleştirilip proje PLCSIM’e (Download to device) seçeneği ile yüklenilmelidir.

DikkatUyarı

Factory I/O template dosyası TIA Portal ile açıldığında varsayılan program bloğu dili FB olarak gelmektedir. Main [OB1] > Switch Programming Language > LAD işlem adımlarını uygulayarak ladder diyagramı ile program yazabilmektedir.

Ladder - 1

Ladder - 2

Ladder - 3

3. PLCSIM - TIA Portal Haberleşmesi

Hazırlanan senaryoya uygun kod hazırlandıktan sonra derleme işlemi gerçekleştirilmiştir. Bu işlem adımı için “Edit > Compile” veya “Ctrl + B” kısayolu kullanılabilmektedir. Devamında üst menüde bulunan “Start Simülation” butonu ile PLCSIM’ başlatılmıştır.

Açılan ekranda “Start Search” yaparak bağlı olunan cihazlar listelenmektedir. Bu işlemi yaparken “PG/PC Interface : PLCSIM” seçeneğinin belirtildiği gibi olması gerekmektedir. Arama sonucunda PLCSIM PLC seçilerek program “Load” denilerek yüklenmiştir.

Devamında açılır listeden “Start Module” seçeneği seçilerek “Finish” butonuna basılarak işlem tamamlanmıştır.

Böylelikle TIA Portal ile PLCSIM haberleşmesi gerçekleştirilmiştir.

PLCSIM > SimView menüsünden manuel olarak eklediğiniz girişleri değiştirerek çıkışın nasıl etkilendiğini gözlemleyebilirsiniz.

4. NetToPLCSim Ayarları

Gerçekleştireceğimiz senaryoda görüntü işleme ile ilgili işlemler için “Python” kullanılacaktır. Python-TIA Portal haberleşmesini sağlamak için “NetToPLCSim” programı kullanılmıştır.

Program indirme bağlantısı: NetToPLCSim

Programı indirdikten sonra “Add” ile ekleme yapılır.

Gelen ekranda;

1 Numara: Eklenecek bağlantıya istenilen isim verilebilmektedir.
2 Numara: Network IP Adress’in en sağında bulunan “…” sembolüne tıklayarak kulllandığınız bilgisayara ait IP adresinin eklenmesi gerekmektedir.
3 Numara: PLCSim IP Adress’in en sağında bulunan “…” sembolüne tıklayarak PLCSIM’in IP adresinin eklenmesi gerekmektedir.
4 Numara: Burada belirtilen “2” sayısı “1” ile değiştirilmelidir. Siemens S7-1200 PLC için Rack / Slot numarası: 0 / 1 şeklinde olmalıdır.

Bağlantılar doğru gerçekleştirildiğinde “…” sembolüne tıklandığında IP adresleri ekranda listelenmektedir.

Belirtilen ayarlar yapıldıktan sonra ekran aşağıdaki gibi gözükmektedir. “Start Server” diyerek bağlantı başlatılmıştır.

Status alanının “RUNNING” olduğu görülerek bir sonraki aşamaya geçilmiştir.

5. Factory I/O Sahnesi Oluşturma

Sürecin devamında Factory I/O ile hazırlanan senaryoya uygun sahne oluşturulmuştur. Hazırlanan senaryoya uygun bileşenler (emitter, belt conveyor, curved conveyor, pusher, electric switchboard, emergency stop, stop button, start button) sahneye uygun konumda yerleştirilmiştir.

Bileşenlerin dikey eksende (yukarı/aşağı) konumlandırılması için ‘V’ kısayol tuşu kullanılmaktadır.

6. Factory I/O Konfigürasyon

Factory I/O uygulamasında üst menüden “File>Drivers” menüsüne giderek sol üstte”DRIVER”ın hizasında yanında bulunan açılır listeden “Siemens S7-PLCSIM” seçilmiştir. Bu aşamada TIA Portal-PLCSIM üzerinden Factory I/O ile haberleşmesi tamamlanmıştır.

PLC kodunda tanımlanan değişkenler, “File > Drivers” menüsü üzerinden ilgili fiziksel giriş ve çıkış adresleri ile eşleştirilmiştir.

Bu işlem gerçekleştirildikten sonra sağ üstte bulunan “Connect” tuşuna basılarak TIA Portal’da hazırlanan kod PLCSIM aracılığıyla Factory I/O ile haberleştirilmiştir.

PLCSIM aracılığı ile bağlanılan PLC “Run” modunda olmalıdır

Factory I/O ortamında konveyörde hareket eden mavi ve yeşil hammaddeleri algılayarak işlem yapabilmek için Python programlama dili kullanılmıştır.

İpucuKullanılan Kütüphaneler

time,cv2,numpy,mss,snap7

Bu adımla birlikte Factory I/O ve TIA Portal (PLCSIM) arasındaki simülasyon bağlantısı tamamlanmıştır. Artık senaryodaki görüntü işleme mantığını uygulamak üzere Python kodlama aşamasına geçilmiştir.

6. Python Programlama Adımları


6.1 Kullanılan Kütüphanelerin “Import” edilmesi

İlk olarak hazırlanan senaryonun çalıştırılabilmesi için gereken kodları barındıran kütüphaneler “Import” edilmiştir.
time kütüphanesi : Programda bulunan döngü zamanlamasını yönetmek için kullanılmıştır.
cv2 kütüphanesi : Görüntüyü HSV’ye çevirme, renk aralığına göre maske üretme, maskede piksel sayma vb. işlemlerini gerçekleştirmek için kullanılmışır.
numpy kütüphanesi : “mss” ile yakalanan ekran görüntüsünü diziye (np.array) çevirme, HSV eşik değerlerini dizi olarak tanımlama ve görüntü üzerinde dilimleme yapmak için kullanılmıştır
mss kütüphanesi : Factory I/O ortamında kamera bulunmadığı için ekranda belirlenen bölgelerin (ROI) yakalanmasını sağlamak için kullanılmıştır.
snap7 kütüphanesi : Siemens S7-1200 PLC ile Python üzerinden bağlanıp veri alışverişi yapmak için kullanılmıştır.
snap7.util : PLC byte’ı içindeki ilgili biti set etmek için kullanılmıştır.

import time
import cv2
import numpy as np
import mss
import snap7
from snap7 import util
6.2 Sistem Konfigürasyonu

Programda kullanılacak kütüphaneler eklendikten sonra bu aşamada program içerisinde kullanacağımız değişkenlerin tanımlaması yapılmıştır. Konfigürasyon tamamlandıktan sonra “plc.connect()” komutuyla bağlantı sağlanmıştır.

PLC_IP = "XXX.XXX.XXX.XXX"
RACK = 0
SLOT = 1

blue_low   = np.array([75,  30, 20])
blue_hıgh  = np.array([140, 255, 255])

green_low  = np.array([40,  80, 50])
green_hıgh = np.array([80,  255, 255])

roı_blue = {'top': 432, 'left': 692, 'width': 48, 'height': 44}
roı_green = {'top': 565, 'left': 1253, 'width': 50, 'height': 68}

px_threshold = 1200
gecen_sure = 0.10
last_log = 0  
show_debug = True

plc = snap7.client.Client()
plc.connect(PLC_IP, RACK, SLOT)
6.3 Algılama ve Karar Üretme

Bu aşamada ekrandan alınan ROI görüntülerinde HSV tabanlı renk analizi yapılarak mavi ve yeşil nesnelerin varlığına karar veren görüntü işleme aşaması yönetilmiştir.

with mss.mss() as sct:
    while True:
        t0 = time.perf_counter()

        img_b = np.array(sct.grab(roı_blue))[:, :, :3]
        img_g = np.array(sct.grab(roı_green))[:, :, :3]

        hsv_b = cv2.cvtColor(img_b, cv2.COLOR_BGR2HSV)
        hsv_g = cv2.cvtColor(img_g, cv2.COLOR_BGR2HSV)

        blue_mask  = cv2.inRange(hsv_b, blue_low, blue_hıgh)
        green_mask = cv2.inRange(hsv_g, green_low, green_hıgh)

        blue_px  = cv2.countNonZero(blue_mask)
        green_px = cv2.countNonZero(green_mask)

        blue  = blue_px  > px_threshold
        green = green_px > px_threshold
6.4 PLC Bit Güncelleme

Bu kod bloğunda ilk önce hedef bitin bulunduğu “Byte” PLC’den okunmuş, ilgili bit manipüle edildikten sonra tekrar yazılarak aynı adresteki diğer bitlerin korunması sağlanmıştır. Snap7 kütüphanesi ve S7 protokolü verileri Byte (8-bit) tabanlı işler. Doğrudan yazma işleminde hedef byte içerisindeki diğer 7 bit sıfırlanabilmektedir.

        byte_blue = bytearray(plc.mb_read(50, 1))
        util.set_bool(byte_blue, 0, 0, blue)
        plc.mb_write(50, 1, byte_blue)
        
        byte_green = bytearray(plc.mb_read(51, 1))
        util.set_bool(byte_green, 0, 0, green)
        plc.mb_write(51, 1, byte_green)
6.5 Periyodik Durum Log

Bu kod bloğu ile ana döngüden bağımsız olarak, saniyede 2 kez durum verileri (piksel sayıları ve lojik sonuçlar) konsola yazdırılmıştır.

        now = time.time()
        if now - last_log > 0.5:
            print(f"BLUE px={blue_px:5d} thr={PIXEL_THR} -> {int(blue)} | GREEN px={green_px:5d} -> {int(green)}")
            last_log = now
6.6 Debug Amaçlı Görüntü Gösterimi

Bu aşamada ham görüntüler ile birlikte elde edilen maskeler ekrana yansıtılmıştır. Aynı zamanda klavyeden “q” harfine basınca programın manuel olarak sonlandırılabilmesi sağlanmıştır.

        if show_debug:
            cv2.imshow("ROI BLUE", img_b)
            cv2.imshow("BLUE MASK", blue_mask)
            cv2.imshow("ROI GREEN", img_g)
            cv2.imshow("GREEN MASK", green_mask)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
6.7 Döngü Zamanlama Kontrolü

Bu kısımda düzenli veri akışı sağlamak adına, her işlem sonunda hesaplanan süre kadar bekleme uygulanmıştır.

        dt = time.perf_counter() - t0
        if dt < gecen_sure: time.sleep(gecen_sure - dt)
6.8 Uygulama Sonlandırma Aşaması

Programın en sonunda uygulama kapatılırken tüm açık pencereler ve PLC bağlantısı güvenli bir şekilde kapatılarak kaynaklar serbest bırakılmıştır.

cv2.destroyAllWindows()
plc.disconnect()

7. Python Programı

import time
import cv2
import numpy as np
import mss
import snap7
from snap7 import util

PLC_IP = "XXX.XXX.XXX.XXX"
RACK = 0
SLOT = 1

blue_low   = np.array([75,  30, 20])
blue_hıgh  = np.array([140, 255, 255])

green_low  = np.array([40,  80, 50])
green_hıgh = np.array([80,  255, 255])

roı_blue = {'top': 432, 'left': 692, 'width': 48, 'height': 44}
roı_green = {'top': 565, 'left': 1253, 'width': 50, 'height': 68}

px_threshold = 1200
gecen_sure = 0.10
last_log = 0  

show_debug = True

plc = snap7.client.Client()
plc.connect(PLC_IP, RACK, SLOT)


with mss.mss() as scr:
    while True:
        t0 = time.perf_counter()

        img_b = np.array(scr.grab(roı_blue))[:, :, :3]
        img_g = np.array(scr.grab(roı_green))[:, :, :3]

        hsv_b = cv2.cvtColor(img_b, cv2.COLOR_BGR2HSV)
        hsv_g = cv2.cvtColor(img_g, cv2.COLOR_BGR2HSV)

        blue_mask  = cv2.inRange(hsv_b, blue_low, blue_hıgh)
        green_mask = cv2.inRange(hsv_g, green_low, green_hıgh)

        blue_px  = cv2.countNonZero(blue_mask)
        green_px = cv2.countNonZero(green_mask)

        blue  = blue_px  > px_threshold
        green = green_px > px_threshold
        
        byte_blue = bytearray(plc.mb_read(50, 1))
        util.set_bool(byte_blue, 0, 0, blue)
        plc.mb_write(50, 1, byte_blue)
        
        byte_green = bytearray(plc.mb_read(51, 1))
        util.set_bool(byte_green, 0, 0, green)
        plc.mb_write(51, 1, byte_green)

        now = time.time()
        if now - last_log > 0.5:
            print(f"MAVİ px={blue_px:5d} eşik={px_threshold} -> {int(blue)} | YEŞİL px={green_px:5d} -> {int(green)}")
            last_log = now

        if show_debug:
            cv2.imshow("Mavi ROI", img_b)
            cv2.imshow("Mavi Maskleme", blue_mask)
            cv2.imshow("Yeşil ROI", img_g)
            cv2.imshow("Yeşil Maskeleme", green_mask)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        dt = time.perf_counter() - t0
        if dt < gecen_sure: time.sleep(gecen_sure - dt)

cv2.destroyAllWindows()
plc.disconnect()

8. Sonuçlar

Gerçekleştirilen projeye dair yapılan çalışmanın video kayıtları aşağıdaki gibidir.

Factory I/O ortamında yazılan PLC programının konveyör, start, stop, acil stop butonlarının çalışması aşağıda gösterildiği gibi kontrol edilmiştir.

Gerçekleştirilen projenin simülasyonuna ait video kaydı aşağıdaki gibidir.