00 PROFIBUS nedir
PROFIBUS (Process Field Bus) — Siemens, Bosch ve Phoenix Contact öncülüğünde 1987'de geliştirilen, DIN 19245 ve IEC 61158 kapsamındaki açık endüstriyel fieldbus standardı.
Tarihçe ve standartlar
Almanya Federal Araştırma Bakanlığı'nın finanse ettiği PROFIBUS projesi 1987'de başladı. Farklı üreticilerin PLC, sensör ve aktüatörlerinin ortak bir bus üzerinde haberleşmesi hedeflendi. Günümüzde dünya genelinde 60 milyondan fazla node kurulu olup endüstriyel otomasyon alanında en yaygın fieldbus protokollerinden biridir.
| Varyant | Açıklama | Uygulama |
|---|---|---|
| PROFIBUS DP | Decentralized Periphery. RS-485 tabanlı, 12 Mbps. | PLC I/O, servo sürücü, sensör ağları |
| PROFIBUS PA | Process Automation. MBP (Manchester Bus Powered), 31.25 kbps. | Proses ölçüm, IS (intrinsically safe) alan cihazları |
| PROFIBUS FMS | Fieldbus Message Specification. Eski, yerini PROFINET aldı. | Eski fabrika otomasyon sistemleri |
PROFIBUS vs PROFINET
Siemens yeni projeler için PROFINET önermektedir. Ancak kurulu PROFIBUS altyapılarının ömrü uzundur ve PROFIBUS DP hâlâ milyonlarca çalışan sistemde aktif olarak kullanılmaktadır. Mevcut sistemi anlamak PROFINET geçişini de kolaylaştırır.
01 Fiziksel katman (PROFIBUS DP)
PROFIBUS DP, RS-485 tabanlı diferansiyel seri bus kullanır. Mor (violet) renkli 9-pin D-sub konnektörlü özel kablo ile hız-mesafe dengesi sağlar.
Kablo ve konnektör
Hız ve maksimum mesafe tablosu
| Baud rate | Max segment mesafesi | Tipik uygulama |
|---|---|---|
| 9.6 kbps | 1200 m | Uzak sahada yavaş sensörler |
| 19.2 kbps | 1200 m | — |
| 93.75 kbps | 1200 m | — |
| 187.5 kbps | 1000 m | Endüstriyel standart hız |
| 500 kbps | 400 m | Servo sürücü, hızlı I/O |
| 1.5 Mbps | 200 m | — |
| 3 Mbps | 100 m | — |
| 6 Mbps | 100 m | — |
| 12 Mbps | 100 m | Hızlı motion control |
Aktif terminasyon
PROFIBUS DP bus'ının her iki ucundaki konnektörde terminasyon etkinleştirilir. PROFIBUS terminasyon pasif direnç yerine aktif terminasyon devresi (VP − 390Ω − A hattı − 220Ω − B hattı − 390Ω − DGND) kullanır. Bu, fail-safe bias ve terminasyonu tek devre ile sağlar.
VP (+5V)
│
390Ω
│
├──── A hattı (RxD/TxD-N)
│
220Ω
│
├──── B hattı (RxD/TxD-P)
│
390Ω
│
DGND
Her PROFIBUS segmentinde yalnızca iki uç konnektörde terminasyon etkin olmalıdır. Ortadaki konnektörlerde terminasyon kapalı olmalıdır. Yanlış terminasyon refleksiyon ve iletişim hatalarına yol açar.
02 Token Ring protokolü
PROFIBUS fiziksel topolojisi bus (lineer), mantıksal topolojisi ise token ring'dir. Birden fazla master varsa sırayla konuşma hakkı (token) elde ederler.
Token geçişi (token passing)
Aktif istasyonlar (master'lar) arasında token dolaşır. Tokeni elinde bulunduran master istediği slave ile haberleşebilir, sonra tokeni bir sonraki master'a geçirir. Bus arbitrasyonu ihtiyacı yoktur — deterministik zamanlama sağlanır.
Master A (addr 0) ──token──► Master B (addr 2) ──token──► Master A
│ │
▼ ▼
Slave 5, 6, 7 Slave 10, 11
GAP list: Masters ring = [0, 2]
Slave listesi: DP master her slave'le veri değişimi yapar.
FDL katmanı (Fieldbus Data Link)
PROFIBUS veri bağlantı katmanı (Layer 2) FDL olarak adlandırılır. FDL üç mesaj tipi tanımlar: SD1 (8 byte sabit), SD2 (değişken uzunluk), SD3 (5 byte sabit) ve token frame.
| Frame tipi | SD byte | Kullanım |
|---|---|---|
| SD1 | 0x10 | Data Exchange, kısa sabit frame |
| SD2 | 0x68 | Değişken uzunluk — standart DP mesajı |
| SD3 | 0xA2 | 5 byte sabit uzunluk |
| Token | 0xDC | Master'dan master'a token transferi |
| Short ACK | 0xE5 | Slave pozitif yanıtı (1 byte) |
İstasyon adresleme
Her PROFIBUS node'u 0-126 arasında benzersiz bir adrese sahiptir. Adres 127 broadcast içindir. Master adresler genel olarak düşük (0, 1, 2...), slave adresler ise daha yüksek değerlerde olur. Adres ataması DIP switch, yazılım veya GSD üzerinden yapılır.
03 PROFIBUS DP mesaj tipleri
DP-V0 siklik veri değişiminden DP-V2'nin isokron moduna — PROFIBUS DP protokol versiyonları ve servis tipleri.
DP versiyonları
| Versiyon | Özellikler |
|---|---|
| DP-V0 | Temel siklik veri değişimi, parametrelendirme ve konfigurasyon, diagnostics. |
| DP-V1 | Asiklik veri okuma/yazma (DP-V1 Class 1/2), alarm mekanizması, upload/download. |
| DP-V2 | İsokron mod (eş zamanlı slave tazeleme), broadcast Data Exchange, slave-slave iletişimi. |
Temel servis tipleri
Siklik DP veri değişimi
DP Master DP Slave (addr 5)
───────────── ─────────────────
1. Set_Prm (parametrelendirme) →
← Short ACK (0xE5)
2. Chk_Cfg (konfigurasyon) →
← Short ACK
3. Get_Cfg (doğrulama) →
← Cfg data
4. Data_Exchange (siklik) ←──► (her siklus)
[çıkış verisi] →
← [giriş verisi]
5. Slave_Diag (tanılama) → (periyodik)
← Diag data
DP-V1 asiklik okuma/yazma
/* DP-V1 MS1 (Class 1 asiklik) okuma isteği: */
/* [SD2][Uzunluk][Uzunluk][SD2][DA][SA][FC][DSAP][SSAP][FCV_CNT] */
/* [Function=READ][Slot][Index][Uzunluk][FCS][ED] */
/* ↑ ↑ */
/* │ └── parametre index (0-255)
/* └──────── slot numarası (0=cihaz, 1+= modül)
04 GSD dosyası
GSD (General Station Description) — PROFIBUS slave cihazının özelliklerini tanımlayan yapılandırma dosyası. ASCII metin formatında, .gsd uzantılı.
GSD yapısı
; Siemens ET200S distributed I/O GSD (kısaltılmış)
#Profibus_DP
GSD_Revision = 5
Vendor_Name = "Siemens"
Model_Name = "IM151-1 STANDARD"
Revision = "V5.2"
Ident_Number = 0x0971 ; üretici tarafından atanan benzersiz ID
Protocol_Ident = 0
Station_Type = 0 ; 0=DP slave
FMS_supp = 0
Hardware_Release = "V5"
Software_Release = "V5.2"
; Desteklenen baud rate'ler:
9.6_supp = 1
19.2_supp = 1
93.75_supp = 1
187.5_supp = 1
500_supp = 1
1.5M_supp = 1
3M_supp = 1
6M_supp = 1
12M_supp = 1
Max_Diag_Data_Len = 58
Max_User_Prm_Data_Len = 128
Max_Input_Len = 244 ; max giriş byte sayısı
Max_Output_Len = 244 ; max çıkış byte sayısı
Max_Data_Len = 488
; Modüller:
Module = "2DI" 0x11 ; 2 dijital giriş modülü
EndModule
Module = "2DO" 0x21 ; 2 dijital çıkış modülü
EndModule
Module = "2AI" 0x51 0x84 0x08 0x05 ; 2 analog giriş (16-bit)
EndModule
GSD dosyası kullanımı
Python ile GSD parse
import re
def parse_gsd(filepath: str) -> dict:
"""Temel GSD anahtar-değer çiftlerini ayrıştır."""
props = {}
modules = []
current_module = None
with open(filepath, 'r', encoding='latin-1') as f:
for line in f:
line = line.strip()
if line.startswith(';') or not line:
continue
if line.startswith('Module'):
m = re.match(r'Module\s*=\s*"([^"]+)"\s+(.*)', line)
if m:
current_module = {'name': m.group(1), 'cfg': m.group(2)}
elif line == 'EndModule' and current_module:
modules.append(current_module)
current_module = None
else:
m = re.match(r'(\w+)\s*=\s*(.*)', line)
if m:
props[m.group(1)] = m.group(2).strip('"')
props['modules'] = modules
return props
gsd = parse_gsd('ET200S.gsd')
print('Cihaz:', gsd.get('Model_Name'))
print('Ident ID:', gsd.get('Ident_Number'))
print('Modüller:', [m['name'] for m in gsd['modules']])
05 Linux PROFIBUS stack
Linux üzerinde PROFIBUS DP master ve slave işlevselliği için açık kaynak yazılım araçları ve USB adaptörler.
linprofibus açık kaynak stack
# linprofibus kaynak kodu (eski ama referans değeri yüksek):
git clone https://github.com/mbuesch/linprofibus.git
cd linprofibus
pip install -e .
# Alternatif: pyprofibus (Python, daha aktif geliştirme):
pip install pyprofibus
pyprofibus ile DP master
import pyprofibus
import pyprofibus.phy_serial as phy_serial
# GSD dosyasından slave yapılandırması:
gsd = pyprofibus.GsdInterp.fromFile("ET200S.gsd")
slaveDesc = pyprofibus.DpSlaveDesc(identNumber=gsd.getIdentNumber(),
slaveAddr=5)
# Slave parametrelendirme verisi (GSD'den üret):
slaveDesc.setCfgDataElements(gsd.getCfgDataElements())
slaveDesc.setUserPrmData(gsd.getUserPrmData(enableBitInput=True,
enableBitOutput=True))
slaveDesc.setWatchdog(timeoutMs=500)
# PHY: USB-RS485 adaptör üzerinden PROFIBUS
phy = phy_serial.CpPhy(port="/dev/ttyUSB0", debug=False)
# DP master oluştur (adres 0)
dp = pyprofibus.DPM1(phy=phy, masterAddr=0, debug=True)
dp.addSlave(slaveDesc)
dp.initialize()
try:
while True:
# Slave 5'e çıkış ver, girişini oku:
outData = {5: bytes([0xFF, 0x00])} # Tüm dijital çıkışlar HIGH
inData = dp.run(outData)
if inData and 5 in inData:
inputs = inData[5]
print(f'Slave 5 girişleri: {inputs.hex()}')
except KeyboardInterrupt:
dp.destroy()
PROFIBUS USB adaptörler
# Bus üzerindeki aktif node'ları tara:
python -m pyprofibus.tools.profiscan --port /dev/ttyUSB0 --baud 187500
# Slave diagnostics oku:
python -m pyprofibus.tools.profidiag --port /dev/ttyUSB0 --slave 5
06 SIMATIC S7 ile entegrasyon
Siemens SIMATIC S7 PLC sistemlerinde PROFIBUS DP yapılandırması — TIA Portal üzerinden DP master, slave ve I/O haritalama.
TIA Portal PROFIBUS yapılandırması
1. Yeni proje oluştur:
File → New Project → İsim gir → Create
2. CPU ekle (örn. S7-315-2DP):
Add new device → SIMATIC S7-300 → CPU 315-2 DP
3. DP master yapılandırması:
Device view → CPU → MPI/DP interface → Properties
Operating mode: DP master
Baud rate: 187.5 kbps
Bus address: 0
4. Slave ekle:
Network view → sağ tık → Add device from GSD
GSD dosyasını seç → DP Slave olarak ekle
Slave adresini ata: 5
5. I/O adresleri:
Device view → Slave → Giriş/çıkış adres aralıklarını ayarla
Örn: Input: IB100-IB101 (slave 5 dijital girişler)
Output: QB100-QB101 (slave 5 dijital çıkışlar)
S7 PLC programında PROFIBUS I/O erişimi
// TIA Portal SCL kodu — slave 5 I/O erişimi
PROGRAM PLC_PRG
VAR
conveyor_run : BOOL;
sensor_active : BOOL;
output_byte : BYTE;
END_VAR
// PROFIBUS slave 5 girişini oku (IB100)
sensor_active := IB100.0; // Bit 0: proximity sensor
// Konveyör mantığı
IF sensor_active THEN
conveyor_run := FALSE; // Sensör aktif → durduR
output_byte := 16#00;
ELSE
conveyor_run := TRUE;
output_byte := 16#FF; // Tüm çıkışlar HIGH
END_IF;
// Slave 5 çıkışına yaz (QB100)
QB100 := output_byte;
Diagnostics okuma
import snap7
from snap7.util import *
# snap7 ile S7 PLC'ye bağlan:
plc = snap7.client.Client()
plc.connect('192.168.1.10', 0, 1) # IP, rack, slot
# DB50'den slave diagnostics verisi oku (önceden DB'ye yaz):
# (PLC programında: SFB54 "RALRM" ile alarm okunur)
diag_data = plc.db_read(50, 0, 20)
if get_bool(diag_data, 0, 0):
print('Slave 5: Hata var!')
print('Diagnostics:', diag_data.hex())
plc.disconnect()
07 PROFIBUS PA
PROFIBUS PA (Process Automation) — intrinsik güvenlik gerektiren patlayıcı ortamlar için proses enstrümantasyonu standardı. 31.25 kbps, MBP sinyal katmanı.
PROFIBUS PA fiziksel katmanı (MBP)
PA, RS-485 yerine MBP (Manchester Bus Powered) sinyal katmanını kullanır. MBP kablosu üzerinden hem veri iletilir hem de alan cihazlarına güç sağlanır. Bu özellik patlayıcı bölgelerde (Ex zone 0/1/2) kablo azaltma ve güvenlik avantajı sağlar.
| Özellik | PROFIBUS DP | PROFIBUS PA |
|---|---|---|
| Sinyal katmanı | RS-485 | MBP (IEC 61158-2) |
| Baud rate | 9.6k – 12M bps | 31.25 kbps (sabit) |
| Kablo gücü | Hayır | Evet (9–32 VDC, 10–500 mA) |
| Intrinsic safety | Hayır (sadece izolasyon) | Evet (Ex ia/ib) |
| Max cihaz/segment | 32 (std UL) | 10 (Ex)/32 (non-Ex) |
| Max segment mesafe | Hıza bağlı | 1900 m |
DP/PA segment coupler
PROFIBUS PA segmenti, yüksek hızlı PROFIBUS DP ağına bir segment coupler (bağlantı köprüsü) aracılığıyla bağlanır. Coupler, DP hızını (örn. 1.5 Mbps) PA hızına (31.25 kbps) dönüştürür ve PA cihazlarına güç sağlar.
PROFIBUS DP (1.5 Mbps)
S7-315 ──────────────── DP/PA Coupler ──────── PA Segment
(Pepperl+Fuchs ├── Pressure TX
SK2 veya ├── Flow TX
Siemens IM157) ├── Temperature TX
└── Level TX
PA alan cihazları
08 Pratik: Linux DP master ile ET200S haberleşmesi
Linux gömülü sistem üzerinde pyprofibus ile Siemens ET200S distributed I/O slave haberleşmesi, konveyör belt sensör/aktüatör ağı kurulumu ve PROFINET göç notu.
Bağlantı şeması
Linux PC / Embedded Board ET200S (addr 5)
───────────────────── ────────────────
/dev/ttyUSB0 (USB-RS485)
│ ┌──────────────────┐
└── A (pin 3, DB9) ──────────────► │ A (RxD/TxD-N) │
B (pin 8, DB9) ──────────────► │ B (RxD/TxD-P) │
[terminasyon kapalı] │ [terminasyon açık]│
└──────────────────┘
[bus ucunda]:
Bus sonu konnektörü → terminasyon switch ON
Baud rate: 187.5 kbps
Konveyör belt I/O ağı
import pyprofibus
import pyprofibus.phy_serial as phy_serial
import time
# Konfigürasyon
SLAVE_ADDR = 5
BAUD_RATE = 187500
PORT = "/dev/ttyUSB0"
GSD_FILE = "ET200S.gsd"
# Kurulum
gsd = pyprofibus.GsdInterp.fromFile(GSD_FILE)
slaveCfg = pyprofibus.DpSlaveDesc(identNumber=gsd.getIdentNumber(),
slaveAddr=SLAVE_ADDR)
slaveCfg.setCfgDataElements(gsd.getCfgDataElements())
slaveCfg.setUserPrmData(gsd.getUserPrmData())
slaveCfg.setWatchdog(timeoutMs=500)
phy = phy_serial.CpPhy(port=PORT, debug=False)
dp = pyprofibus.DPM1(phy=phy, masterAddr=0, debug=False)
dp.addSlave(slaveCfg)
dp.initialize()
print("PROFIBUS DP başlatıldı. Konveyör kontrol başlıyor...")
try:
conveyor_on = True
while True:
# Çıkış: konveyör motoru bit0, alarm ışığı bit1
out_byte = 0x01 if conveyor_on else 0x00
out_byte |= 0x02 if not conveyor_on else 0x00
in_data = dp.run({SLAVE_ADDR: bytes([out_byte, 0x00])})
if in_data and SLAVE_ADDR in in_data:
inputs = in_data[SLAVE_ADDR]
stop_sensor = bool(inputs[0] & 0x01) # proximity
e_stop = bool(inputs[0] & 0x02) # acil stop
jam_sensor = bool(inputs[0] & 0x04) # sıkışma
if e_stop or jam_sensor:
conveyor_on = False
print(f'DURDURULDU: acil={e_stop} sıkışma={jam_sensor}')
elif not stop_sensor:
conveyor_on = True
time.sleep(0.01) # 100 Hz kontrol döngüsü
except KeyboardInterrupt:
dp.destroy()
print("Durduruldu.")
PROFIBUS → PROFINET geçiş notu
| Adım | Aksiyon |
|---|---|
| Donanım | PROFIBUS DP slave modüllerini PROFINET uyumlu modüllerle değiştir (ET200SP/ET200MP). DP/PN coupler ile geçiş dönemi çözümü de mümkündür. |
| Kablolama | Standart Cat5e/Cat6 Ethernet kablosu yeterlidir. Endüstriyel RJ45 konnektörler (IE FC) kullan. |
| PLC | S7-300 → S7-1500 geçişi veya mevcut S7-300 üzerine CP 343-1 Ethernet modülü. |
| Yazılım | Step7 projesi TIA Portal'a SIMATIC Migration Tool ile aktarılır. PROFIBUS I/O adres atamaları korunur. |
| Performans | PROFINET IRT modu <1ms deterministik cycle süresi — yüksek hızlı motion control için PROFIBUS'tan üstün. |