PLC Açılınca Neden Alarm Verdi? İlk Tur Bayrağı (First-Scan) Koymadım
Makine her açılışta 7 saniye alarm verdi, kimse nedenini bilmiyordu. Bir 'ilk tur bayrağı' (first-scan) koymadığım için, sıfırlanmamış bir sayacın açılışta 'hata' olarak görünmesi ve bir R_TRIG ile tüm değişkenleri ilk turda sıfırlamak — kendi vaka üzerinden.

Çarşamba, sabah dokuz. Makine açıldı ve alarm verdi. “Hata: besleme gerilimi düşük.” Besleme gerilimi normaldi, 24.1 V. Ama alarm, “düşük” diyordu. Operatör “abi her açılışta böyle oluyor, yedi saniye alarm, sonra kendiliğinden geçiyor” dedi. Yedi saniye. Kimse nedenini bilmiyordu. Ben de bilmiyordum, çünkü programı yazan bendim ve ben, neden açılışta alarm verdiğini anlamıyordum.
Açılışta Sıfırlanmamış Bir Sayac
Programda bir “besleme kontrol” bloğu vardı. Besleme gerilimini okuyor, 20 V’un altına düşerse “düşük besleme” alarmı veriyordu. Mantık şu:
if (besleme_v < 20.0) alarm_dusuk_besleme := true;
Problem neydi? besleme_v değişkeni, PLC açıldığında sıfır başlıyordu. Hiçbir şey onu, ilk okuma gelene kadar, gerçek değere çekmiyordu. Yani PLC açıldığı anda, besleme_v = 0.0 idi. 0.0 < 20.0 → alarm. Gerçek besleme değeri, sensörün ilk okumasıyla, yaklaşık yedi saniye sonra geliyordu. O yedi saniye boyunca, besleme_v sıfır kalıyordu, alarm da.
Sonra, ilk gerçek okuma geldi, besleme_v = 24.1 oldu, alarm kendiliğinden geçti. Her açılışta, yedi saniyelik “yanlış alarm.” Kimse bilmiyordu çünkü “arada geçiyor” diye kimse bakmıyordu.
İlk Tur Bayrağı: Her Değişkeni İlk Scan’da Sıfırla
Çözüm basit. PLC’nin ilk scan’ı (ilk tur) ile diğer scan’ları farklı olmak zorunda. İlk turda, tüm “güvenlik” değişkenlerini, “beklenen” başlangıç değerlerine çekersin. İkinci turdan itibaren, normal çalışmaya başlarsın.
Bunu yapmak için bir first-scan bayrağı kullanırsın. Çoğu PLC’de bu, bir R_TRIG (yükselen kenar tetikleyici) ile yapılır. R_TRIG, bir sinyalin 0’dan 1’e geçtiği an, bir scan boyunca ON olur, sonra 0’a döner.
// İlk turda bir kez çalışsın
#FS_R_TRIG(CLK := #makine_acik);
#ilk_tur := #FS_R_TRIG.Q;
// İlk turda: tüm değişkenleri güvenli başlangıç değerlerine çek
if (#ilk_tur) then
#besleme_v := 24.0; // "bilinmiyor" yerine "normal kabul et"
#alarm_dusuk_besleme := false;
#adim := 0;
#hata_sayaci := 0;
end if;
// Normal çalışma (ikinci turdan itibaren)
if (#besleme_v < 20.0) then
#alarm_dusuk_besleme := true;
end if;
#ilk_tur bayrağı, yalnızca bir scan boyunca ON. O scan’da, besleme_v’yi 24.0’a çekiyorum — “henüz okuma gelmedi, normal kabul et” anlamında. Alarmı da o turda temizliyorum. İkinci turdan itibaren, gerçek okumalarla çalışıyorum. Yedi saniyelik yanlış alarm, gitti.
Bir R_TRIG, Tüm Değişkenleri İlk Turda Sıfırlar
Kural şu: PLC programı, açılış anını ve normal çalışmayı ayırt etmeli. Bunu en temiz yol, bir R_TRIG ile ilk_tur bayrağı üretip, o bayrak ON olduğu an, tüm değişkenleri güvenli başlangıç değerlerine çekmek.
Bir de ek: first-scan’ı tek bir yerde topla. Her network’ün başında ayrı ayrı if (#ilk_tur) yazma. Bir OB1 ya da MAIN içinde, programın en üstünde, ilk tur bloğunu topla. Okuyan kimse — belki benim, belki biri — “açılışta ne oluyor?” diye sorduğunda, tek bir yere bakacak.
O çarşamba sabahı, o yedi saniyelik alarm, bir R_TRIG ile gitti. Operatör “abi açılışta alarm yok artık” dedi. Ben de o an anladım ki, makine açılırken, benim programımın “ilk nefes”i yoktu. Bir first-scan bayrağı, o “ilk nefesi” verir.
Bu, “sahada öğrendiğim programlama ipuçları” serisinin beşinci halkasıydı. Bir sonraki seride, başka bir açıdan bakacağım: “HMI’da bir sayfa, neden açılırken bir anlık ‘eski değer’ gösteriyor?”