Snap7 — Siemens PLC ile Python Veri Haberleşmesi

Kardelen Yurtkuran
2 min readApr 15, 2023

--

Merhaba, ilk yazım için beni epey uğraştıran bir kaç sene önce yaptığım bir projenin konusunu seçtim. Projenin amacı araba depo kapaklarının belirli hava akış testi sırasında açma basınçlarının ve vakum değerlerinin anlık okunup real-time grafikler ile raporlanması, test verilerininde saklanmasıydı. Ancak bu yazımızın konusu yalnızca Siemens PLC ile haberleşmek olacaktır.

Anlık verileri okumam için kullanılacak PLC; Siemens PLC 1200’dü.

Snap7, Siemens PLC’lere TCP/IP protokolünü kullanarak erişim sağlayan bir kütüphanedir. Aynı zamanda Siemens PLC’lere Python, C#, C++, Delphi, Java gibi birçok programlama diliyle erişim sağlayabilirsiniz.

İlk olarak bilgisayarınıza snap7 modülünü kurmanız gerekmektedir.

pip install python-snap7

Ancak hala hazır değilsiniz. Bu modülü kullanabilmek için snap7.dll dosyasını da yüklemelisiniz. Bunun için snap7’nin resmi web sitesini kullanabilirsiniz.

Python-Snap7 modülünü kullanmak için Snap7.dll dosyasına ihtiyacınız vardır. Çünkü Snap7.dll dosyası, modülün Siemens PLC’leriyle iletişim kurmasını sağlayan düşük seviyeli bir kütüphanedir.

Artık programlamaya geçebiliriz.

Öncelikle kütüphaneyi import ediyoruz.

import snap7

PLC ile bağlantı için bir client oluşturmalısınız. Ardından bağlantı kurabilirsiniz.

_Plc= snap7.client.Client()
_Plc.connect(ip_address, rack, slot)

Bu parametreler benim için;

_Plc.connect('192.168.2.1', 0, 1)

Rack; PLC donanım modüllerinin yerleştirildiği dikey yapılardır.

Slot; modüllerin rack içinde ki konumlarıdır.

Rack ve slot numaraları her konfigürasyon için değişebilir. Ancak doğru iletişim kurabilmek için bu değerler önemlidir.

Sırada istediğiniz veri haberleşmesi var;

# Veri okuma işlemi
data = plc.read_area(snap7.types.Areas.DB, db_number, start_byte, length)
# Veri yazma işlemi
plc.write_area(snap7.types.Areas.DB, db_number, start_byte, data)

snap7.types.Areas.DB; “DB” yani Data Block, PLC’de işlem yapılacak veri alanının türünü belirtir. Genellikle sabit bir değerdir.

db.number; Veri alanı numarasıdır.

start_byte; İşlem yapılacak verinin bellek hücresinin nereden başlayacağını belirtir.

length ; Byte cinsinden işlem yapılacak verinin uzunluğunu belirtir.

Benim için bu değerler her değişken için farklıydı ancak bir kaç tanesini şöyle sıralayabilirim;

_Plc.db_read(200, 2, 1)
_Plc.db_read(200, 14, 4)
_Plc.db_read(200, 44, 4)

Yazmak için ise;

_Plc.db_write(100, 288, b’\x00\x01')

İşte hepsi bu kadar.
Daha fazlası için github profilimi ve python-snap7 dökümanlarını aşağıya bırakıyorum.

--

--