Siemens Simatic S7 SCL Programlama Dili

artkadaşlar sık sık okuyorum su seyı pascal dılı acl ıle aynı ozellıklerı tasır dıye yanı scl dılını ogrenmek ıcın pascal dılını anlatan bır kıtap la olaya balamak daha mı mantıklı ????


bu arda paylaşımlar harıka ellerınıze saglık:)
 
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.
merhabalar uzun zamandır scl dili ile ilgili kıtapları dokum anları inceliyorum delphi üzerinde uygulamalar yaptığım için s7 300 serisini ogrenebilmek anlamında scl dılını kullanmayı dusunuyorum sonucta pascal tabanlı bır dıl ustadlara sunu sormak ısterım öğrenmek için burdan baslamak dogrumu plc bılgımı sorarsanız s7 200 serısıne oldukca hakımım ayrıca dıger modellerde'de uygulama yaptım bir fikrinizi almak istedim...
 
SCL ile kucuk bir katkida bizden olsun, SFC1 i kullanarak gercek zaman saatini okuyup integer olarak sonuclari alma..

kod asagidaki gibi..
---------------------------------------------------------------------
Kod:
FUNCTION_BLOCK FB9
Title = 'RTC'

VAR_TEMP    
    TarihBCD:DATE_AND_TIME;
    Tarih AT TarihBCD:STRUCT
        Yil:BYTE;                                       
        Ay:BYTE;                                        
        Gun:BYTE;
        Saat:BYTE;
        Dakika:BYTE;
        Saniye:BYTE;
        Milisaniye:BYTE;
    END_STRUCT;
    
    SFC1Donus:INT;
END_VAR

VAR_OUTPUT
    A_Yil:INT;
    A_Ay:INT;
    A_Gun:INT;
    A_Saat:INT;
    A_Dakika:INT;
    A_saniye:INT;
    A_m_saniye:INT;
END_VAR

SFC1Donus:=SFC1(CDT:=TarihBCD);
A_Yil:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Yil));
A_Ay:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Ay));
A_Gun:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Gun));
A_Saat:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Saat));
A_Dakika:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Dakika));
A_saniye:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Saniye));
A_m_saniye:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Milisaniye));
END_FUNCTION_BLOCK
----------------------------------
daha sonra bu blok ob icerisinden cagrilarak kullanilabilir.

Kod:
 CALL  "RTC" , "RTC_DB"
       A_Yil     :=MW100
       A_Ay      :=MW102
       A_Gun     :=MW104
       A_Saat    :=MW106
       A_Dakika  :=MW108
       A_saniye  :=MW110
       A_m_saniye:=MW112


--------------------
kolay gelsin..
 
Moderatör tarafında düzenlendi:
Merhaba;

Anlayamadıgım tek birsey var:) delphiyi gayetiyi biliyorum...ama SCL bilmyiorum :) daha dogrusu örnek vereyim

var
a:bool;
i:integer;
begin
if a=true then
i=0 else
i=1;
end; dedim..

ben eger a acıkcsa i yi 0 yap kapalı ise 1 yap...bunnlardan bir dügmeyi a diyelim herhangi bir dişleyede 1 diyelim.. PLC a nın düğme oldugunu nasıl anlıyor? ben a yerine b de yazabilirim?.. veya i nin dişli oldugunu plc nasıl anlıyor..bunun adreslemesi nasıl? veya nasıl yapılır? benim bir dişliye veya bir düümeye isim veya değişken nasıl atarım..daha dogrusu bu sekildemi kodlanıyor bunlar..kodlanıyorsa nasıl? umarum anlatabilmişimdir..
 
Programlara dikkat edersen fonksiyon blok olarak tanımladık
VAR_INPUT
//Fonksiyona giren degişkenler
END_VAR
VAR_OUTPUT
//Fonksiyondan çıkan değişkenler
END_VAR

VAR
//Fonk. da kullanılan ara degişkenler
END_VAR
Ana prog. da sembol tablosunda giriş, çıkış adreslerini ve sembolik isimlerini ve kullandıgın fonk. bloklarının sembol ve adreslerini tanımlamalısın daha sonra ana programda çağırdıgın fonksiyonu bu değişkenlerle ilişkilendirdiğinde(tipler önemli) giriş çıkış ilişkilendirmesini yapmış oluyorsun.
 
Elektronik Müh arkadasimizin dediklerine ilave olarak mesala senin verdigin ornegi programa cevirirsek...

Kod:
FUNCTION deneme:VOID
title = 'deneme'  // FC1 tanimladik
//Herhangi bir fonksiyon blocktan veya OB1 icerisinden bu Fonksiyonu cagirarak kullaniriz
          
VAR_INPUT
    a : BOOL; // Bu bizim inputumuz. 
END_VAR

VAR_OUTPUT
    i:INT; // Buda bizim cikisimiz..
END_VAR

IF a= true THEN 
        i:= 1; 
    ELSE
        i:=0;
END_IF;
END_FUNCTION
-------------------

Daha sonra OB1 icerisinden veya herhangi bir FB den bu fonksiyonu cagirarak kullanabiliriz.
Kod:
      CALL  "deneme" // FC1
       a:=I0.0       // gercek inputumuz
       i:=MW10      // Buda gercek cikisimiz.

------------------------------------
 
Moderatör tarafında düzenlendi:
Hocam sordugum soruda o zaten...nasıl ilişkilendiriyorsun...atıyorum bir düğme tanımlamak istiyorum...düğme true ise lambayı ac false ise lambayı kapat...ben burda lambayı nasıl ilişkilendirecegim...? ne diye tanımlayacagım..bir örnekle rica etsem acıklarmısınız?
 
tesekkür ederim örnek icin... Söyle bir sorum daha olucak.. siz burada burası 1 se burayı 1 yap gibi bir ilişki kurdunuz.. atıyorum elimde seviye kontrol cihazım var...atıyorum termometre.. bunun derecesini nasıl kontrol ederim..örnek koda yazayım..


var
t1,t2:integer;
durum:bool; //Uyarı düğmesi
begin
durum:=true;// Termometreyi actım...
t1:=strtoint(edit1.text); // burada termometrenin degerinin girişi varsıyorrum
t2:=100;
if t2<t1 then
begin
showmessage('Sıcaklık Arttı'');// Ekrana uyarı geliyor...
durum:=false; //termometreyi kapattı
end;
end;

Bunu nasıl yorumlarsınız?
 
Giriş degerini(analog bir deger olabilir) alt ve üst limitler arasında sınırlayan( max değerden büyükse maksimum, minumum değerden küçükse minumum, arasında ise direkt çıkaşa aktaran progr*****) SCL programlama kodu


Kod:
FUNCTION FC50:VOID  //FC50 yi kullandık

VAR_INPUT     //Değişkenleri tanımladıgımız kısım
  MX : INT;    //Upper limit
  IN : INT;    //Input value
  MN : INT;    //Lower limit
END_VAR

VAR_OUTPUT  
  OUT:INT;
END_VAR  // Degişken tanımlama sonu,


BEGIN     //Programımız buradan başlıyor

IF IN > MX THEN OUT := MX;        //Giris degeri IN, maksimum degerden büyükse çıkışımıza MX atanır
  ELSIF IN < MN THEN OUT := MN;    //Giriş degeri IN, minumumdan küçükse çıkışımıza MN degeri atanır
  ELSE OUT := IN;             // Giriş degerimiz iki deger arasındaysa OUT=IN, yani çıkış=giriş     
END_IF;                     // Şart sonu

END_FUNCTION

Şekildeki gibi MX ve MN degerlerini OUT, INTEGER bir analog çıkış kanalına gönderebilirsin...
 
Hocam...Buraya Kadar Hersey Güzel...

var
t1,t2:integer;
durum:bool; //Uyarı düğmesi
begin
durum:=true;// Termometreyi actım...
t1:=strtoint(edit1.text); // burada termometrenin degerinin girişi varsıyorrum
t2:=100;
if t2<t1 then
begin
showmessage('Sıcaklık Arttı'');// Ekrana uyarı geliyor...
durum:=false; //termometreyi kapattı
end;
end;
Mesela kullanıcı elle dokunmatik ekranda 30 girsin sıcaklıga. ve 30 dereceye geldiğinde uyarı versin..bu döngüye göre analog giriş ve analog çıkış örnegi yazarmısınız?
 

Yeni mesajlar

Forum istatistikleri

Konular
128,222
Mesajlar
915,916
Kullanıcılar
450,012
Son üye
erenc348

Yeni konular

Geri
Üst