fultek_salih
Fultek Temsilcisi
- Katılım
- 2 Nis 2008
- Mesajlar
- 315
- Puanları
- 6
- Yaş
- 53
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.
Salih Küçükbayrak
Fultek Kontrol Sistemleri
www.fultek.com.tr
[email protected]
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.
Salih Küçükbayrak
Fultek Kontrol Sistemleri
www.fultek.com.tr
[email protected]