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..


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
    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
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…