Pointer ve Reference tipleri farkları nedir?(İleri Programlama)

elektronikmuh

Yönetici
Yönetici
Yönetici
Katılım
13 Ocak 2007
Mesajlar
2,235
Puanları
1,866
Yaş
47
Aşağıdaki konular ileri seviye programlamayla ilgilidir
youtube da alt yazıları türkçeye çevirmek için:
1661754637970.png

Pointer ve Reference tipleri farkları

Fonksiyon bloklarına referans veya değer ile parametre geçmenin farkları

 
Son düzenleme:
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.
Merhaba gerçek bir projede kullanım amacı için bir açıklama yapmanız mümkün mü ?
PLC programlamada pointer kullanmak bize ne avantaj sağlıyabilir ?
 
Merhaba;
Pointerlarla ilgili şu gibi örnekleri verebilirim;
FB1 ve FB2 gibi farklı işler yapan fonksiyon bloklarınız olsun, FB1 içinde program yazarken bir baktınız birden fazla yerde FB2 nin farklı girişlerini ye W/R yaparak bazı sonuçları elde etmeniz gerekli olduğunu gördünüz.
Klasik yöntemde FB1 den giriş-çıkışlar oluşturup bu çıkışları FB2 ye girişveya girişler olarak vererek sonuçları elde etme yöntemine gidilebilir veya daha farklı yöntemler kullanılabilir.

Pointerla bu işi yapmak istersek FB1 girişine genelde (In_Out) olarak sadece FB2 nin adresini verip, FB1 içinde, FB2 tipinde bir pointer oluşturup, adresini parametre alarak verdiğinizde, FB1 programı içinde FB2 nin tüm giriş, çıkışları manipule(W/R) edebilirsiniz.

Başka bir örnek servo hareketleri için PLC open blokları kullanıyorsunuz diyelim tüm eksenler için MC_Power, MC_Home, MC_MoveVelocity, MC_MoveAbsolute... gibi bir sürü bloklarla eksenlere hareket vermek gerekiyor. Her eksen için bu blokları çağıracağıma bu blokları tek bir FB altında toplayıp girişine de hangi eksen çalıştırılacaksa onun adresini pointer veya reference verip yukarıdaki bloklar çalıştırılabilir.

Aynı şekilde her eksen hareketi için ayrı ivme, pozisyon, mesafe, çalışma modu gibi bir sürü parametreler gereklidir, bu parametreleri her eksen için bir structer oluşturup bu parametre yapının adresleri bloğa verilip parametrelere erişip kullanılabilir.​
 
Son düzenleme:
Şunu diyebilir miyiz?
Pointer hafıza alanı düşük plc lerde hafıza alanından tasarruf yapmamızı sağlar ve dolaylı adresleme yapmamıza olanak sağlar... Sonuçta pointerlar değer değil adresi tutuyor. Aynı adrese farklı değerler göndererek hafıza alanından tasarruf sağlanabilir _?
 
Örnek olması açısından B&R kontrolcüler de servo motorları sürmek için kullanılan MpAxisBasic tipinden türetilen fonksiyon bloğun(gMpAxisBasic_0), hareket için gerekli parametreleri(ivme, hız, pozisyon, homing yöntemleri....vs parametreleri) bir structure adresi alınarak olarak fb ye giriş(IN) ile verilir.
1666853127236.png

Tüm bu parameteler MpAxisBasicParType tipinden türetilen gMpAxisBasicPar_0 değişkeninin adresi verilerek tek satırda bloğa aşağıdaki gibi adresi pointerla alınır.
Kod:
    gMpAxisBasic_0.Parameters     := ADR(gMpAxisBasicPar_0); //Servo sürmek için gerekli parametre yapısı aktarılır
    gMpAxisBasic_0(); //Blok çağırılır

gMpAxisBasicPar_0 değişkeni, MpAxisBasicParType tipinde, structure içinde structure yapısı şeklinde aşağıdaki yapıdadır.
1666853199644.png


Dolayısıyla ana programda(fb nin dışındaki) aşağıdaki gibi parametreler veya çok daha fazlası değiştirildiğinde otomatik olarak fonksiyon bloğuna gönderilmiş olur.
Kod:
    gMpAxisBasicPar_0.Acceleration := 1000;
    gMpAxisBasicPar_0.Deceleration := 2000;
    gMpAxisBasicPar_0.Home.HomingVelocity := 10;
    gMpAxisBasicPar_0.Jog.Velocity := 500;
 
Son düzenleme:
Kod:
// My PLC_PRG main

VAR
   FB_byRef_0 : FB_byRef; // My fb referencing another fb
   FB_byRef02_0 : FB_byRef02; // Target fb to be changed inside
END_VAR

// Main PLC_PRG

FB_byRef_0.IN_refFB REF= FB_byRef02_0;   // Reference passing to "FB_byRef" fb

FB_byRef_0(); // Call my fb 1

FB_byRef02_0(); // Call my fb 2

// End of My PLC_PRG main

Kod:
// My Function block to Point Another "FB_byRef02"

FUNCTION_BLOCK FB_byRef

VAR_INPUT
   IN_refFB : REFERENCE TO FB_byRef02; (* Pass FB by reference *)
END_VAR

VAR
  _ptrVarAdr : POINTER TO INT; (* Get the ADR of the input var *)
  _Test : BOOL;
END_VAR

IF NOT (__ISVALIDREF(IN_refFB)) THEN
   RETURN;  // Checking the adress of Input valid
END_IF

(* Get the adr of the input fb*)

_ptrVarAdr := ADR(IN_refFB);

IF  _Test THEN // Im Changing input of the "FB_byRef02", this i want to do
   _Test := FALSE;
   IN_refFB.inChangeVal := TRUE;
END_IF

// End My Function BLock to Point Another "FB_byRef02"

Kod:
FUNCTION_BLOCK FB_byRef02

VAR_INPUT
  inChangeVal:BOOL;
END_VAR

VAR_OUTPUT
  outValue :REAL;
END_VAR

IF inChangeVal THEN
   inChangeVal := FALSE;
   outValue    := outValue + 1;
END_IF
 
Son düzenleme:

Yeni mesajlar

Forum istatistikleri

Konular
128,153
Mesajlar
915,491
Kullanıcılar
449,897
Son üye
alcaponee

Yeni konular

Geri
Üst