Yazılımla TONOF Timer yapma

T1.Q ve T2.Q paralel bağlanırsa bu noktadan istediğiniz çıkışı elde edersiniz gibi görünüyor(T2.IN := T1.Q yine). İkinci aralıkta IN sinyalinin düşüşü ne kadar bir sürelik orası önemli tabi, T2 süresinden kısa ise sorun yok, ama T2'den büyük ise çıkışı kesecek.
Bu şekilde de olmuyor, ayrıca düşüş süresi T(anlık) < T2 ve T(anlık) < T1 şartı var.
T1 ve T2 ms olarak nedir?
Filtre süreleri yani T1 ve T2 süreleri değişken olabilir. Yani T1>= T2 veya T1 =< T2 olabilir.
1733807157013.png

Geniş bir zamanda akümülatör olayına bakacağım.
 
Son düzenleme:
Kodu library den aldım, bu timer TON_Time:= 0 girilirse TOF modunda çalışıyor veya TOF_Time := 0 girilirse TON modunda çalışıyor. İkisinde de bir değer varsa TONOF modu devreye giriyor.

Kod:
FUNCTION_BLOCK TONOF
VAR_INPUT
    Input:BOOL;  // Giriş Sİnyali
    TON_Time, TOF_Time :TIME; // TON TOF zamanları örneğin T#1s
END_VAR

VAR_OUTPUT
   Q :BOOL; // Çıkış
END_VAR

VAR
   TON_Timer :TON;
   old, mode   : BOOL;
END_VAR

Kod:
    IF Input  XOR old THEN
        TON_Timer(IN:=FALSE , PT:= SEL(Input, TOF_Time, TON_Time ));
        mode     := Input;
        old      := Input;
    END_IF;
    TON_Timer( IN := TRUE);
    IF TON_Timer.Q THEN
        Q := mode;
    END_IF;
 
Son düzenleme:
ladder çözümüm ektedir.
isteneni karşılamıyorsa üzerinde çalışmak isterim.
 

Ekli dosyalar

ladder çözümüm ektedir.
isteneni karşılamıyorsa üzerinde çalışmak isterim.
TON ve TOF süreleri 5sn, çıkış aktif iken giriş sinyalini kesip verdiğinizde(1sn kadar) çıkış T süre sonra tekrar 0-1 oluyor. Zaten ilk mesajımda bunun olmadığını söylemiştim gözden kaçtı herhalde. Amaç anlık sinyal düşme veya çıkmalarını filtrelemek.
1734413775981.png
 
Son düzenleme:
Bit tane Timer oluşturup;IN girişinin her degişiminde timer degerini bir registere yazıp,bir flag ı set edip ardından timer'ı resetleyeceksiniz.
flag set ise registerdeki degerin T1 ve T2 den büyükmü diye kontrolünü saglayacaksınız..Eger küçükse timer'ı tekrar sıfırlayıp,flag'ı resetleyeceksiniz.Yani T1 ve T2 den küçük sinyalleri pas geçmiş olacaksınız.
Bu işleri microişlemci ile yapması kolay ancak plc konusuna fransızım.
 
Kodun TIA portalda SCL diline entegresi, SEL() komutunu yerine yapay zeka bu şekilde çevirdi, test edilmiştir.
1780548510532.webp1780978833876.webp
Kod:
FUNCTION_BLOCK "FB_TON_OFF_Timer"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT
      IN : Bool;   // Sİnyal Girişi
      TON_Time : Time;   // IN = TRUE iken TON Sure
      TOF_Time : Time;   // IN = FALSE iken TOF Sure
   END_VAR

   VAR_OUTPUT
      Q : Bool;
   END_VAR

   VAR
      _TONHelp : TON_TIME;
      _Old : Bool;
      _Mode : Bool;
      stat_SelectedTime : Time;
   END_VAR


BEGIN
    // 1. Giriş sinyalinde bir değişim (Yükselen veya Düşen Kenar) var mı kontrolü
    IF #IN XOR #_Old THEN
 
        // Giriş durumuna göre filtre süresini seçiyoruz
        IF #IN THEN
            #stat_SelectedTime := #TON_Time;  // Sinyal TRUE olduysa TON_Time süresini yükle
        ELSE
            #stat_SelectedTime := #TOF_Time;  // Sinyal FALSE olduysa TOF_Time süresini yükle
        END_IF;
 
        // Zamanlayıcıyı sıfırlamak için IN:=FALSE ile bir kez çağırıyoruz
        #_TONHelp(IN := FALSE,
                  PT := #stat_SelectedTime);
 
        // Durum hafıza değişkenlerini güncelliyoruz
        #_Mode := #IN;
        #_Old := #IN;
    END_IF;
 
    // 2. Zamanlayıcıyı aktif edip zamanı saydırıyoruz
    #_TONHelp(IN := TRUE,
              PT := #stat_SelectedTime);
 
    // 3. Zamanlayıcı hedeflenen süreye ulaştıysa çıkışı yeni moda eşitliyoruz
    IF #_TONHelp.Q THEN
        #Q := #_Mode;
    END_IF;
END_FUNCTION_BLOCK
 
Son düzenleme:

Forum istatistikleri

Konular
133,503
Mesajlar
971,911
Kullanıcılar
459,549
Son üye
jjkjkmk

Yeni konular

Çevrimiçi üyeler

Geri
Üst