Siemens Simatic S7 SCL Programlama Dili

Farkli bir konuda bir ornekle anlatmistim ordaki anlatis sekliyle oldugu gibi buraya koyuyorum. Ümit ediyorumki yardimci olacaktir. Yinede takildiginiz bir nokta olursa sorarsiniz..

For next dongusunde degiskenimiz bir degere atanir ve dongu o degere ulasana kadar devam ettirilir. Dongu bittikten sonra ise degerimiz dongu disinda herhangi bir yerden deger aliyorsa onu alacaktir. Kisaca bir olayin kac defa meydana gelecegini ayarlamak icin kullanilir.
Kullaniminda ise

FOR tanimlanan degisken:= baslangic degeri TO bitis degeri BY artis orani DO
// yapilacak islemler..
;
END_FOR;


Basit bir ornek verecek olursak

Kod:
FUNCTION FC4 : VOID

VAR_INPUT
    d:INT;
END_VAR

VAR
    i: INT;
    j: INT;
END_VAR 

IF d=1 THEN
    FOR i:= 1 TO 20 BY 2 DO  MW30:= 15;
      FOR j:=1 TO 6 BY 1 DO MW40:= 20;
      END_FOR;
    END_FOR;
END_IF;

mw30:= 2;
mw40:=5;      
 
END_FUNCTION



Burda i ve j diye iki degisken tanimladik. ve bu FOR dongusunun baslamasini d degerimizin 1 olmasini bagladik. Eger d deki degerimiz 1 den farkli bir sayiysa ve dongu baslamamissa bizim mw30 = 2 degerini ve mw40 ise 5 degerini alir.

ancak islem donguye girdikten sonra mw30 degeri 15 ve mw40 degeri 20 olur.

yukardaki ornekte her bir i dongusu icin 6 tane j dongusu isletilir ve 20 tane i dongusunden sonra dongu sonlandirilir.Ve dongu bitene kadar dongu sartinda belirledigimiz degerler kalir.

Burda dikkat ettiyseniz i dongusunde artis oranimiz 2 yani dongu basladiktan sonra ikiser olarak devam eder ... 2,4,6 seklinde... eger artis orani belirlemezsek artis orani 1 kabul edilir.

Kusura bakmayin bilgisayarimda MicroWin programi kurulu olmadigi icin program ornegini SCL ile acikladim .. Ancak umarim mantik olarak anlasilmistir. Atladigim bir nokta olmussa tecrubeli arkadaslar tamamlayacaklardir.

Kolay Gelsin.

Asagidaki linkten direk olarak konuyada bakabilirsiniz..

https://www.kontrolkalemi.com/forum/konu/for-next-döngüsü-niçin-kullanılır.20870/
 
Birbirinin aynı işi yapan birden fazla üniteniz olsun (mesela üç tane). Hepsini tek bir plc ile kontrol etmek istiyorsunuz. Bu durumda her üçü için aynı kontrol algoritmasını üç kere yazmak yerine bir kere yazar 1 den 3 e for döngüsü içerisinde her üniteyi tek tek kontrol edersiniz. Portları okuma işlemleri farklı olabilir ama sonuçta her üniteye ait portları bir dizide saklayarak For döngüsü içerisinde rahatlıkla işinizi halledersiniz.

Bir başka örnek te dakikada bir sıcaklık ölçümü yapıyorsunuz diyelim. 1 saatlik ADC değerlerini bir diziye aktarıp bir saat sonunda maksimum, minimum, ortalama, vs. gibi verileri elde etmek için diziyi for döngüsü içerisinde tarar istediğiniz değerleri hesaplatırsınız. Gerçi bunun için başka türlü algoritma da kurabilirsiniz ama diyelim ki bir saat sonunda elde edeceğiniz başka bir değer de hesaplamaya girecek ise o zaman sıcaklık bilgilerini dizide toplayıp for döngüsünde işlemek en kolay yol ...
 
sayın dreamcoder yardımınız gerçekten beni mutlu etti bir örnek görmek gerçekten güzel sizden bir ricada bulunabilirim umarım benim anlayamadığım nokta bu göndermiş olduğunuz örnekte ne yapmak istediğiniz genel olarak tabi yoksa baya açıklamışsınız.
Anladığım kadarı ile bu örneği siz soru soran arkadaş için hazırlamışsınız.ben bu örneğe baktığımda şunu görüyorum d=1 se mw30=2 mw40=5 değerlerini alıyor fakat d 1 harici int bir değer aldığında mw30=15 mw40=20 değerlerini alıyor.
bu nu for kullanmadan mutlaka yapabiliriz fakat plcde for gerçek olarak ne için kullanılır heralde sadece bu soruma cvp bulamıyorum bir türlü:) yardımınız için sağolun...

sayın zer_tr bu mesajı yazdıktan sora okudum tam olar istediğim şeye cevap vermişsiniz teşekkürler

herkese +pop;)
 
Son düzenleme:
Kod:
FUNCTION_BLOCK "FOR"
TITLE = 'FOR Statement'
//For ile ilgili örnekler alıntıdır, inceleyiniz...

VAR
    index1 : INT := 4;
    index2 : INT := 6;
    index3 : INT := 8;
END_VAR

VAR_TEMP
    Runtime_variable : INT;
    i, k             : INT;
END_VAR

BEGIN

//Simple FOR loop
FOR Runtime_variable := 0 TO 7 DO
    M[index1,Runtime_variable] := TRUE;
END_FOR;

FOR Runtime_variable := 0 TO 15 BY 2 DO
    M[index2 + Runtime_variable MOD 8, Runtime_variable] := TRUE;
END_FOR;

MD[index1] := 0;
MD[index2] := 0;

(* Set memory bits *)  (*Memory bitleri setlemeyle alakalı kısım*)
FOR i := 2 TO 23 DO
  M[i DIV 8,i MOD 8] := TRUE;
END_FOR;

MD[index2] := MD[index1];


//Nested FOR loops
(* Reset memory bits *)   (*Reset memory bitleri ile alakalı kısım*)
FOR i := 0 TO 2 DO
  FOR k := 0 TO 7 DO
    IF (k < 2 AND i = 0) THEN CONTINUE; END_IF;
    IF (i = 2 AND k > 5) THEN EXIT; END_IF;
    M[i,K] := FALSE;
  END_FOR;
END_FOR; 
MW[index3]     := INT_TO_WORD(i);
MW[index3 + 2] := INT_TO_WORD(k);


//FOR loop with step width <> 1   (Analog degerleri for ile okuma)
FOR i:=128 TO 142 BY 2 DO
    MW[i] := PIW[i];
END_FOR;


//Abort FOR loops (For döngüsünden çıkmak istediginde ne yapman gerekli onu anlatıyor)
FOR Runtime_variable := 0 TO 15 DO
    M[index2,Runtime_variable] := TRUE;
    IF Runtime_variable = 7 THEN CONTINUE;
        ELSIF Runtime_variable = 8 THEN CONTINUE;
    END_IF;
    IF Runtime_variable = 10 THEN EXIT; END_IF;
    M[index2 + 1,Runtime_variable] := TRUE;
END_FOR;
MD[index2] := 0;

END_FUNCTION_BLOCK
 
Son düzenleme:
arkadaşlar size iki tane sorum daha var

1-) bir butonu push buton olarak kullanmak istesek nasıl yaparız ben şöyle bir yol düşündüm;

if start=true then .... start:=false; // burada ... deyim listesi amacım start
end_if; // butonunun push buton gibi çalıştırmak

ama sorun çıkıyor hep ben bu yöntemi kullandığım zaman plc çalışırken örneğin star i1240 olsun onu aktif olduğunu gösteren led sadece 1 kereliğine girişe start verdiğimde bütün işlemleri yapıyor ve bir daha start ledim işlem gereği sönmesine rağmen sonmüş gibi davranmıyor ve sürekli 1 miş gibi çalışıyor birdaha basmamın veya bırakmam hiç bir şeyi değiştirmiyor.... yardımcı olun heralde bir yerde çok basit bir mantık hatası yapıyorum .... aşağıdaki örnekten daha iyi anlarsınız...


2-) ve tabiki bu konuda çözüm ararken başka bir buhrana düştüğüm ikinci konu pazitif kenar veya negatif kenar tetiklemeli bişi yapmak için scl de nasıl bir yazım gerkir??? şimdiden sağolun....
 

Ekli dosyalar

  • Adsız.jpg
    Adsız.jpg
    25.3 KB · Görüntüleme: 167
Son düzenleme:
Kod:
ORGANIZATION_BLOCK OB1

VAR_TEMP
    // Reserved
    info : ARRAY[0..19] OF BYTE;
    // Temporary Variables
    x:INT;
END_VAR

    // Statement
IF i124.0=true THEN x:=x+1; 
    CASE x OF 
        1:q[124,x]:=true; q[124,x-1]:=false; 
        2:q[124,x]:=true; q[124,x-1]:=false;
        3:q[124,x]:=true; q[124,x-1]:=false;
        4:q[124,x]:=true; q[124,x-1]:=false;
        5:qw124:=0; x:=0;
            ELSE
            qw124:=0; x:=0;
    END_CASE;          
END_IF;
 i124.0:=false;
END_ORGANIZATION_BLOCK

Yukarıdaki kodda i124.0 true old. sürece, x degişkenin aldıgı degere göre (q124.x) ve (q124.x-1) inci bitleri sürekli olarak setlenip resetlenir, sebebi ise x=5 degerini aldıgında x in tekrar sıfırlanmasıdır.

Sorunun ikinci kısmını daha önce örnek kod vermiştim, konu içinde incelersen çıkan kenar algılama ile ilgili.
 
Son düzenleme:
İki sayının OBEB ve OKEK inin PLC ile bulunması

Kod:
FUNCTION_BLOCK FB10
(* İki sayının OBEB ve OKEK inin PLC ile bulunması
   [url]www.kontrolkalemi.com[/url] "elektronikmuh" tarafından programlanmıstır 
   24.07.09                                                        *)

VAR_INPUT
    enb:BOOL;  //Enable girişinin yükselen kenarında sonucu verir!!!    
    a,b:INT;   //OBEB ve OKEK i alınacak sayılar... 
END_VAR

VAR_OUTPUT
    OBEB:INT;
    OKEK:INT;
END_VAR    

VAR
    ax,bx:INT; //OKEK için kullanılan değişkenler
    edge:BOOL;
    an,bn:INT; //OBEB için kullanılan degişkenler
END_VAR

BEGIN    // Burdan başlıyoruz  
ax:=a;
bx:=b;

an:=a;
bn:=b;

(* OBEB HESABI *)
IF enb AND NOT edge   THEN
    WHILE ax<>bx DO
        IF ax > bx    THEN
            ax:=ax-bx;
            ELSE      
            bx:=bx-ax;
        END_IF;        
    END_WHILE;
    OBEB:=ax;
    
(* OKEK HESABI *)
    WHILE an<>bn DO
        IF bn > an   THEN 
            an:=an+a;
            ELSE
            bn:=bn+b;
        END_IF;        
    END_WHILE;
    OKEK:=an;                
END_IF;
edge:=enb;  
END_FUNCTION_BLOCK
 
PLC ile bir tam sayının faktöriyel hesabının yapılması
Kod:
FUNCTION_BLOCK FB10
(* www.kontrolkalemi.com  yazan:"elektronikmuh" *)
VAR_INPUT
    n:INT;  //Faktöriyeli Hesaplanacak sayı
END_VAR
VAR_OUTPUT
    fact:INT;  //Faktöriyel sonucu
END_VAR
VAR
    s:INT;    //Sayac
END_VAR

BEGIN
    fact:=1;
    s   :=1;
    WHILE s<=n DO
        fact:=fact*s;
        s:=s+1;
    END_WHILE;
   
END_FUNCTION_BLOCK
 
PLC ile pisagor teoremini hesaplayalım
Kod:
FUNCTION FC11 : REAL
(* www.kontrolkalemi.com yazan:elektronikmuh
    Dik kenarları a,b olan dik üçgenin hipotenüsünün hesabı*)
VAR_INPUT
    A,B:REAL;
END_VAR

BEGIN
    FC11:=SQRT(A**2+B**2);
END_FUNCTION
 
Son düzenleme:
y=ax2+bx+c ikinci dereceden denklemlerin köklerini(x1,x2) PLC ile bulalım


Kod:
FUNCTION FC12 : VOID
(* www.kontrolkalemi.com yazan:elektronikmuh *)
VAR_INPUT
    a,b,c:INT;

END_VAR

VAR_OUTPUT
    x1,x2:REAL;
    KokKarmasik:BOOL;
END_VAR
VAR_TEMP
    Delta:INT;
END_VAR       

BEGIN
Delta:=b*b-4*a*c;
     IF Delta >0        THEN
        x1:=(-b-SQRT(Delta))/(2*a);
        x2:=(-b+SQRT(Delta))/(2*a);
        KokKarmasik:=FALSE;
        ELSIF Delta=0   THEN
            x1:=-b/(2*a);
            KokKarmasik:=FALSE;
            ELSE
            x1:=0;
            x2:=0;
            KokKarmasik:=TRUE;
     END_IF;  
END_FUNCTION
 

Forum istatistikleri

Konular
129,903
Mesajlar
931,173
Kullanıcılar
452,789
Son üye
yigitt.m

Çevrimiçi üyeler

Geri
Üst