Siemens Simatic S7 SCL Programlama Dili

Bir forum sitesinde aşağıdaki uyarıyı görmüştüm, belki yardımcı olur, köşeli parantezler yerine () kullanılmasını söylüyor...

It will appear some errors,go in each block and correct the syntax.

I found some common errors like Indirect address..

Old (simatic v5.x) : WORD_TO_BLOCK_DB(_pt.DBNr).DD[ptw] := 0;
New (TIA Portal) : WORD_TO_BLOCK_DB(#_PT.DBNr).DD(#tPT) := 0;

The diference is in Brackets in old byte address form and parentheses in new byte address form.
 
Arkadaşlar merhaba,



Tia'da IO ve Merker tanımlamak için notasyon değişmiş ve bu durum birtek S7300 ve 400 tipli eski teknoloji paketleri ile üretilen CPUlar için geçerli 1200 ve 1500 serisi plclerde eski notasyon ve karakterler ile aynı.


S7300,400 -> #_byte:=%IB(0);

S71200,1500 -> #_byte:=IB[0];

Kolay gelsin
 
Arkadaşlar merhaba ;

Tia v12 sp1 kullanıyorum aşağıdaki ifadede;

#DST:=P#I64.0 byte 2;

DST : any tipinde bu değişkenin içine input 64.0 başlayarak 2 byte değişkeni atıyorum fakat benim arzu ettiğim ise i64.0 değişkenini indirek yapabilmek. bir türlü indirek hale getirip bir fonksiyon bloğun içine alamıyorum .

İndirek hale gelirse hangi nputtan başlayarak 2 byte okumasnı istyorsam onu okumasını istiyorum

Yardımlarını bekliyorum

Kolay gelsin
 
pulse.jpg

arkadaşlar yukarıdaki ladder ın scl karşılığını yapabilirmisiniz?
 
Moderatör tarafında düzenlendi:
Kabaca
_T1 ( //Start on delay
IN := NOT _T2.q,
PT := T#500ms);​

_T2 ( //Start on delay
IN := NOT _T1.q,
PT := T#500ms);​

M10.0:= (_T1.q) OR (_T2.q);
 
Son düzenleme:
Aşağıdaki örnekte bir Db içinde rastgele verilmiş 32 adet real tipinde veriyi küçükten büyüğe sıralattım kodda ufak bir oynama yaparak tersinide yapabilirsiniz.
Fantazi yapmak isteyen ark.lar verilerin toplayıp, ortalamasını aldırıp, standart sapmasını da hesaplatabilir, datalar içindeki enküçük ve enbüyük verileri buldurtabilirsiniz, SCL için bunlar iş degildir.

Kod:
FUNCTION_BLOCK FB100

VAR_IN_OUT
     Start:INT;  // Hedef DB deki (DB aşağıda)  başlangıç indeksi
     End  :INT;  // Hedef DB deki son indeks
END_VAR

VAR
    i,j:INT;
    Swap:REAL;  // Takas degişkeni verileri yer degiştirmede kullandım
END_VAR

BEGIN
    FOR i:=Start    TO (End-1) BY 1     DO   // İç içe iki for döngüsüyle verileri
        FOR j:= i+1 TO End     BY 1     DO     // tarıyoruz
            IF DB101.Data[i]> DB101.Data[j] THEN  // i ve j inci veriler test edilir
                Swap         :=DB101.Data[j];    // Yer degiştirme işlemi yapıyoruz
                DB101.Data[j]:=DB101.Data[i];
                DB101.Data[i]:=Swap;
            END_IF;
        END_FOR;
    END_FOR;

END_FUNCTION_BLOCK

DATA_BLOCK DB101    //Hedef DB miz DB101, 32 adet bilgi var içinde
STRUCT
    Data       : ARRAY [0..31] OF REAL;
END_STRUCT
BEGIN

END_DATA_BLOCK


Sayın eletronik muh. cok yararlı bir paylaşımYukarıdaki kodu yazdığımızda 32 adet alana 1 den fazla aynı veriyi sıralamaktadır.Ek olarak ek'teki hatayı alıyoruz.Nerede Yanlış yapıyor olabiliriz. Yardımcı olabilir misiniz?

FUNCTION FC1000:VOID

VAR_IN_OUT
Start:INT; // Hedef DB deki (DB aşağıda) başlangıç indeksi
End :INT; // Hedef DB deki son indeks

END_VAR

VAR
i,j:DINT;
Swap:DINT; // Takas degişkeni verileri yer degiştirmede kullandım
END_VAR

BEGIN
FOR i:=Start TO (End-1) BY 1 DO // İç içe iki for döngüsüyle verileri
FOR j:= i+1 TO End BY 1 DO // tarıyoruz
IF DB1013.Data> DB1013.Data[j] THEN // i ve j inci veriler test edilir
Swap :=DB1013.Data[j]; // Yer degiştirme işlemi yapıyoruz
DB1013.Data[j]:=DB1013.Data;
DB1013.Data:=Swap;
END_IF;
END_FOR;
END_FOR;
END_FUNCTION

DATA_BLOCK DB1013 //Hedef DB miz DB1013, 32 adet bilgi var içinde
STRUCT
Data: ARRAY [0..31] OF DINT;
END_STRUCT
BEGIN

END_DATA_BLOCK
 
Son düzenleme:
CASE "deger".cevrim.giris.sayici OF
0:
IF "giris_sensoru" = 1 OR "Data_blok_1".bosalt = 1 THEN
"kaliciGKONV1" := 1;
END_IF;

"konve1".TONR(IN:="kaliciGKONV1",
PT:="deger".zaman.giris,
Q=>"kaliciGKONV1_cikis",
ET=>"anime_zaman".giris1);

IF "kaliciGKONV1_cikis" = 1 THEN
"kaliciGKONV1" := 0;
"deger".cevrim.giris.sayici := 5;
END_IF;

5:
IF "deger".ENCo_On_zincir.zemin = 1 AND "giris_sensoru" AND ("on_guvenlik" = 0 OR "arka_guvenlik") THEN
"kaliciGZINCIR_UP" := 1;
RESET_TIMER("konve1");
END_IF;
IF "deger".ENCo_On_zincir."6dan7ye" = 1 THEN
"kaliciGZINCIR_UP" := 0;
"deger".cevrim.giris.sayici := 10;
END_IF;


.
.
.
.


burada konve1 timerın girişine bağlanan tag gittiği zaman süre kaldığı yerden devam ediyor mu?
simülasyonda timer girişi kesildği an timer tekrar başa dönüyor ama fbd ya da lad dilinde böyle bir sıkıntı olmuyor.
simülasyonla mı alakalı yoksa bi yer mi atladım.
yardımcı olursanız çok sevinirim.
 

Forum istatistikleri

Konular
130,143
Mesajlar
933,536
Kullanıcılar
453,223
Son üye
Shentyurk

Yeni konular

Geri
Üst