Siemens Simatic S7 SCL Programlama Dili

elektronikmuh ' Alıntı:
Function f_lin : real
title ='f_lin'


var_input
x : real;
a : real;
b : real;
end_var
var
end_var


f_lin := a * x + b;


end_function


Yukarıdaki fonksiyonu SCL de oluşturup OB1 içinde çağırıp Simule ettim, kobay olarak projeyide koyuyorum ;D.

https://www.kontrolkalemi.com/forum/attachments/fonksiyo-zip.25586/

10h15i9.jpg
14m88t2.jpg
 

Ekli dosyalar

  • Fonksiyo.zip
    31.6 KB · Görüntüleme: 247
arkadaslar scl ile programlama yapabilmemiz için hangi program kurulu olmalı. bende scl editörü görünmüyor da
 
arkadaşlar resimdeki networkün SCL karşılığına çevirebilirmisiniz.

2ugds2o.gif
 
Kod:
FUNCTION_BLOCK STD_TIMER
TITLE = 'SCL ve çeşitli zaman elemanlarıyla çalışma örnekleri '
//Chapter 30.1 "Timer Functions"
//Chapter 7.7 "IEC Timer Functions"

VAR
BCD  : ARRAY [1..5] OF S5TIME := 5(T#0s);            //BCD_value
Bin  : ARRAY [1..5] OF WORD  := 5(16#0000);           //Binary_value
TV   : ARRAY [1..5] OF S5TIME := T#1s, T#2s, T#3s, T#4s, T#5s;  //Timer value
Start : ARRAY [1..5] OF BOOL  := 5(FALSE);            //Start timer
Reset : ARRAY [1..5] OF BOOL  := 5(FALSE);            //Reset timer
Status : ARRAY [1..5] OF BOOL  := 5(FALSE);            //Timer status

Pulse   : TP;       //SFB 3 IEC pulse
Start1  : BOOL := FALSE;
Status1  : BOOL := FALSE;
Duration1 : TIME := T#1s;
Tvalue1  : TIME := T#0s;

On    : TON;      //SFB 4 IEC on delay
Start2  : BOOL := FALSE;
Status2  : BOOL := FALSE;
Duration2 : TIME := T#1s;
Tvalue2  : TIME := T#0s;

Off    : TOF;      //SFB 5 IEC off delay
Start3  : BOOL := FALSE;
Status3  : BOOL := FALSE;
Duration3 : TIME := T#1s;
Tvalue3  : TIME := T#0s;

END_VAR

BEGIN
//*****************************************************************************
//Starting the SIMATIC timer functions

//Starting a timer function as a pulse
BCD[1] := S_PULSE(
     T_NO := "Timer1",
     S  := Start[1],
     TV  := TV[1],
     R  := Reset[1],
     BI  := Bin[1],
     Q  := Status[1]);

//Starting a timer function as an extended pulse
BCD[2] := S_PEXT(
     T_NO := "Timer2",
     S  := Start[2],
     TV  := TV[2],
     R  := Reset[2],
     BI  := Bin[2],
     Q  := Status[2]);

//Starting a timer function as an on delay
BCD[3] := S_ODT(
     T_NO := "Timer3",
     S  := Start[3],
     TV  := TV[3],
     R  := Reset[3],
     BI  := Bin[3],
     Q  := Status[3]);

//Starting a timer function as a latching on delay
BCD[4] := S_ODTS(
     T_NO := "Timer4",
     S  := Start[4],
     TV  := TV[4],
     R  := Reset[4],
     BI  := Bin[4],
     Q  := Status[4]);

//Starting a timer function as an on delay
BCD[5] := S_OFFDT(
     T_NO := "Timer5",
     S  := Start[5],
     TV  := TV[5],
     R  := Reset[5],
     BI  := Bin[5],
     Q  := Status[5]);


//*****************************************************************************
//Starting the IEC timer functions

Pulse (        //Start pulse timer
  IN := Start1,
  PT := Duration1);
  
Status1 := Pulse.Q;
Tvalue1 := Pulse.ET;

On    (      //Start on delay
  IN := Start2,
  PT := Duration2);
  
Status2 := On.Q;
Tvalue2 := On.ET;

Off    (      //Start off delay
  IN := Start3,
  PT := Duration3);
  
Status3 := Off.Q;
Tvalue3 := Off.ET;

//*****************************************************************************
END_FUNCTION_BLOCK
 
Son düzenleme:
Kod:
FUNCTION_BLOCK STD_COUNTER
TITLE = 'SCL ve Sayıcılarla ilgili örnekler'
//Chapter 30.2 "Counter Functions"
//Chapter 8.6 "IEC Counter Functions"


VAR
BCD1,  BCD2,  BCD3  : WORD;   //BCD_value
Bin1,  Bin2,  Bin3  : WORD;   //Binary_value
PV1,   PV2,   PV3   : WORD;   //Counter value
Set1,  Set2,  Set3  : BOOL;   //Set counter
Up1,   Up2,   Up3   : BOOL;   //Count up
Down1,  Down2,  Down3  : BOOL;   //Count down
Reset1, Reset2, Reset3 : BOOL;   //Reset counter
Status1, Status2, Status3 : BOOL;   //Counter status

Up    : CTU;      //SFB 0 IEC up counter
Up4    : BOOL := FALSE;
Reset4  : BOOL := FALSE;
Status4  : BOOL := FALSE;
Svalue4  : INT := 0;
Zvalue4  : INT := 0;

Down   : CTD;      //SFB 1 IEC down counter
Down5   : BOOL := FALSE;
Set5   : BOOL := FALSE;
Status5  : BOOL := FALSE;
Svalue5  : INT := 0;
Zvalue5  : INT := 0;

UpDown  : CTUD;      //SFB 2 IEC up-down counter
Up6    : BOOL := FALSE;
Down6   : BOOL := FALSE;
Reset6  : BOOL := FALSE;
Set6   : BOOL := FALSE;
VStatus6 : BOOL := FALSE;
ZStatus6 : BOOL := FALSE;
Svalue6  : INT := 0;
Zvalue6  : INT := 0;

END_VAR

BEGIN
//*****************************************************************************
//Starting the SIMATIC counter functions

//Up counter
BCD1  := S_CU(
     C_NO := "Counter1",
     CU  := Up1,
     S  := Set1,
     PV  := PV1,
     R  := Reset1,
     CV  := bin1,
     Q  := Status1);

//Down counter
BCD2  := S_CD(
     C_NO := "Counter2",
     CD  := Up2,
     S  := Set2,
     PV  := PV2,
     R  := Reset2,
     CV  := bin2,
     Q  := Status2);

//Up-down counter
BCD3  := S_CUD(
     C_NO := "Counter3",
     CU  := Up3,
     CD  := Down3,
     S  := Set3,
     PV  := PV3,
     R  := Reset3,
     CV  := bin3,
     Q  := Status3);

//*****************************************************************************
//Starting the IEC counter functions

Up  (        //Up counter
  CU  := Up4,
  R  := Reset4,
  PV  := Svalue4);
  
Status4 := Up.Q;
Zvalue4 := Up.CV;

Down (       //Down counter
  CD  := Down5,
  LOAD := Set5,
  PV  := Svalue5);
  
Status5 := Down.Q;
Zvalue5 := Down.CV;

UpDown  (      //Up-down counter
  CU  := Up6,
  CD  := Down6,
  R  := Reset6,
  LOAD := Set6,
  PV  := Svalue6);
  
VStatus6 := UpDown.QU;
ZStatus6 := UpDown.QD;
Zvalue6 := UpDown.CV;

//*****************************************************************************
END_FUNCTION_BLOCK
 
Kod:
FUNCTION_BLOCK TOGGLE
TITLE = 'Tek butonla Start-Stop'

VAR_INPUT           //Değişken tanımlama kısmı
 CLK : BOOL;         // Giriş değişkenimiz, Start-Stop butonu olabilir
 rst : BOOL := FALSE;   // Reset girişimiz
END_VAR
VAR_OUTPUT
 Q : BOOL;           // Çıkış değişkenimiz
END_VAR
VAR
 edge : BOOL;         //Buda ara işlemelerde kullanacagımız yardımcı değişken
END_VAR          //Değişken tanımlama sonu

BEGIN             //Prgmımız burdan başlıyor

 IF rst THEN                              //Reset var mı kontrolü?
  q := 0;                                  //Varsa Çıkışı sıfırla
 ELSIF clk AND NOT edge THEN    // Girişin çıkan kenarını kontrol ediyoz
  Q := NOT Q;                 // Kenar çıkarsa; çıkışın son durumu ne ise NOT layıp tersini çıkışa atıyoz.
 END_IF;                                 //IF Şart Sonu
 edge := clk;                           // Kenar algılama değişkenini kilitleme

END_FUNCTION_BLOCK             //Bu kadar... ;)
 
Son düzenleme:
Kod:
// SCL'ye yeni başlayanlar için basit bir örnek;

FUNCTION_BLOCK fb1
VAR_INPUT
  giris1:INT; //1.giriş
  giris2:INT; //2giriş
END_VAR
VAR_OUTPUT
  sonuc1:INT;
  sonuc2:bool; //q0.0 atayacaz
END_VAR
CONST
  sayi := 100 ; // sabit sayı
END_CONST
BEGIN
sonuc1:=(giris1*giris2); // girişten gelen 2 sayıyı çarpıyoruz
IF sonuc1>sayi THEN 
   sonuc2:=1; //eğer çarpım sonucu 100 den büyükse q0.0=1 olur, çıkış verir.
END_if;
END_FUNCTION_block
 
Moderatör tarafında düzenlendi:
Bu prg. ekrandan bir bilgi değiştikçe bilginin değiştigini bir bitle haber verir. BU bit test edilerek kafanıza göre istediginiz şeyleri yapabilirsiniz.

Kod:
FUNCTION_BLOCK FB2

// Değişken tanımlama kısmımız
VAR_INPUT
    setvalue:INT:=0;      (* Degeri değiştirilen deger ben INT aldım, REAL veya baska bişi olabilir *)
    reset:BOOL:=false;   (* Degerin degiştigini anladıktan sonra  tekrar kurmak için reset girişi   *)
END_VAR

VAR
    oldvalue:INT;         (* Bir önceki set degeri tuttuğumuz ara değişken *)
END_VAR
VAR_OUTPUT
    changed:BOOL;   (* Değerin değiştigini işaret eden bit! *)
END_VAR

BEGIN        (* Prg.mız buradan başlıyor *)
    IF setvalue <> oldvalue THEN  (* giriş ile bir önceki deger karşılaştırılır *)
       changed:=true;               (*  Deger değişti bilgisi setleniyor *)
       oldvalue:=setvalue;        (* yeni deger eski degere aktarılıyor *)
    ELSIF reset THEN            (* Reset sartına bakılıyor *)
       changed:=false;         (* Reset varsa degişti bilgisi 0'a çekiliyor *)
      
    END_IF;                   (* IF şartını sonlandırıyoz *)
END_FUNCTION_BLOCK

degisimzd2.jpg
 
Son düzenleme:
Kod:
FUNCTION_BLOCK FB24

VAR_INPUT
    run:BOOL;  //giris sinyali
    clk:BOOL;  //clock girisi
END_VAR
VAR_OUTPUT
    lamb1:BOOL;
    lamb2:BOOL;
    lamb3:BOOL;
    lamb4:BOOL;
    sayac:INT; //lamba sayaci diyebiliriz
END_VAR
    
VAR
  // Static Variables
clk_pe:BOOL;   //Clock sinyalinin çıkan kenarı
ileri:BOOL:=TRUE;  //sayacın ileri sayması icin
geri:BOOL:=false;   // sayacın geri sayması icin
END_VAR

BEGIN


IF run THEN //run
    IF clk=false THEN clk_pe:=true; END_IF;  //clock sinyalinin pozitif edge sorgulaması yapılıyor

    IF sayac>3 THEN ileri:=false; geri:=true; END_IF; //sayacin 4ten sonra geri gitmesi saglanır
    IF sayac<2 THEN ileri:=true; geri:=false; END_IF;//sayacin 1 den sonra ileri gitmesi saglanir
    
    CASE sayac OF // sayacin durumuna göre ilgili lamba yanar
        1:lamb1:=true;
        2:lamb2:=true;
        3:lamb3:=true;
        4:lamb4:=true;
    END_CASE;


    IF clk AND clk_pe THEN // clock ve positif edge nin true sarti aranir
        clk_pe:=false;
    
        IF ileri THEN sayac:=sayac+1; END_IF; //ileri true durumunda sayac 1 arttırılır
        IF geri THEN sayac:=sayac-1; END_IF; //geri true duruunda sayac 1 azaltılıyor
    
    END_IF;
ELSE lamb1:=false; lamb2:=false;lamb3:=false;lamb4:=false;  
END_IF;


END_FUNCTION_BLOCK
 
Son düzenleme:

Forum istatistikleri

Konular
130,063
Mesajlar
932,668
Kullanıcılar
453,044
Son üye
alicigdem

Yeni konular

Geri
Üst