|
Seri haberleÅŸme
Bir çoğumuz seri port'tan bilgi transferi ihtiyacı duymuşuzdur. Bu transferin Vb 6'da vb.net 2003'de ve vb.net 2005'de benzer şekilde çalışan sistemleri vardır. Fakat bu sistemler Buffer'daki bilgiyi okumaya ve yazmaya,Buffer boyutu ayarlama'ya ve Buffer'da bilgi olup olmadığını sorgulamaya yönelik temel operasyonları yönetir. Oysa gelişmiş haberleşme sistemleri bu temel fonksiyonlar ile daha bir çok operasyonu yönetirler. Gelişmiş haberleşme sistemlerinden en yaygın olanları profibus ve modbus'tır. Konuyu daha iyi açıklamak için profibus'ı inceleyelim. Otomasyonun öncü firmalarından Siemens makine ortamında bulunan cihazların birbirleri ile ve bilgisayarlar ile haberleşme ihtiyacını ilk farkeden firmalardan biridir. Bu amaçla seri port üzerinden rs232 ve rs422 hardware yapısını kullanarak 3964 ve 3964R protokolleri ile haberleşme gerçekleştirmiştir.
Bu protokoller ilk haberleşme protokolleri olarak önemlidir. Genel hatları ile bilgi gönderecek olan cihaz diğerine "STX" gönderir."STX" text başlangıcı demektir ascii tablosunda decimal 20 vedaha küçük olan decimal sayılar karşılığında bir harf üretmezler.Bunun yerine bir eylemi ifade ederler."STX" ascii tablosunda 02 olarak ifade edilir."STX" okuyan cihaz bilgi almaya hazır olduğunu yine "STX" olarak ifade eder. Gönderen cihaz cevabı alınca bir string oluşturur string başında "STX" ikinci karekter data boyu ve son karekter yine "STX" olur. Bilgiyi alan cihaz ilk önce başında ve sonunda "STX" olup olmadığını kontrol eder Bu testi geçen string'in ikinci karekterine bakar string boyuda uyuşuyorsa "DLE" göndererek bilginin doğru şekilde alındığını teyid eder. Eğer bilgi uyuşmuyorsa gönderen cihaz aynı eylemi tekrarlayacaktır. Bu şekilde mümkün olan en kesin sonuca ulaşılmaya çalışılmıştır. Yinede bilgi boyu değişmeden string ortasındaki değerlerden bir veya bir kaçı hatalı olabilir.Bu sistemde bu göz ardı edilmiş olması çok düşük bir olasılıktır. Bu olasılığı ortadan kaldırmak alınan stringin geri gönderilmesi ve gönderen cihaz tarafından birebir karşılaştırılması ile mümkün olacaktır.Buda haberleşme trafiğini ikiye katlayacaktır hızıda yarıya indirecektir.
Endüstride otomasyonun artması ile haberleşme ihtiyacıda artmıştır. Bu amaçla yeni nesil haberleşme sistemleri üretilmeye başlamıştır. Bunların başında profibus gelmektedir. Bu sistemde programcı profibus protokolüne sahip cihazlarla haberleşebilmek için üçüncü parti yazılımları düşük bedelle satın alarak hazırladığı program içerisinde activeX olarak etkinleştirip. Kendi programında sanki kendisinin hazırladığı bir değişkenmiş gibi kolaylıkla kullanabilmektedir. Ayrıca cihaz üreten firmalarda profibus chiplerini satın alarak cihazlarına monte etmektedirler. Böylece ne cihaz üreten nede program yazanlar bu protokolü bilmek zorunda kalmamış oluyorlar.
Bu ürünlerin fiyatları bir kaç yüz dolar seviyesindedir.Böyle bir otomasyon sisteminde OPC server,OPC clint ve profibus giriş çıkış modülleri alınması gerekliliği düşünüldüğünde bedel bir anda 1000 dolar ve üstü seviyelere ulaşmaktadır. Bu bedel büyük otomasyon işlerinde önemli olmamakla birlikte aynı sistemden çokca üretilecekse ciddi bir maliyet oluşturmaktadır.
Bu açıklamalardan sonra makalemizin asıl amacına dönelim. Kesintisiz,Hatasız ve hızlı çalışan seri port programları nasıl yapabiliriz. Aslında bu ifadede görecelidir. Yani çok fazla uğraşıp çok fazla kod işleterek profibus kapasitesinde bir protokol hazırlayabiliriz. Ancak böyle bir sistemi hazırlamak bize daha fazla maliyet oluşturacaktır. Zira çok fazla vakit harcıyacağız. Bunun yerine biraz daha yavaş biraz daha güvensiz ama doğru çalışan bir protokol hazırlamak daha doğru olabilir. ilk olarak trafik tek taraflımı çift taraflımı tespit etmeliyiz. Eğer tek taraflı ise yani bilgi sadece A cihazından B cihazına gidecekse A cihazı sürekli bilginin bulunduğu string göndermelidir. Alıcı cihaz ise ihtiyac duyduğu aralıklarda buffer'a abakarak bilgiyi okumalı ve stringi sonundan başlayarak işlemelidir. Haberleşme çift taraflı ise bilgi gönderimi belli bir sıra dahilinde olmalıdır. A cihazı bilgiyi göndermeli B cihazı bilgiyi aldığında kendi bilgisini göndermelidir. B'nin bilgiyi alamama ihtimaline karşı A cihazı bilgi gönderdikten belirli bir süre sonra tekrar bilgi göndermelidir. Trafik bu şekilde sürüp gidecektir.Her seferinde farklı bilgiler gönderileceği sistemlerde mutlaka handshake kullanılmalıdır. handshake sayesinde bir önceki gönderimin ulaştığı teyid edilecektir.
Gönderilen stringin yapısı nasıl olmalıdır? Her iki sistemdede stringin başı ve sonunda normalde oluşmayacak yani göndereceğimiz data'lardan biri olmayan bir karekter bulunmalıdır. Örneğin sadece sayı gönderiyorsak bir harf olabilir, eğer harfde göndereceksek ascii tablosundaki harf ve sayı olmayan komut'lardan birini seçmeliyiz. String başı ve sonu bir harf olabiliyorsa işimiz biraz daha kolay buffer'ı komple okuyup stringe transfer edip burada parçalayabiliriz. Ancak harf olamıyorsa bunu bir stringe transfer ettiğimizde Ascii komut karekterleri kaybolacaktır. Bu sebeble bufferdan okurken parçalamamız gereklidir. Her iki yöntemdede benzer parçalama yöntemi kullanılacağından dolayı biz harf olabildiğini varsayarak string parçalamayı anlatalım.
gönderen cihazda gönderilen string boyu sabit kalacak şekilde stringimizi oluşturmalıyız. Yani string başlangıç karekterinden sonra stringin hangi karekterleri hangi değişkenin hangi basamağı olduğu sabit kalmalıdır. örneğin Başlangıç karekteri "A" olsun ve ilk sayı 3 karekter boyunda olsun, "A010B" = 10 , "A100" = 100. iki değişken gönderiyorsak "A010005B" 10 ve 5,"A100050B" 100 ve 50 bir diğer yöntemde değişkenler arasına işaret koymak olabilir. "A10-5B" 10 ve 5 "A100-50B" 100 ve 50. Stringimizi bu şekilde oluşturduktan sonra okuyucu cihazda bu stringi parçalamalıyız. Buffer okunduğunda bu stringin tamamı okunacaktır, Ancak bir önceki okumada bu stringden bir kısmını okumuş ise son okumada kalan kısmı okunacaktır. Yani ilk okuma eyleminde gönderen cihaz gönderimi tamamlamamıştı ve buffer'ı okuyup temizlediniz ilk okunan bilgi "A01" idi sonraki okunan bilgide "0005B" olabilir veya byt tam okunmadığından dolayı karekterlerde farklı çıkabilir. Her iki bilgide bir işinize yaramayacaktır. Bu durumda gönderen cihazla senkronize olamamışsınızdır. Senkronize olabilmek için bufferda bilgi oluşmaya başladıktan belli bir süre (söz konusu stringin maksimum gönderilme süresi kadar) sonra buffer'ı okumalısınız. Böylece bufferda bilgi tamamlanacak ve siz hepsini birden okuyacaksınız. String parçalanırken ilk ve son karakterin uyuşup uyuşmadığı ve string boyu kontrol edilmelidir. Uyuşmadığı taktirde bu bilgiyi işlemeden göndereceğiniz stringi göndermelisiniz zira A cihazı bilgi almak maksadı ile sürekli buffer'ını kontrol etmekte ve belli bir sürenin sonunda size ikinci defa göndereceği stringi göndermeyi beklemektedir.
gelişmiş haberleşme yöntemlerinde ascii karekterler tam olarak taşınmazlar. Örneğin sayıları ifade etmekte 1 byte oldukça büyük bir değerdir. 0 ila 9 arasında 10 sayı 4 bit ile iletilebilir. 4 bitte 16 değişik ifade oluşturabilirsiniz bunların 10 tanesini sayıları oluşturmakta kalan 6 tanesinide komutları oluşturmakta kullanabilirsiniz. Örneğin porta gelen bir karekteri okuyup ascii'sini alalım ve bu ascii değeri binary'e çevirip ilk dört bitini 1. karekter 2. dört bitini 2. karekter olarak kabul edelim. ilk dört bitten elde ettiğim sayı 0 ila 9 arasındaki bir sayıyı ifade etsin eğer sayı 10 ise string başı 11 ise string sonu olsun. Bu şekilde hazırlayacağımız bir protokol ascii karekterleri kullandığımız protokolden 2 kat daha hızlı çalışacak fakat gönderen ve alan cihazda fazladan kodlar yazmamıza sebep olacaktır. Daha öncede belirttiğimiz gibi ihtiyaz duyduğumuz profibus kadar hızlı bir protokol ise profibusı satın almak daha ucuza gelecektir. Ancak ona yakın hızda fakat daha düşük bir maliyeti hedeflemişsek kendi protokolümüzü oluşturmak doğru seçenek olacaktır.
En son Anonymous tarafından Pzt Şub 21, 2011 1:22 pm tarihinde darbelendi.
|