Bir görevi belirli bir zaman sonra çalıştırma

Bir görevi belirli ve kesin bir süre sonra çalıştırmak gerekirse ne yapılır?

En basit yöntem, bir Timer kurmak ve bu Timer ın interval değerini belirli değere set ederek TimerTick olayında görevin çalışmasını tetiklemektir.  Daha komplex uygulamalarda bu yöntemi kullanmak zahmetli ya da sorunlu olabilir (Genelde de olur).

Böyle durumlarda thread kullanmak ve thread çalışması için belirli bir zaman atamak daha profesyonel bir yaklaşımdır. .NET halihazırda thread tetiklenmesi, bekletilmesi, sonlandırılması vb. işlemler için güçlü API desteği sunar.

Kameralı Kontrol uygulamamız, yakaladığı hatalı parçayı bir t süre sonra üflemek suretiyle konveyörden atacak olsun.

		public void UfleP(int t)
		{
			System.Threading.Thread.Sleep(t);
			SetDigitalOutput(1);
		}

gibi bir kod çalıştırıldığında, sistem t süresi kadar bekleyecek sonra dijital output set etmek suretiyle üfleme yapacaktır. Bu kod, bekleme süresinde (Sleep) sistemi uyutacağından, görüntü işleme uygulamalarında akla bile getirilmemelidir. Yapılması gereken, bu fonksiyonu çağıran yapıyı bir thread haline getirmek, thread i start edip unutmak, thread kendi içinde beklese bile ana programın bundan hiç etkilenmemesini sağlamaktır. Thread çalışırken bekleyecek, görevini yapacak ve en nihayetinde kendi halinde  sonlanacaktır (Terminate). Tüm bu olan bitenden ne ana programın, ne de programcını haberdar olması bile gerekmez. (Tam ideal durum. Yaz ve unut. Hiçbir Timer bu kadar kullanışlı olamazdı.)

Burada bir sorun, thread için parametre geçirmektir. Normal thread çağırırken parametre kullanımına izin vermez. Parametre kullanımı için ParameterizedThreadStart kullanmak gerekir.

Yapıyı yeniden kodlarsak;

		public void UfleP(object t)
		{
			int iSleep = (int)t;
			System.Threading.Thread.Sleep(iSleep);
			SetDigitalOutput(1);
		}

şekline dönüştürerek (parametrenin object türünden olduğuna dikkat edin. Dolayısıyla birden fazla parametre vermek, dizi geçmek vb. object türünün sağladığı sınırsız avantajlar burada kullanılabilir…)

		private void PickAfterMilliSecond(int msAfter)
		{
			System.Threading.ParameterizedThreadStart starter = new System.Threading.ParameterizedThreadStart(UfleP);
			new System.Threading.Thread(starter).Start(msAfter);
		}

gibi bir yapı ile, Parametrik Thread yapımızı programda istediğimiz yerden çağırabiliriz. Dertsiz tasasız çalışacaktır…

Sigorta Kutusu Renk ve Röle Kontrolü

Bursa İnegöl’de, Otomotiv Elektrik Sanayi sektöründe faaliyet gösteren Murat Ticaret kameralı kontrol uygulamaları için bizimle çalışmaya karar verdi.

Murat Ticaret için yapılan çalışmada istenenler

  • Üretilen sigorta kutuları ve bu kutuların üzerine yerleştirilmiş çok sayıda sigortanın, renklerine bakılarak  doğru yere doğru sigortanın takılmış olmasının kontrolü
  • Sigorta kutusu üzerinde yer alan rölelerin, doğru röle olup olmadığının kontrolü
  • Kutu üzerindeki Flaşör devresinin doğru devre olup olmadığının kontrolü

Mavis tarafından yapılan kontroller

  • Renk Analizi yapılarak sigortaların doğru yerde olup olmadığının kontrolü
  • Rölelerin üzerindeki şekil ve yazıların tanınarak doğru röle kullanılıp kullanılmadığının kontrolü
  • Flaşör üzerindeki yazının ve rengin ayırt edilerek doğru malzeme kullanılıp kullanılmadığının kontrolü

VYP Sigorta Analiz Ekranı

Projenin Zorlukları :

  • Çok sayıda sigorta kutusu ve üzerinde çok farklı kombinasyonlarda yerleşmiş sigorta kutularının tanıtılması
  • Birbirine çok yakın renklerin ayırt edilebilmesi (Sarı, Turuncu, Portakal, Kahverengi ya da açık yeşil, mavi gibi renkler)
  • Röleler ve Flaşörlerin üzerindeki devre şeması farklılıklarından yola çıkarak doğru ürünü seçebilme

Mavis Teknolojisi

Mavis olarak bu projede ilk kez kullandığı 2 yeni teknolojiyi kullandık. Bunlardan ilki, son kullanıcı için oldukça kolaylık sağlayacak, akıllı öğretim sistemi olarak adlandırabileceğimiz, “Şahit Numuneden Öğren” seçeneğidir.

Akıllı Öğrenim Sistemi

Geliştirilen bu yeni özellik ile kullanıcı (operatör) doğru parçayı kamera kontrol ünitesine koyar ve “Şahit Numuneden Öğren” seçeneğini seçer. Program tüm kutu üzerindeki sigorta, röle, flaşör yerleşim yerlerine, renk değerlerine bakar ve bunları ürün kodu ile eşleştirerek kaydeder. Yine değiştirilebilir bir benzeşim yüzdesi ile sistemin hassasiyeti belirtilmek suretiyle, daha sonra kontrol edilen tüm ürünlerin, şahit numuneye benzeşim oranı çıkartılır. Herhangi bir hata varsa, ürün ret olarak ayrılır. Ürün sağlam ise, barkod etiketi üretilir ve paketlenmek üzere ilgili istasyona yönlendirilir.

Bu projede kullandığımız diğer yenilik, sistemin renk ayırdetme yüzdesini artırmak adına geliştirilen yazılım iyileştirmesidir. Yeni yapılan bu geliştirmeye göre, alınan renkli fotoğraf

  1. RGB değerlerine (3 kanal) ayrılır. (decompose3)
  2. Her bir kanaldaki (R, G ve B) değerlerinin, şahit numunedeki RGB değerleri ile en fazla %20 kadar sapmış olması beklenir. (Bu %20 rakamı değişkendir)
  3. RGB ile sadece belirgin renklerin değişimi yakalanabilmektedir. Sarı, turuncu, altın rengi gibi birbirine yakın renkleri algılamak için trans_from_rgb fonksiyonu ile renklerin hue, saturation, volume değerlerine inilir. Yine şahit numunden en fazla ile %20 sapma beklenir.
  4. Bazı renklerde hue, saturation değerleri de işe yaramayabilir. Bu durumda trans_from_rgb fonksiyonu sırasıyla yuv, cielab, i1i2i3 metodolojisi ile yeniden çalıştırılır. Yine her bir sonuç değerinin şahit numuneye yakın olması beklenir.
  5. Herşeye rağmen, bazı çok yakın değerleri (mavi, açık yeşil) yakalamakta zorluk yaşanıyorsa, bu durumda, sigorta üzerindeki text (yazı – amperaj değeri) de işin içine katılır.

Sonuçta her halükarda doğru sonucu veren hızlı ve güvenli bir yapı geliştirilmiş olur.

Barkod Printer, Seri Port, USB, C# üzerine… – 1

Herhangi bir uygulama içinde barkod basmak gerektiğinde, ilk akla gelen yöntem, ihtiyaca uygun bir barkod yazıcı kullanmaktır.

Barkod yazıcı kullanarak barkod basmak gerektiğinde kullanılabilecek 2 ana yöntem vardır

  1. Yazıcıyı windows sürücüleri ile yüklemek ve herhangi bir windows yazıcısı gibi kullanmak
  2. Yazıcının desteklediği PPLA, PPLB, ZPL gibi barkod basma komut setlerini kullanarak yazıcı ile konuşmak

1. yöntem, yazıcıyı windowsa herhangi bir yazıcı gibi tanıtmaktır. Yazıcı ile beraber gelen CD vb. ortamdan sürücüleri yüklenir. Muhtemelen yardımcı programlar ve belki birkaç barkod hazırlama utility si de yüklenecektir. Genelde tek başına çalışacak şekilde tasarlanmış tüm bu programlar, programcının direk olarak işine yaramaz. Programcı, kendi programından barkod basma ihtiyacı hissettiğinde, zaten windows tarafından tanınmış olan barkod yazıcıya windows yazdırma yöneticisini kullanarak erişir. Bu yöntem, her ne kadar jenerik bir yöntem olsa da, dezavantajları vardır. Bunlara değinirsek;

Windows yazıcısı olarak kullanılan barkod yazıcı, barkod basma yeteneğini kaybeder. Herhangi bir lazer ya da inkjet yazıcı nasıl davranırsa o da öyle davranır. Tek farkı, normal yazıcılardan farklı olarak sensörleri olduğundan, barkod bitimi, sağ – sol boşlukları, etiket uzunluğu gibi değerleri hala işlevsel olmaya devam edecektir. Fakat asıl farklılık katan yeteneğini, yani barkod basma işlevini yitirmemiş olsa bile kullanamaz duruma gelmiştir. Bu durumda yapılabilecek en kolay yöntem, bir True Type Barkod fontu kulanmaktır. Parayla satılan ya da ücretsiz dağıtılan Code39 fontu internette aratılarak kolayca bulunabilir. (Bulamayanlar ya da test edilmiş bir tanesi ile çalışmak isteyenler bize mail atabilir – info@mavis.com.tr) Bundan sonrası programcının çıktı alacağı form üzerine Code39 fontu ile oluşturulmuş label (etiket) vb. koyması ve bunların çıktısını almaya kalıyor. (Bu yazının konusu olmadığından ve de oldukça basit bir iş olduğundan ayrıntıya girmeye burada son veriyorum.)

Windows yazıcısı olarak kullanmanın diğer bir dezavantajı, basit bir etiket basmak için bile, araya windows sürücülerini sokmak, grafik ya da form tasarımı yapmak (ya da kod ile runtime anında oluşturmak)  ve basılacak barkodu windows yazdırma yöneticisine teslim etmektir. Basit bir barkod için, (tasarıma göre değişmekle birlikte) çok fazla raw data yazdırma yöneticisine gönderilir. Yazdırma yöneticisi o an meşgulse, bunları kuyruğa atar  ki çoğu kez hızlı bir işlem olması beklenen barkod basma işi, duruma göre bir sonraki bahara kalabilir.

Diğer bir sorun, barkod yazıcının verdiği mesajları alamamaktır. Barkod yazıcı normalde, etiket başarıyla basıldı, etiket sonu, etiket bitti, ribbon bitti vb. gibi bir çok hata mesajını anlık olarak döndürür. Fakat araya windows sürücü modeli girdiğinden, programcı bu bilgilerin hiçbirine erişemez. Belirli bir süre sonra, windows görev çubuğunda bir ünlem işareti görebilir (eğer şansı varsa). Otomasyon projeleri gibi, çok hızlı, realtime çalışan uygulamalarda bu model akla bile getirilmemelidir.

Yazı dizisinin 2. bölümünde, barkod tasarlama ve tasarlanmış bu barkodu C# içinden dinamik olarak değiştirip yazıcıya gönderme konusuna yer verdim. (http://www.mavis.com.tr/blog/?p=412)

Makalenin son bölümünde ise, USB yazıcılara direk erişim ve tıpkı seri/paralel port ile erişimlerde olduğu gibi direk veri gönderme teknikleri anlatılacaktır.

Mavis VYP, tüm barkod yazıcılarla çalışabilen son derece güçlü bir barkod sınıfına sahiptir. USB, Seri, Paralel herhangi bir porttan, tüm printerlar ile çalışan uygulamamızın, USB printer arabirimini burada sunmuş olacağım. Böylece Mavis VYP nin engine kısmına ve dolayısıyla teknolojik altyapısına daha detaylı bakmış olacağız.

VYP 1.83 artık İngilizce

Uzun zamandır HALCON ürünlerinin Türkçeleştirilmesini yapan Mavis, kendi programına ingilizce arabirim ekledi. Var olan versiyon Türkçe arabirim üzerinde geliştirilmişti. Yurt dışına iş yapılmasıyla birlikte, ingilizce arabirim ihtiyacı doğru. Mavis VYP 1.84 versiyonunda dili seçmeli olarak menüye ekleyecek, istyen kullanıcılar resource dosyasını değiştirmek suretiyle arabirimi kendilerine göre revize edebilecekler.

VYP 1.82 için yeni icon lar…

Mavis VYP yazılımına, 4 yeni icon seçeneği eklendi. Şeffaf, çerçeveli, beyaz ve default olmak üzere 4 yeni icon seçeneği sadece görsel bir etki katmaktadır. Birden fazla Mavis VYP uygulamasına sahip müşteriler için ayırt edici bir özellik olarak kullanılabilir. Yeni iconlarda, üst tarafta kullandığımız kameraların resmi ve altta Mavis yazısı belirmekte ve böylece Mavise özgü bir uygulama olduğu belirtilmektedir.

Bunun yanısıra, VYP yazılımının özellikleri (functionality) ve kullanıcı arabirimi (user interface) üzerinde bir kaç geliştirme yapılmıştır.

Bunlar;

  • Log penrecesinde pause seçeneği (Çok hızlı akan ekranlarda, ekranı geçici bir süre dondurabilmek amacıyla)
  • Log penceresinde belirli bir sayıya sabitleme özelliği (ekranda binlerce satır arasından arama yapmak yerine, son 12 satır kalsın vb. kullanımı için)
  • USB DIO modülde, manual olarak gönderilen verilerin de ekranda gösterilmesi
  • OCR arabirimi
  • Yeni görevler (Barkod işlemleri)

özellikle OCR arabirimi hakkında ileride bilgi verilecektir. Buradaki temel amaç, kullanıcının hazır fontları kullanabilmesi veya kendisinin kolayca programa font öğretebilmesi. (Akıllı OCR)

ini File dan Kamera Ayarları

VYP Programında, Kamera ayarlarının (pozlama sürese, çalışma frekansı, fps oranı vb…) programa bildirildiği arabirime ini File dan yükleme özelliği eklendi.

Önceki versiyonlarda, Klasör ya da Kamera şeklinde olabilen seçeneklere son olarak ini File seçeneği eklendi. Sahadaki çalışmalarda, görüntü alma işlemleri genellikle uEye kamera programlarından olan uEye Demo ile gerçekleştirilmekte, daha sonra oradaki değerler VYP programına bildirilmekteydi. Şimdi 2 işi tek bir defada yapabilmek için, uEye kamera ayarlarını direk olarak yükleme seçeneği eklendi.  Bunun en büyük avantajı IR Filter, Red Gamma Gain, Hotpixel Correction vb. tüm değişkenleri VYP içinden de ayrıca set etme zorunluluğunu ortadan kaldırması oldu. (Aksi halde Kamera üreticisinin sağladığı tüm fonksiyon seti için ayrı bir arayüz yapmak gerekecekti. Bu da neredeyse imkansız bir iş)

Son olarak, ini file yüklendikten sonra, kullanıcı isterse VYP üzerinden ayarları dilediğince değiştirebilecek. Örneğin ini file olarak yüklenen dosyada pozlama değeri 23.07 ise, kullanıcı bunu 24.01 gibi bir değere çektiğinde, tüm diğer ayarlamalar ini file dan gelmek kaydıyla, sadece pozlama değeri yeni değerine göre set edilmiş olacak.

Sonuçta uEye Demo ile alınan görüntünün birebir aynısı VYP içinden de alınmış oluyor.

ini File üzerine

ini file, en eski windows versiyonlarından beri oldukça yaygın olarak kullanılmaktaydı. Birçok program geliştirme ortamı (VB, Delphi, VS…) ini file işlemleri için API sunuyorlardı. Zamanla ini file yerini önce registry kaydına, daha sonra  özellikle .NET yaygınlaşmasıyla birlikte xml dosyalarına bırakmıştır. (Dolayısıyla VS gibi .NET tabanlı güncel IDE ler  daha az api desteği sunmaktadır)  Buna rağmen ini File, gerek eskiyle uyum, gerek basit oluşu yüzünden hala güncelliğini ve yaygınlığını korumaktadır.