Siemens Simatic S7 SCL Programlama Dili

TON ile yapmaya çalıştım ancak başarılı olamadım. Bu yükselen kenar, Düşen kenar zaten tam anlamadım. Burada fark değeri ile bir çeşit takometre yapmaya çalışıyorum.
 
Timer kullanma ile ilgili örnekler:

FUNCTION_BLOCK FB1
TITLE = 'SCL ve çeşitli zaman elemanlarıyla çalışma örnekleri '
VAR
On : TON;
Off : TOF;
Start2 : BOOL := FALSE;
Start3 : BOOL := FALSE;
Tvalue1 : TIME := T#0s;
Tvalue2 : TIME := T#0s;
Duration2 : TIME := T#1s;
Duration3 : TIME := T#1s;
Status2 : BOOL := FALSE;
Status3 : BOOL := FALSE;
END_VAR


BEGIN

//*****************************************************************************
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:
sAYIN ELEKTRONİK MÜHENDİSİ; Timer kullanma ile ilgili örnekler:

FUNCTION_BLOCK FB1
TITLE = 'SCL ve çeşitli zaman elemanlarıyla çalışma örnekleri '
VAR
On : TON;
Off : TOF;
Start2 : BOOL := FALSE;
Start3 : BOOL := FALSE;
Tvalue1 : TIME := T#0s;
Tvalue2 : TIME := T#0s;
Duration2 : TIME := T#1s;
Duration3 : TIME := T#1s;
Status2 : BOOL := FALSE;
Status3 : BOOL := FALSE;
END_VAR



Örnekte kullanılan TON SFB4 olarak kütüphanede bulununan zamanlayıcımıdır ve herhangi bir sistem fonksiyon bloğunu sadece adını yazarak SCL ile yazdığımız programımıza dahil edebilirmiyiz? ve mümkünse buna ait çok basit bir örnek rica ediyorum.
Teşekkür Ederim.
 
Arkadaşlar; SCL diliyle oluşturulan bir fonsiyon bloğumuz var ve biz gene SCL ile ana OB1 oluşturmak ve aşağıdaki kodları OB1 içine yazmak istiyoruz ne yapmamız gerekir?


NETWORK 1
CALL FB 1 , DB2
NOP 0
NETWORK 2
A I 124.0
= DB2.DBX 44.0

NETWORK 3
A I 124.1
= DB2.DBX 44.1

NETWORK 4
A DB2.DBX 54.0
= Q 124.0
NETWORK 5
A DB2.DBX 54.1
= Q 124.1
 

Ustatım bu örnek SCL değil ki STL dili.
 
Elbette bu kodlar STL diline ait ve bu yüzden STL deki bu komutları SCL ile nasıl yapmam gerektiğini soruyorum. Fonksiyon block kısmı SCL ile yapıldı fakar OB1 kısmını SCL ile gerçekleştiremediğim için STL ile yazdım ve Ustalardan yardım bekliyorum.
 

Timer ı tanıttıgınızda compile yapınca SFB4 veya herneyse otomatik blokların içerisine oluşturulur.
 
Bir SCL Çalışması;

Kod:
//İLERİ-GERİ DEVRESİ
//İLERİ YADA GERİ ÇALIŞTIKTAN 10 SN SONRA DURAN DEVRE
//I0.0 STOP BUTONU (NORMALDE LOJİK BİR VE LOJİK SIFIR YAPILINCA SİSTEM DURACAKTIR)
//I0.1 İLERİ YÖN START BUTONU (0=PASİF 1=AKTİF)
//I0. GERİ YÖN START BUTONU (0=PASİF 1=AKTİF)

FUNCTION FC1:VOID
VAR_INPUT
START1:BOOL;
STOP:BOOL;
START2: BOOL;
END_VAR
VAR_OUTPUT
ILERI:BOOL;
GERI: BOOL;
ZAMAN:BOOL;
END_VAR
BEGIN
IF START1=1 & GERI=0 & STOP=1 THEN
ILERI:=1;
ZAMAN:=1;
END_IF;

IF START2=1 & ILERI=0 & STOP=1 THEN
GERI:=1;
ZAMAN:=1;
END_IF;

IF STOP=0 THEN
GERI:=0;
ILERI:=0;
ZAMAN:=0;
END_IF;
END_FUNCTION
FUNCTION_BLOCK FB1
VAR
ON:TON;
SURE:TIME:= T#10s;
CIKIS:BOOL;
KAL_ZAMAN:TIME;
END_VAR 
VAR_INPUT
ZAMAN1:BOOL;
END_VAR
BEGIN 

ON(IN :=ZAMAN1 // IN: BOOL
,PT :=SURE // IN: TIME
); 
CIKIS:= ON.Q; // OUT: BOOL
KAL_ZAMAN:= ON.ET; // OUT: TIME

IF CIKIS=1 THEN
Q0.0:=0;
Q0.1:=0;
Q0.2:=0;
M1.0:=0;
END_IF;

END_FUNCTION_BLOCK
ORGANIZATION_BLOCK OB1
VAR_TEMP
info:ARRAY[0..19]OF BYTE;
END_VAR
BEGIN

FC1(START1:=I0.1, START2:= I0.2 , STOP:=I0.0,ILERI:=Q0.0,GERI:=Q0.1,ZAMAN:=M1.0); 
FB1.DB1(ZAMAN1:=M1.0);
MD10:=DB1.DBD30; //TON ZAMANI md10 ADRESİNDEN İZLENECEKTİR


END_ORGANIZATION_BLOCK
 
Moderatör tarafında düzenlendi:


Kod:
FUNCTION_BLOCK FB71

// Blockparameter
VAR_INPUT
  // Inputparameter
  Reset : BOOL;          // Resets the output value
  Amplitude: REAL;       // Amplitude of the signal
  Offset: REAL;          // Ofsset added to signal
  Periodic_time : DINT;  // Time from one piriod of the output signal, set in ms 
  OBcycle : INT;         // Time of the cycle interupt of the OB, set in ms
END_VAR

VAR_OUTPUT
 // Outputparameter
  Val_Rectangle : REAL;
  Val_Sawtooth : REAL;
  Val_Triangle : REAL;
  Val_Sinus : REAL;
  N_Count: DINT;
END_VAR

VAR_TEMP
  // Local Varaibles
  nloop : DINT;         // loop counter 
  loop_max : DINT ;     // number of steps for the signal in one piriod -> Sinus
  loop_half: DINT;      // hal of the number for the signal in one piriod -> Rectangle, Sawtooth
  nsaw : DINT;          // step counter used for the sawtooth signal
  ntri : DINT;          // step counter used for the triangle signal
  ntri_max : DINT;      // maximum steps needed for the triangle signal
  tri_dir : BOOL;       // toggel bit for the up/down counter  to build the triangle signal
  nsin : DINT;          // step counter used for the sinus signal
  
END_VAR

// Program
loop_max := ROUND (Periodic_time / OBcycle) ;   //number of steps needed for the complete periodic time -> Sinus 
loop_half := ROUND (Periodic_time / (2 * OBcycle));  // number of steps needed for the half periodic time -> Rectangle, Sawtooth 
ntri_max := ROUND (loop_half / 2);          // setting  maximum for the Triangle signal to the half, counter is going to the negativ maximum as well   


// Reset of all output values if RESET is TRUE
IF RESET = TRUE THEN
    Val_Rectangle := 0.0;
    Val_Triangle := 0.0;
    Val_Sawtooth := 0.0;
    Val_Sinus := 0.0;
    N_count := 0;
    nloop := 0;
    nsaw := 0;
    ntri := 0;
    tri_dir := FALSE;
    nsin := 0;
ELSE
    //
    // Building the output values
    //
    N_count := nloop ;                       // set output to the actual number of the loop counter  
    // Loop counter to build the positive and negative oscilation 
    IF nloop < loop_half  THEN 
        Val_Rectangle := Offset + Amplitude; // Rectangle-Signal is set to high
    ELSE 
        Val_Rectangle := Offset - Amplitude; // Rectangle-Signal is set to low
    END_IF;

    nloop := nloop + 1;                      // increment each time if the FB is startet
    
    IF nloop = loop_max  THEN                // set loop counter to zero at the end of the piriod
        nloop := 0;
    END_IF;

    //  Building the Sawtooth Signal
    Val_Sawtooth := Offset + Amplitude * nsaw / loop_half; 
    nsaw := nsaw + 1 ;                      // increment counter used for the Sawtooth signal
    IF nsaw = loop_half THEN
       nsaw := 0;
    END_IF;

    // Building the Triangle Signal 
    Val_Triangle := Amplitude * ntri / ntri_max ; 
    
    IF tri_dir = FALSE THEN                 // check dircetion for the counter 
        ntri := ntri + 1;                   // build poistive ramp
    ELSE 
        ntri := ntri -1;                    // build negative ramp
    END_IF; 

    IF ntri >= ntri_max THEN                // toggle the direction to build the triangle signal to negativ ramp
         tri_dir := TRUE;
    END_IF;

    IF ntri <= (-1 * ntri_max) THEN         // toggle the direction to build the triangle signal to positive ramp
        tri_dir := FALSE;
    END_IF;
    

    // Building the Sinus Signal (counting up until 2*PI) 
    VAL_Sinus := Offset + Amplitude * SIN(6.283185 * nsin/loop_max); 
    nsin := nsin + 1;                           // increment counter for the
    IF nsin = loop_max THEN                     // set counter to 0 if full periodic is reached 
        nsin := 0;
    END_IF;

END_IF;   

;  
END_FUNCTION_BLOCK
 

Ekli dosyalar

  • Signal_G.rar
    253 KB · Görüntüleme: 71
Son düzenleme:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…