NI Ürünleri İle İlgili Tartışmalar

cancel
Showing results for 
Search instead for 
Did you mean: 

Labview Veri Akışı Kodlama ve Grafik Tabanlı Programlamanın Yararları

Dün gece konuyu açıp bir şeyler yazdım fakat eklemeye çalıştığımda hata verdi ve yazdıklarım gitti. Otomatik kaydetmemiş nerede aradıysam da bulamadım.

İlk olarak en temel konularını ele almak ve ileri seviye Labview geliştiricisi olmak isteyenlerin en temelden alışkanlık haline getirmeleri gereken ipuçlarına değinmek doğru bir yaklaşım olacaktır. Ancak, birbiriyle ilişkili ilerleyecek bu konular sadece bu başlık altında anlatılıp bitirilebilecek kadar kısa değil. Düşüncem en temel konuları örneklerle anlatırken ayrı bir konu başlığı kapsamında olanları ayrı konular olarak ele alalım ve burada konu başlıklarını ve bağlantılarını verelim.

Labview geliştirme ortamının metin tabanlı geliştirme ortamlarına göre üstünlüklerini ele alacak olsak, sanırım ilk akla gelecek olan görsel kodlamanın yazılım hâkimiyetini ve anlaşılabilirliği ne kadar çok artırdığı olacaktır. Nerdeyse hayatı boyunca hiç kodlama yapmamış ancak analiz kabiliyeti olan ve algoritma kurma mantığına sahip herkesin kısa sürede Labview ile temel uygulamalar geliştirebileceğini söyleyebiliriz. Bu yaklaşım Labview ilk ortaya sürüldüğünde de aslında böyleydi. NI’ın, özellikle kendi donanımları ile haberleşecek ve hiç uygulama geliştirmemiş kişilerin bile kolaylıkla uygulamalar geliştirebileceği bir çözüm üretmekti. O zamanlar C/C++ en yaygın geliştirme ortamları olsa da ileri düzey kodlama yetenekleri gerektirmesi sebebiyle sadece uzman kişilerin kullanabildiği geliştirme ortamlarıydı.

Günümüzde ise nerdeyse diğer yaygın geliştirme ortamlarıyla kafa kafaya gider duruma gelen Labview çıkış noktasından oldukça farklı bir noktaya gelmiştir. Labview artık NI donanımları ile haberleşmekten öte ciddi projelerde üst seviye geliştiricileri ekipleri tarafından kullanılmaktadır. Bu tür kapsamlı projeler eski geliştirme mantığıyla “düğmeye bas, çalısın yeter!” organize edilemez. Kod hatalarının hızlıca giderilebilmesi, kodun genişletilebilmesi, yeniden kullanılabilmesi, geliştirici ekiplerinin birlikte geliştirmelerine açık olabilmesi, vs gibi etkenler yazılımda uyulması gereken sıkı kuralları ve geliştirme tekniklerinin gerekliliğini ortaya çıkarmıştır.

Labview temelde “veri akışı programlama” (http://en.wikipedia.org/wiki/Dataflow_programming) esasını kullanmaktadır. Bu yaklaşımda diğer dillerde olduğu gibi işlemlerin nasıl gerçekleştiğine değil verinin kaynaktan hedeflere nasıl ilerlediğine yoğunlaşılır. Veri akışı programlamada esas olan veridir, veri işlemlerden geçer ve çıkış olarak alınır. Kod geliştirme ve düzenleme yaparken verinin kaynağından işlem noktalarına ve hedeflere nasıl aktığı her zaman önceliğimizdir. Veri birden çok hedefe yönlendirilecekse kopyaları oluşturulurken çıkış noktasındaki verinin adresinden tamamen farklı adreslerde işlem yapılmaktadır. Bu yapı Labview için en uygun olan ByVal (değer ile) modelini esas almayı doğru kılmaktadır. Diğer dillerde genelde ByRef (başvuru ile) modelini esas almaktadır.

ByVal modeli ile veri akışı kodlama, Labview içerisinde çoklu görev tanımlamayı, paralel çalışmayı, vs oldukça basitleştirmektedir. Diğer dillerde öncelik atamaları gibi ilave tanımlamalar yapılmasını gerektiren bu tür işlemlerde Labview bu tür tanımlamalar gerektirmez.

Labview kodlama yapısı bu esaslar üzerine kurulmuştur ve bu çerçevede kendi doğal kodlama yapısını geliştirmiştir. Bu yapıya uyulması geliştirme sürecinizi birçok yönüyle olumlu etkileyecektir. Kodunuzun okunabilirliği, genişletilebilirliği, hata giderme, performans, eşleme, vs gibi birçok esas bu kurallara ne kadar uyduğunuza bağlıdır.

Bu bağlamda ele alınabilecek ana başlıklar şöyledir;

1.Veri Akışı (Kablolama, düğümler)

2.Performans yönetimi

3.Paralel çalışma

4.Eşleme (senkronizasyon)

5.Rutinler, uygulamalar arası haberleşme

6.Geliştirme mimarileri (state machine, event handler, producer/consumer, queued message handler, functional global variable, subpanel plugins, asynchronous processes, object oriented design)

Message 1 of 8
(13,204 Views)

Basit bir örnek üzerinde Labview'inen temel kablolama mantığını ele alalım.

Sayaç.png

İlk döngüdeki sayaç için "SAYAÇ 1" göstergesi tanımlanmış ve göstergenin yerel değişkeni üzerinden değerine erişilerek artırılmakta ve tekrar içine yazılmaktadır. "sayaç=sayaç+1" mantığı ile oluşturulan bu örnek Labview kodlama için doğru yaklaşım değildir. Bunun yerine ikinci döngüde verilen örnek, Labview kodlama yapısına daha uygundur. (İki örnek arasında performans testleri yaptığınızda farkı daha iyi anlayacağınızı düşünüyorum.) Ayrıca bu kod bloğunda elde edilen veri başka bir işleve giriş olacaksa ikinci örnek tam böyle bir veri akışı için yazılmıştır. Ayrıca "SAYAÇ 1" göstergesini başka yerlede de kullanacağımızı düşünürsek, kodun okunabilirliği düşecektir ve "Yarış Durumu" (Race Condition - http://en.wikipedia.org/wiki/Race_condition) oluşması muhtemeldir. Bu tür hataların oluşmasını engellemek için gerekliliği dışında yerel/global değişkenler kullanmamalı, Labview doğal kodlama yöntemlerini tercih etmelidir.

Message 2 of 8
(9,947 Views)

Diğer bir temel kodlama hatası da döngüler arası veri aktarımında hiçbir kontrol olmadan yerel değişkenlerin kullanılmasıdır.

Döngüler.png

Örnekte verilen "data" değişkeni ilk döngüde alınan veriyi ikinci döngüye işlemek üzere aktarmaktadır. Verilen örneğin birebir kullanımı olmasa da benzer amaçlarla döngüler arası böyle kontrolsüz değişkenlerle veri aktarımı temel düzey LV kullanıcılarının en çok yaptığı hatalardan biridir ve bir çok sebeple doğru bir kodlama değildir. Yazma/okuma önceliği belirsizdir, döngüler arası zamanlama eşitlemesi yoktur, birden çok noktadan okuma/yazma yapılırsa "yarış durumu" (race condition) olma olasılığı yüksektir ve kodun okunabilirliği/değiştirilebilirliği eklenen her yerel değişken ile işin içinden çıkılamaz duruma gelmektedir.

Döngüler arası veri aktarımı için yine LV kodlama yöntemlerini kullanmak gerekir (senkronizasyon, user events, data value references, vb)

0 Kudos
Message 3 of 8
(9,947 Views)

Queue.jpg

Buna ek olarak "Queue" yapısı da paralel döngüler için verileri işlememize yarayabilir. Bir döngüde "Queue" ye ekleme yapılır, diğerinde ise bu eklenen veriler çekilip işlenebilir.

Örnek : Üretici / Tüketici (Producer/Consumer) Modeli 

Türkçe : https://decibel.ni.com/content/thread/13389?tstart=0

İngilizce: http://www.ni.com/white-paper/3023/en


Yasemin Barutçu
Electrical And Electronics Engineer
0 Kudos
Message 4 of 8
(9,947 Views)

Bu yapıyı ayrı bir konu başlığı olarak ele almayı düşünüyordum Öyleyse konularla ilgili üst başlıkları da eş zamanlı açalım ve bağlantı verip birden çok başlığı eş zamanlı götürmeye çalışalım. Mesela "queue" ile döngülerin eşleştirilmesi ve producer/consumer yapısı için iki başlık daha aynı zamanda açalım. Bu örneği oraya taşıyıp bu başlığa bağlantısını verelim. Yasemin Hanım bu işi de siz yapın

0 Kudos
Message 5 of 8
(9,947 Views)

Yeni başlıkları açtım örneklerinizi isterseniz oraya taşıyabilirsiniz, burada bağlantılarını verelim derim

0 Kudos
Message 6 of 8
(9,947 Views)

Tamam olabilir. Ben ek yapmak istemiştim ama zaman bulursam bir anlatım da yaparım ya da anlatımın türkçesini anlayabildiğim kadarıyla aktarırım.


Yasemin Barutçu
Electrical And Electronics Engineer
0 Kudos
Message 7 of 8
(9,947 Views)

Anlatımına ben de ilaveler yapmaya çalışırım. Çeviri dahi olsa konu başlığının açılması ve üzerinde durulması faydalı olacaktır.

0 Kudos
Message 8 of 8
(9,947 Views)