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: 246
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.
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
128,133
Mesajlar
915,308
Kullanıcılar
449,850
Son üye
umutbaysal9

Yeni konular

Çevrimiçi üyeler

Geri
Üst