Aynı Analog Girişini İki Network'te Okudum, İki Değer Gördüm
Aynı analog girişini iki ayrı network'te okudum ve iki farklı değer gördüm. Bir analog girişin, bir scan içinde birden fazla okunmasının neden 'tutarlı' olmayabileceğini, ve değeri bir ara değişkende bir kez okuyup her yerde ondan kullanma kuralını kendi vaka üzerinden anlatıyorum.

Pazartesi, sabahın altısı. Bir sıcaklık girişimiz vardı; aynı giriş, iki network’te okunuyordu. Bir network’te “ısıtıcı aç,” diğeri “ısıtıcı kapat” kararını veriyordu. Ama iki network, aynı girişten farklı değer görüyordu. Birinde 78.4, diğerinde 78.6. Aralarında 0.2 derece fark, ama birisi açma eşiğinin üstünde, diğeri altındaydı. Isıtıcı, bir scan’da açıp kapandı, ertesi scan’da tersine. Titriyordu. O pazartesi, “aynı girişi iki kez okuma”nın bir tutarlılık hatası olduğunu öğrendim.
Aynı Girişi İki Kez Okumak: Tutarlılık Neden Bozulur?
Programda iki network vardı:
// Network 1: ısıtıcı aç
if (IW64 > 78.5) #Isitici := true;
// Network 2: ısıtıcı kapat
if (IW64 < 78.5) #Isitici := false;
İkisi de IW64’ü (aynı analog giriş) okuyordu. Ama bir analog giriş, scan sırasında değişebilir: PLC, girişleri bir kez okur ve giriş imleci’ni (input image) günceller. Ama sen, aynı tag’i iki network’te okuyorsan, giriş imlecinin o anki değerini iki kez alıyorsun. Eğer iki okuma, bir giriş güncellemesinin arasına denk geldiyse (örneğin, bir background güncelleme veya bir RD_INPUT çağrısı), iki değer farklı olabilir.
Sonuç: IW64 bir scan’da 78.4 (Network 1, altı) ve 78.6 (Network 2, üstü) görülebilir. #Isitici önce true, sonra false yazılır. Isıtıcı, titrer.
Tek Okuma, Ara Değişken
Kural şu: bir analog girişi, bir scan’da bir kez oku; sonucu bir ara değişkende tut; her yerde o ara değişkenden kullan.
// Tek okuma, başta
#Sicaklik := IW64; // bir kez oku, ara değişkene yaz
// Network 1: ısıtıcı aç
if (#Sicaklik > 78.5) #Isitici := true;
// Network 2: ısıtıcı kapat
if (#Sicaklik < 78.5) #Isitici := false;
Artık iki network, aynı #Sicaklik değerini okuyor. İki okuma, bir okumaya indirgendi. Tutarlılık, geri geldi. Isıtıcı, titremiyor.
Bu kural, tüm analog girişler için geçerli: basınç, sıcaklık, akış, seviye. Bir analog tag’i, bir scan’da birden fazla yerde doğrudan okuyorsan, bir #ara_degisken := IWxx; satırıyla başla, gerisini o ara değişkenden yap.
Bir de ek: bu, performans değil, tutarlılık kuralıdır. İki okuma, farklı değer verirse, mantığın belirsiz olur. Tek okuma, mantığı deterministik yapar.
O pazartesi, o “titreyen ısıtıcı,” bir #Sicaklik := IW64; satırı ile gitti. Artık ısıtıcı, kararlı. Operatör “abi artık ısıtıcı, ısınıyor, sönüyor, sakin” dedi. Ben de o an anladım ki, aynı girişi iki kez okumak, iki gözlük takmak gibidir: biri 78.4 görür, diğeri 78.6. Tek gözlük, tek değer.
Bu seri burada bir durak yapıyor. On yazı, on saha hatası, on kural: bit maske, INT taşması, sıfıra bölme, INT/REAL cast, zamanlayıcı reset, R_TRIG/F_TRIG, çoklu yazma, SR latch öncelik, iki sensör yarış, analog tek okuma. Bir sonraki seride, yeni on hata daha var. Ama bu on, artık masada yakalanacak; sahada değil.