SCL - Döngü Örnekleri

mahir1986

Üye
Katılım
27 Ocak 2010
Mesajlar
12
Puanları
1
Yaş
37
Kolay Gelsin Arkadaşlar;

Benim sorum Step 7 Scl De kullanılan For , While ,Repeat gibi döngü komutlarının plc de program yaparken ne gibi kolaylık sağladığı ve nasıl bir aşamada bu komutlar devreye girer
ve bu komutların çalışma mantığını örneklerle anlatacak arkadaşlara şimdiden çok teşekkürler...

(FOR _counter_ := _start_count_ TO _end_count_ DO
// Statement section FOR
;
END_FOR;)

(WHILE _condition_ DO
// Statement section WHILE
;
END_WHILE;)
(REPEAT
// Statement section REPEAT
;
UNTIL _condition_ END_REPEAT;)
 
Yazımızda endüstrinin can damarı sayılabilecek PLC’yi inceleyeceğiz.
KNX Standardı, küçük bir rezidansın içerisindeki aydınlatma, perde panjur, klima kontrolünden, Dünya’nın en büyük havalimanlarındaki aydınlatma otomasyonu gibi çözümler için tercih edilen bir Dünya standardıdır.
Sn Kerem Safa 1 yazan yerler sanırım "i" olacak değil mi ?
 
FOR i:= 1 TO 12 BY 1 DO
if AlmMov(i) OR AlmFB(i) OR RO(i) OR EM(i) THEN
AlmConv(i):= true;
end_if;
END_FOR;


12 adet konveyörüm var.Movement,FeedBack,Rope Switch veya Emergency button ikazlarımdan biri geldiği zaman o konveyörü alarma geçiriyorum. bunları ladder diyagramda hazırlamak için 12 defa bu diyagramı yazmam gerekirdi. hafıza problemi, hata yapma ihtimali oldukça yüksek.

Birbirinin aynısı motorlar,butonlar vs. bir şablona oturtularak scl de kolaylık sağlanabilir. while ise IF komutu gibidir. DO_WHILE yazılmış yukarıda, IF döngüsüne kesinlikle 1 defa girer,2.giriş için if koşulunun sağlanması gerekir.


kopyalarken atlamış (i)leri.özür.
şimdi farkettim köşeli parantezleri forumda kullanamıyorum.parantezleri köşeli yapman gerekir.
 
Moderatör tarafında düzenlendi:
Sayın keremsafa,
Cevabınızdaki SCL kodların, FB veya FC içine yazılarak main OB1 içinden çağrılacağını ve programın bu şekilde çalışacağını düşünüyorum. Fakat 12 konveyörden gelen 3 fiziksel bilginin(0/1), toplamda 36 adet (sıfır/bir) bilgisinin bu function'lara nasıl input olarak verilebileceğini anlayamadım. bu konuda beni aydınlatırsanız sevinirim. Kolay gelsin...
 
Sayın engin_pala Bey

"Cevabınızdaki SCL kodların, FB veya FC içine yazılarak main OB1 içinden çağrılacağını ve programın bu şekilde çalışacağını düşünüyorum. "
bu doğru.
3 Fiziksel bilginin gelmesi olayı ise şöyle.

Önce bir DB açın ve bir konveyör structure oluşturun. ve bu structure 12 li bir array olsun. o structurenin içerisinde AlmMov, AlmFB, RO, EM, AlmConv boolean taglerinin oluşturun.

Sonra bir FC içerisinde, gerçek Fiziksel Giriş ve çıkış atamaları yapın.

Conv(1).iMov:=I0.0; //Birinci Konveyör için dijital inputları aldık.
Conv(1).iFB:=I0.1; //I0.0 yerlerine sembol isimleri girilecek, yoksa hata alırız
Conv(1).iRO:=I0.2;
Conv(1).iEM:=I0.3;

ve bu FC OBlerden çağırılacak. böylece dışarıdan gelen ikazları arraylerimize atmış bulunmaktayız. Program yazarken artık sadece bu Conv(1).iMov gibi ifadeler kullanacağız.

Farklı bir FC de ise alttaki kodu yazarak 12 konveyörümüz için hata kontrol programı hazırlamış oluyoruz.
FOR i:= 1 TO 12 BY 1 DO
if AlmMov(i) OR AlmFB(i) OR RO(i) OR EM(i) THEN
AlmConv(i):= true;
end_if;
END_FOR;


umarım fazla karışık yazmadım. Müsait olduğumda örnek bir program yazmaya çalışırım.
Kolay gelsin.
 
PHP:
FUNCTION_BLOCK "WHILE"
TITLE = 'WHILE Statement'
//Examples of the control statements
//Section 28.4: WHILE Statement
//WHILE ... DO ... END_WHILE

VAR_INPUT
    Data  : BLOCK_DB;
END_VAR
VAR
    Runtime_variable : INT;
    Dat              : DATE;
    NextWeek         : ARRAY[1..7] OF DATE;
    byteindex        : INT;
    bitindex         : INT;
END_VAR
VAR_TEMP
    t_Date : DINT;
    i, k    : INT;
END_VAR

BEGIN

//Simple WHILE statement
i := 0;
WHILE  Data.DW[i] = 16#FFFF DO
i := i + 1;
END_WHILE;

//Finding the next date that falls at the beginning of the week
t_Date := DATE_TO_DINT(Dat);
WHILE (t_Date MOD 7)+1 <> 1 DO
    t_Date := t_Date + 1;
END_WHILE;

//Saving the date information for the next week
FOR i := 1 TO 7 DO
    NextWeek[i] := DINT_TO_DATE(t_Date + i - 1);
END_FOR;

//Finding the first input bit containing "1"
i := 0; k := 0;
WHILE I[i,k] = TRUE DO k := k + 1;
    IF k = 8 THEN k := 0; i := i + 1; END_IF;
    IF i > i + 4 THEN EXIT; END_IF;
END_WHILE;
byteindex := i; bitindex := k;

END_FUNCTION_BLOCK


PHP:
FUNCTION_BLOCK "REPEAT"
TITLE = 'REPEAT Statement'
//Examples of the control statements
//Section 28.5: REPEAT Statement
//REPEAT ... UNTIL ... END_REPEAT
//CONTINUE ... EXIT
VAR      Runtime_variable  : INT := 0; 
         Meas_values       : ARRAY [1..32] OF INT; END_VAR
VAR_TEMP SFC_ERROR         : INT;   
         busy, done  : BOOL; END_VAR
LABEL    End;                  END_LABEL

BEGIN

Meas_values [32] := -1;
REPEAT
      Meas_values[Runtime_variable] := 0;
      Runtime_variable := Runtime_variable + 1;
UNTIL Meas_values[Runtime_variable] = -1
END_REPEAT;

REPEAT
    M4.1 := TRUE;
    IF I1.2 THEN CONTINUE; END_IF;
    M4.2 := TRUE;
    IF I1.3 THEN EXIT; END_IF;
    M4.3 := TRUE;
UNTIL NOT I1.1
END_REPEAT;
IF I1.4 THEN MB4 := 0; END_IF;


GOTO End;
//Call at restart
REPEAT
SFC_ERROR := COMPRESS(
     BUSY := busy,
     DONE := done);
UNTIL done
END_REPEAT;



End: ;
END_FUNCTION_BLOCK

PHP:
FUNCTION_BLOCK "FOR"
TITLE = 'FOR Statement'
//Examples of the control statements
//Section 28.3: FOR Statement
//Section 28.6: CONTINUE Statement
//Section 28.7: EXIT Statement
//FOR ... TO ... BY ... DO ... END_FOR
//CONTINUE ... EXIT

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 *)
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 *)
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
FOR i:=128 TO 142 BY 2 DO
    MW[i] := PIW[i];
END_FOR;


//Abort FOR loops
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
 
Sayın engin_pala Bey

"Cevabınızdaki SCL kodların, FB veya FC içine yazılarak main OB1 içinden çağrılacağını ve programın bu şekilde çalışacağını düşünüyorum. "
bu doğru.
3 Fiziksel bilginin gelmesi olayı ise şöyle.

Önce bir DB açın ve bir konveyör structure oluşturun. ve bu structure 12 li bir array olsun. o structurenin içerisinde AlmMov, AlmFB, RO, EM, AlmConv boolean taglerinin oluşturun.

Sonra bir FC içerisinde, gerçek Fiziksel Giriş ve çıkış atamaları yapın.

Conv(1).iMov:=I0.0; //Birinci Konveyör için dijital inputları aldık.
Conv(1).iFB:=I0.1; //I0.0 yerlerine sembol isimleri girilecek, yoksa hata alırız
Conv(1).iRO:=I0.2;
Conv(1).iEM:=I0.3;

ve bu FC OBlerden çağırılacak. böylece dışarıdan gelen ikazları arraylerimize atmış bulunmaktayız. Program yazarken artık sadece bu Conv(1).iMov gibi ifadeler kullanacağız.

Farklı bir FC de ise alttaki kodu yazarak 12 konveyörümüz için hata kontrol programı hazırlamış oluyoruz.
FOR i:= 1 TO 12 BY 1 DO
if AlmMov(i) OR AlmFB(i) OR RO(i) OR EM(i) THEN
AlmConv(i):= true;
end_if;
END_FOR;


umarım fazla karışık yazmadım. Müsait olduğumda örnek bir program yazmaya çalışırım.
Kolay gelsin.
Merhaba örnek program yazdınızmı?
 

Forum istatistikleri

Konular
127,957
Mesajlar
913,907
Kullanıcılar
449,606
Son üye
rasit.

Yeni konular

Geri
Üst