Watchdog 500ms: Sonsuz Döngü Hat Durdurdu
Kocaeli'de bir S7-1500'ün watchdog'ı 500ms'de tetiklendi. Program sonsuz döngüye girmiş, hat durmuş. Döngüyü bulmak 2 saat sürdü, çünkü 'WHILE' değil, 'FOR' içindeki bir karşılaştırma hatasıydı.

Perşembe, 14:15. Kocaeli, bir boya hattı. S7-1500 CPU 1515-2 PN. Hat durmuş, HMI’de “CPU STOP” yazıyor. Operatör: “Bir anda durdu, 3 gündür böyle yapıyor.”
Watchdog Ne Zaman Tetiklenir?
S7-1500’de watchdog timer, programın bir turda (scan cycle) belirlenen süreyi aşması durumunda CPU’yu STOP’a alır. Varsayılan 500ms. Yani programın bir turu 500ms’den uzun sürerse, CPU kendini durdurur.
Bu bir hata değil, koruma. Çünkü 500ms’den uzun süren bir tur, gerçek zamanlı kontrol için kabul edilemez. Motor sürücüsü 500ms boyunca komut alamazsa, proses kontrolsüz kalır.
Döngüyü Bulmak
CPU’yu START’a aldım. 47 saniye sonra tekrar STOP. Watchdog.
TIA Portal’da “Cycle Time” analizine baktım. Son turda en uzun süren blok: FB_BoyaKontrol, 487ms. Normalde 12ms.
FB_BoyaKontrol’ü açtım. İçinde bir FOR döngüsü var:
FOR #i := 0 TO #maxIter
IF #buffer[#i] > #threshold THEN
#count := #count + 1;
END_IF;
END_FOR;
#maxIter bir INT değişken. Normalde 1000. Ama o gün 14:12’de bir operatör HMI’den “buffer boyutu” parametresini değiştirmiş. 1000 yerine -1 yazmış.
FOR #i := 0 TO -1 — S7-1500’de bu döngü hiç çalışmaz, çünkü başlangıç bitişten büyük. Yani sorun bu değil.
Asıl sorun: #maxIter bir INT. Operatör HMI’de 1000 yazdı, sonra silip -1 yazdı. Ama HMI’deki alan UINT olarak tanımlı. -1 bir UINT’e yazılınca 65535 olur.
FOR #i := 0 TO 65535 — 65.536 iterasyon. Her iterasyonda bir IF kontrolü, bir bellek erişimi. 1515-2’de bu yaklaşık 480ms. Watchdog 500ms. Tam sınıra denk geldi.
2 Saat Nereye Gitti?
- 20 dk: CPU’yu START/STOP etme, “belki geçici” umudu.
- 30 dk: Cycle Time analizi,
FB_BoyaKontrol’ü bulma. - 40 dk:
FORdöngüsünü inceleme,#maxIter’in değerini kontrol etme. - 20 dk: HMI’deki alanın
UINTolduğunu fark etme, operatörle konuşma. - 10 dk:
#maxIter’ıINT’e çevirme, HMI’de minimum 0, maksimum 5000 kısıtı ekleme. - 10 dk: Test. 2 saat boyunca hat çalıştı, watchdog tetiklenmedi.
HMI Parametre Alanına Kısıt Koymak
Bu olaydan sonra tüm HMI parametre alanlarına minimum/maximum kısıtı ekledik. Operatör artık -1 yazamaz, 999999 yazamaz. Alan, kabul edilebilir aralığın dışına çıkarsa kırmızı yanar ve “Geçersiz değer” mesajı gösterir.
Bu küçük bir değişiklik. Ama 2 saatlik hat duruşunu önler.
Watchdog Süresini Artırmak Çözüm mü?
500ms → 2000ms yaparsan, sonsuz döngü 2 saniye boyunca çalışır. Bu 2 saniyede motor sürücüsü 400 komut ıskalar. Boya hattında bu, 2 metrelik bir boya bandının kontrolsüz akması demek.
Watchdog süresini artırmak, sorunu gizler. Çözüm, döngünün neden 480ms sürdüğünü bulmak ve #maxIter’ın 65535 olmasını engellemek.
Bir Daha Olmasın
FB_BoyaKontrol’e bir guard ekledim:
IF #maxIter > 10000 THEN
#maxIter := 10000;
#errMaxIter := TRUE;
END_IF;
Aşırı değer gelirse, 10000’e sabitler ve bir alarm üretir. Watchdog tetiklenmeden önce operatör uyarı alır.