Aynı Formülü 12 Kez Yazmak: 12'nci Tankta Farkı Bulan Gün
Bir tank için yazdığım PID hesaplama bloğunu 12 tanka kopyala-yapıştır yaptım. 12'nci tankın Kp değeri 0.8 değil 8 olmuş. Bir hatayı düzeltmek için 12 yeri açmak zorunda kalmak ve 'fonksiyon bloğu' kuralını kendi vaka üzerinden anlatıyorum.

Salı, öğleden sonra. 12 tanklı bir ilaçlama hattı. Her tankın ayrı bir PID kontrolü vardı, ayrı bir seviye, ayrı bir deşarj. Ben, ilk tank için bir PID bloğu yazdım, güzel, temiz, çalışıyordu. Sonra 2. tanka geçtiğim an, “bunu kopyala-yapıştır yapayım, tag’leri değiştireyim” dedim. 12 tank, 12 kopya. Her birinde tag’ler farklıydı: T1_seviye, T2_seviye… T12_seviye. PID parametreleri aynıydı: Kp = 0.8, Ti = 30, Td = 0.
Hepsi çalışıyordu. Üç hafta boyunca. Sonra 12’nci tank, bir sabah, “Kp = 8” ile çalışmaya başladı. Neden? Çünkü kopyala-yapıştır yaparken, 12’nci bloğa geçerken 0.8 yazmak yerine 8 yazmıştım. Bir nokta eksik. Ama 12 bloğun 11’i 0.8’di, 12’ncisi 8. Fark, 10 kat.
Bir Nokta Fark, 10 Kat Fark
12’nci tank, Kp = 8 ile çalışınca, kontrol çok sertti. Deşarj vanası, her seferinde tam açılıp tam kapanıyordu, ara ton yoktu. Seviye, salınım yapıyordu. Operatör “abi 12. tank diğerlerinden farklı” dedi. Ben de o an anladım ki, 12 bloğun 11’i aynı değerdeydi, 12’ncisi farklı. Ama neden farklı olduğunu bulmak için 12 bloğu tek tek açmam gerekiyordu. Her bloğu açmak, tag’leri kontrol etmek, parametleri okumak — 12 blok, 45 dakika.
Sonra düşündüm: neden 12 ayrı blok yazdım ki? Neden bir fonksiyon bloğu (FB) yazıp, 12 kez çağırmadım ki? Bir FB yazarsan, Kp, Ti, Td parametrelerini input olarak verirsin. 12 çağırışın her birinde, parametreleri ayrı ayrı ayarlarsın. Ama kod bir kerede yazılır. Bir yerde Kp = 8 yazarsan, 12’nci çağırışın input’una baktığında “abi 8 mi yazmışsın?” der, iki saniyede bulursun. 12 ayrı blokta aramak 45 dakikaydı, FB’nin input’una bakmak iki saniyeydi.
Fonksiyon Bloğu: Bir Yerde Yaz, Her Yerde Kullan
Artık kuralım şu: aynı mantığı üçten fazla kez yazacaksan, onu bir FB’ye (fonksiyon bloğu) veya FC’ye (fonksiyon) koy. Input’ları parametre olarak ver. Output’ları dönüş değerleri olarak al. Ve her çağırışta, input’ları ayrı ayrı ayarla.
12 tank, 12 FB çağırışı:
// Tank 1
#PID_T1(Kp := 0.8, Ti := 30.0, Td := 0.0, SP := T1_set, PV := T1_seviye);
// Tank 2
#PID_T2(Kp := 0.8, Ti := 30.0, Td := 0.0, SP := T2_set, PV := T2_seviye);
...
// Tank 12
#PID_T12(Kp := 0.8, Ti := 30.0, Td := 0.0, SP := T12_set, PV := T12_seviye);
Bir Kp hatası varsa, 12 satırın içinde arama yaparsın. 12 blokta aramaktan çok daha hızlı. Ve daha önemlisi: 12 satırın hepsi aynı formatta. Göz kaydırır, Kp := 0.8 arar, 12’ncisinin Kp := 8 olduğunu iki saniyede görür.
Bir de ek: FB’ye bir “parametre kontrolü” koy. Kp < 0 veya Kp > 10 ise, “parametre aralık dışı” alarmı ver. O iki satır, 45 dakikalık aramayı önler.
12’nci tankın operatörü, o gün hâlâ hatırlıyor: “abi bir noktayı kaçırınca 12’nci tank diğerlerinden ayrı döndü.” O “bir nokta,” masada iki saniyede bulunurdu. Sahada 45 dakika aldı. Fark, kopyala-yapıştır ile FB arasındaki fark.
Bir sonraki yazıda, “PLC ilk turda ne yapar?” diye anlatıyorum. Bir first-scan bayrağı koymadığım için, makinenin her açılışta bir alarm verdiği, 7 saniyelik bir dert.