MOVE_BLK_VARIANT: Move Block (Varyant Bloğu Aktar)

MOVE_BLK_VARIANT: Move Block (Varyant Bloğu Aktar)

Siemens TIA (Totally Integrated Automation) Portal’da MOVE_BLK_VARIANT komutu, VARIANT veri tipi kullanarak esnek bellek kopyalama işlemleri yapmanızı sağlayan bir fonksiyondur. Bu komut, ARRAY veya STRUCT gibi yapısal verilerin dinamik olarak bir bellek alanından diğerine taşınmasını kolaylaştırır. Özellikle ARRAY boyutları farklı olsa bile veri aktarımı yapabilirsiniz. Bu rehberde, MOVE_BLK_VARIANT komutunun mantığını, kullanım örneklerini, avantajlarını, dikkat edilmesi gereken noktaları ve pratik ipuçlarını detaylıca ele alacağız.

MOVE_BLK_VARIANT Komutu Nedir?

MOVE_BLK_VARIANT, VARIANT veri tipiyle çalışarak esnek veri transferi sağlayan bir komuttur. MOVE_BLK’ten farklı olarak, kaynak (SRC) ve hedef (DEST) alanlarının dinamik olarak belirlenmesine olanak tanır. Bu, özellikle farklı boyutlardaki ARRAY’ler veya yapısal verilerle çalışırken büyük bir avantaj sağlar.

Çalışma Mantığı: MOVE_BLK_VARIANT, EN girişiyle tetiklenir. EN = 1 olduğunda, SRC’den başlayarak COUNT kadar eleman, SRC_INDEX ve DEST_INDEX ile belirtilen konumlardan itibaren DEST’e kopyalanır. İşlem başarılıysa ENO = 1 olur; aksi halde (örneğin, indeks aşımı veya veri tipi uyumsuzluğu durumunda) ENO = 0 döner.

MOVE_BLK_VARIANT Komutunun Mantığı ve Kullanım Alanları

MOVE_BLK_VARIANT komutu, aşağıdaki senaryolarda kullanılır:

Kullanım AmacıAçıklama
Dinamik Veri AktarımıFarklı boyutlardaki ARRAY’leri veya yapısal verileri kopyalama.
Esnek İndekslemeKaynak ve hedef ARRAY’lerde belirli indekslerden başlayarak veri transferi.
Yapısal Veri İşlemeSTRUCT veya UDT gibi karmaşık veri yapılarını dinamik olarak kopyalama.

Temel Parametreler:

ParametreVeri TipiAçıklama
ENBOOLKomutu aktifleştirmek için "1" olmalı.
ENOBOOLİşlem başarılıysa "1", değilse "0" döner.
SRCVARIANTKaynak veri (ARRAY veya ARRAY elemanı). BOOL ve ARRAY of BOOL desteklenmez.
COUNTUDINTKopyalanacak eleman sayısı. SRC ve DEST ARRAY değilse 1 olmalı.
SRC_INDEXDINTKaynak ARRAY’deki başlangıç indeksi (sıfır tabanlı).
DEST_INDEXDINTHedef ARRAY’deki başlangıç indeksi (sıfır tabanlı).
DESTVARIANTHedef bellek alanı (InOut olarak tanımlanmalı).
RET_VALINTHata kodu; başarı durumunda "0" döner.

Hata Kodları (RET_VAL):

Hata Kodu (W#16#...)Açıklama
80B4ARRAY of STRUCT yerine ARRAY of UDT kullanılmalı.
8151SRC parametresine erişilemiyor.
8382SRC_INDEX negatif değer alamaz.
8483Hedef ARRAY, kopyalanacak veri için çok küçük.

Kombine Örnek: Farklı Senaryolar

Sistem: MOVE_BLK_VARIANT komutunun farklı kullanım alanları:

Kullanım AmacıÖrnek Senaryo
Dinamik Veri AktarımıFarklı boyutlardaki sensör verilerini (ARRAY) kopyalama.
Esnek İndekslemeReçete verilerini belirli bir indeksten başlayarak kopyalama.
Yapısal Veri İşlemeSTRUCT verilerini dinamik olarak bir DB’den diğerine kopyalama.

Açıklama: MOVE_BLK_VARIANT, VARIANT veri tipiyle esnek veri transferi sağlar ve farklı boyutlardaki verilerle çalışmayı kolaylaştırır.

PLC Programlama Örnekleri

MOVE_BLK_VARIANT komutu, dinamik veri aktarımı, esnek indeksleme ve yapısal veri işleme gibi senaryolarda kullanılır. İşte detaylı örnekler:

Örnek 1: ARRAY → ARRAY Kopyalama

Network 1: ARRAY → ARRAY Kopyalama
EN----[ MOVE_BLK_VARIANT ]----ENO
      | SRC: #SrcArray[0]       |
      | COUNT: 3                |
      | SRC_INDEX: 2            |
      | DEST_INDEX: 1           |
      | DEST: #DestArray[0]     |
      | RET_VAL: #ErrorCode     |
        

Açıklama: EN = 1 olduğunda, #SrcArray’deki 3 eleman (indeks 2’den başlayarak: 30, 40, 50) #DestArray’e (indeks 1’den başlayarak) kopyalanır. #SrcArray: [10, 20, 30, 40, 50], #DestArray: [0, 0, 0, 0, 0] → [0, 30, 40, 50, 0].

Örnek 2: Farklı İndekslerle Kopyalama

Network 2: Farklı İndekslerle Kopyalama
EN----[ MOVE_BLK_VARIANT ]----ENO
      | SRC: DB1.DataArray      |
      | COUNT: 2                |
      | SRC_INDEX: 3            |
      | DEST_INDEX: 2           |
      | DEST: DB2.TargetArray   |
      | RET_VAL: #ErrorCode     |
        

Açıklama: EN = 1 olduğunda, DB1.DataArray’deki 2 eleman (indeks 3’ten başlayarak: 400, 500) DB2.TargetArray’e (indeks 2’den başlayarak) kopyalanır. DB1.DataArray: [100, 200, 300, 400, 500], DB2.TargetArray: [0, 0, 0, 0, 0] → [0, 0, 400, 500, 0].

Örnek 3: STRUCT Kopyalama

Network 3: STRUCT Kopyalama
EN----[ MOVE_BLK_VARIANT ]----ENO
      | SRC: DB3.MotorSettings  |
      | COUNT: 1                |
      | SRC_INDEX: 0            |
      | DEST_INDEX: 0           |
      | DEST: DB4.BackupSettings|
      | RET_VAL: #ErrorCode     |
        

Açıklama: EN = 1 olduğunda, DB3.MotorSettings STRUCT’ı DB4.BackupSettings’e kopyalanır. COUNT = 1, çünkü tek bir STRUCT taşınıyor.

Örnek 4: Hata Yönetimi

Network 4: Hata Yönetimi
EN----[ MOVE_BLK_VARIANT ]----ENO
      | SRC: DB5.SourceData     |
      | COUNT: 5                |
      | SRC_INDEX: 0            |
      | DEST_INDEX: 0           |
      | DEST: DB6.TargetData    |
      | RET_VAL: #ErrorCode     |
|----[ #ErrorCode <> W#16#0000 ]----( Q0.0 )----|
        

Açıklama: EN = 1 olduğunda, DB5.SourceData’dan 5 eleman DB6.TargetData’ya kopyalanır. Eğer işlem başarısız olursa (örneğin, hedef ARRAY küçükse, W#16#8483), #ErrorCode W#16#0000’den farklı olur ve Q0.0 (hata çıkışı) aktif olur.

Örnek 5: Dinamik COUNT ve İndeks Hesaplama

Network 5: Dinamik COUNT ve İndeks Hesaplama
EN----[ MOVE_BLK_VARIANT ]----ENO
      | SRC: DB7.SensorData     |
      | COUNT: #DynamicCount    |
      | SRC_INDEX: #StartIndex  |
      | DEST_INDEX: #TargetIndex|
      | DEST: DB8.LogData       |
      | RET_VAL: #ErrorCode     |
        

Açıklama: EN = 1 olduğunda, DB7.SensorData’dan #DynamicCount kadar eleman, #StartIndex’ten başlayarak DB8.LogData’ya, #TargetIndex’ten itibaren kopyalanır. #DynamicCount, MIN(SIZE(SRC) - SRC_INDEX, SIZE(DEST) - DEST_INDEX) ile hesaplanabilir.

Örnek 6: VARIANT ile Esnek Veri Aktarımı

Network 6: VARIANT ile Esnek Veri Aktarımı
EN----[ MOVE_BLK_VARIANT ]----ENO
      | SRC: #DynamicSrc        |
      | COUNT: 3                |
      | SRC_INDEX: 0            |
      | DEST_INDEX: 0           |
      | DEST: #DynamicDest      |
      | RET_VAL: #ErrorCode     |
        

Açıklama: EN = 1 olduğunda, #DynamicSrc (VARIANT, örneğin bir ARRAY of REAL) içindeki 3 eleman #DynamicDest’e (VARIANT, örneğin başka bir ARRAY of REAL) kopyalanır. VARIANT, farklı veri tipleriyle esnek çalışmayı sağlar.

Günlük Hayattan Örnekler

MOVE_BLK_VARIANT komutunun mantığını anlamak için günlük hayattan benzetmeler:

  • Kitap Transferi: Bir raftaki belirli bir kitaptan (SRC_INDEX) başlayarak birkaç kitabı (COUNT) başka bir rafın belirli bir yerine (DEST_INDEX) taşıma.
  • Fotoğraf Albümü: Bir albümdeki belirli fotoğrafları (SRC) başka bir albümün belirli bir sayfasına (DEST) kopyalama.
  • Kutu Düzenleme: Bir kutudaki eşyaları (SRC) başka bir kutunun belirli bir bölümüne (DEST) yerleştirme.
  • Bagaj Aktarımı: Bir araçtaki bagajlardan bazılarını (SRC) başka bir aracın belirli bir yerine (DEST) taşıma.

Avantajlar

  • Esneklik: VARIANT veri tipi sayesinde farklı boyutlardaki ARRAY’ler ve yapısal verilerle çalışabilir.
  • Dinamik İndeksleme: SRC_INDEX ve DEST_INDEX ile belirli konumlardan veri transferi yapma imkanı sunar.
  • Veri Uyumluluğu: Dinamik veri tipleriyle çalışarak programın esnekliğini artırır.
  • Hata Yönetimi: RET_VAL ve ENO ile işlem başarısını kontrol ederek güvenilirlik sağlar.

Dikkat Edilmesi Gerekenler

  • BOOL Desteği: BOOL ve ARRAY of BOOL desteklenmez; bu tür veriler için ARRAY of BYTE kullanın.
  • İndeks Sınırları: SRC_INDEX ve DEST_INDEX negatif olamaz (W#16#8382); ayrıca, indeksler ARRAY sınırlarını aşarsa hata oluşur.
  • COUNT Sınırı: COUNT, kaynak veya hedef ARRAY boyutunu aşarsa (W#16#8483) hata oluşur.
  • Veri Tipi Uyumu: SRC ve DEST’in veri tipleri uyumlu olmalıdır; aksi halde işlem başarısız olur.

İpuçları

  • VARIANT Esnekliği: Blok oluşturulurken ARRAY boyutları bilinmiyorsa, VARIANT kullanarak dinamik kopyalama yapabilirsiniz.
  • İndeks Hesaplama: SRC_INDEX ve DEST_INDEX’in sıfır tabanlı olduğunu unutmayın; ARRAY sınırlarını aşmamak için kontrol yapın.
  • COUNT Kontrolü: COUNT değerini MIN(SIZE(SRC) - SRC_INDEX, SIZE(DEST) - DEST_INDEX) ile sınırlayın.
  • Hata Yönetimi: RET_VAL ve ENO’yu bir hata göstergesine bağlayarak (örneğin, Q0.0) hataları izleyin.
  • BOOL Verileri: BOOL ARRAY’leri yerine ARRAY of BYTE kullanarak hizalamadan kaynaklanan hataları önleyin.

Sonuç

Siemens TIA Portal’daki MOVE_BLK_VARIANT komutu, dinamik bellek yönetimi ve esnek veri aktarımı için ideal bir araçtır. VARIANT veri tipi sayesinde farklı boyutlardaki ARRAY’leri ve yapısal verileri güvenle kopyalayabilirsiniz. Hata kodlarını düzenli kontrol ederek kararlı bir programlama yapabilirsiniz. Daha fazla bilgi için Siemens Online Destek sayfasını ziyaret edebilirsiniz.

Yorumlar