İki Sensör Aynı Adımı Ayarlıyordu, Hangisinin Kazandığını Bilmiyordum
Bir 'hazır' sinyalini hem basınç sensörü hem seviye sensörü ayarlıyordu; iki kaynak, aynı çıkışı sürüyor ve hangisinin kazandığını bilmiyordum. İki farklı kaynağın aynı tag'i sürmesinin neden bir yarış durumu (race condition) olduğunu, ve 'tek yazıcı + öncelik' ile nasıl çözdüğümü kendi vaka üzerinden anlatıyorum.

Cuma, sabah. Bir “hazır” (ready) sinyali vardı; makine, “hazır” olunca bir sonraki adama geçiyordu. Ama “hazır”ı iki şey belirliyordu: basınç sensörü ve seviye sensörü. Bazen basınç “hazır” derken seviye “hazır değil” diyordu. İkisi de aynı hazir tag’ine yazıyordu. Hangisinin kazandığını, ben bile bilmiyordum. O cuma, iki kaynağın aynı tag’i sürmesinin bir yarış durumu (race condition) olduğunu öğrendim.
İki Kaynak, Bir Tag: Son Yazan Kazanır
Programda iki network vardı:
// Network 1: basınç
if (#basinc_gevse) #hazir := true;
// Network 2: seviye
if (#seviye_dolu) #hazir := true;
if (not #seviye_dolu) #hazir := false;
İkisi de #hazir’e yazıyordu. Basınç “gevşek” (hazır) ama seviye “dolu değil” (hazır değil) ise, bir scan’da: Network 1 true yazdı, Network 2 false yazdı. Son yazan (Network 2) kazandı → false. Ama sıralama değişseydi, ya da seviye o scan’da “dolu” olsaydı, true kazanırdı. Sonuç, hangi network’ün o scan’da son yazdığına bağlıydı.
Bu, bir yarıştır: iki kaynak, aynı kaynak verisiyle, aynı tag için yarışır. Kazanan, sıralama ve zamanlama ile belirlenir — senin “hazır ne demek?” tanımınla değil.
Tek Yazıcı, Tek Tanım
Kural şu: bir tag’i, bir scan’da yalnızca bir yerden yaz. “Hazır”ın tanımı tek olmalı: “basınç gevşek VE seviye dolu.” O tanımı, tek bir network’te yaz:
// Tek yazıcı: 'hazır'ın tanımı
#hazir := (#basinc_gevse and #seviye_dolu);
Artık iki kaynak, #hazir’e yazmıyor; #hazir’i okuyan tek bir satır, iki sensörü okuyup mantıksal AND ile birleştiriyor. İki sensör, giriş (input); #hazir, tek bir çıkış. Yarış, yok.
Ama bazen iki kaynak, farklı şeyleri ayarlar: biri “hazır,” diğeri “hazır değil” (reset). O zaman, öncelik gerekir. Hangisinin kazandığını, açıkça kodla:
// 'hazır değil' (reset) öncelikli: güvenlik
if (not #seviye_dolu) then
#hazir := false;
elsif (#basinc_gevse and #seviye_dolu) then
#hazir := true;
end if;
Kural: Girişleri Ayır, Çıkışı Tek Yaz
Artık kuralım şu: iki (ya da daha fazla) sensör, aynı mantıksal sonucu belirliyorsa, onları giriş olarak al, sonucu tek bir yazıcı’da birleştir. Sensörler, kaynak; sonuç, tek yazıcı. İki sensör, aynı tag’e yazarsa, yarış doğar; okunursa, tanım doğar.
Bir de ek: iki kaynak zıt şeyleri ayarlıyorsa (biri set, diğeri reset), önceliği kodla. “Hangisi kazanır?” sorusunun cevabı, bir if / elsif zincirinde, en üstte olan koşulda durur. Güvenli taraf, en üstte.
O cuma, o “bilmediğim kazanan,” tek bir satırla gitti: #hazir := (#basinc_gevse and #seviye_dolu); Operatör “abi artık hazır, gerçekten hazır” dedi. Ben de o an anladım ki, iki yazıcı, bir “kazanan” değil bir kumar üretmişti. Tek yazıcı, kumarı, tanıma çevirir.
Bir sonraki yazıda, “aynı analog girişini iki network’te okudum, iki farklı değer gördüm” diye anlatıyorum. 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ı.