avatar_Mayhoş

dsPIC30F ile PLC Haberleşmesi

Başlatan Mayhoş, 10 Aralık 2019, 09:07:25

Mayhoş

Merhaba,

Forumda ve internette gerekli araştırmalarımı yaptım fakat anlayamadığım birkaç nokta var.

1- dsPIC30F serisi ile plc'ye bilgi göndermek istiyorum bunun için RS485 kablo kullanacağım fakat max485 vb. ara bir elemana kesin ihtiyacım var mı yoksa direkt haberleştirme sağlamam mümkün mü?

2- max485 kullanılacaksa bu entegreye rs485 kabloyu nasıl bağlamam gerekiyor? Örnek devreleri inceledim fakat genellikle pic ile pic arası haberleşme mevcut arada bir kablo bağlantısı olan bir çalışma göremedim. Benim picden rs485 kablosunu çıkarıp plc'ye bağlamam ve bilgi aktarmam gerekiyor. O ara bağlantıyı nasıl yapacağımı anlayamadım sadece.

Yardımlarınızı bekliyorum. Teşekkürler.

ete

#1
dspic30F serisi çalışmadığım bir pic işlemci serisi. Ancak data sheet'e bakarak kolaylıkla sorularını yanıtlayabiliyorum. İşlemcide özel bir RS485 portu bulunmuyor.UART portu var bu belirtilen haberleşmeyi yapabilmek için kullanılabilir ancak kesinlikle RS485 (Max485-487 veya muadili,SN75176) bir entegre kullanmak gerekiyor.
RS485 normal şartlarda RS232 nin uzun mesafeli versiyonudur. Bütün haberleşme RS232 standartlarında yapılır ve yalnızca yazma yada okuma yapılırken RS485 entegresinin iligli girişine lojik seviye verilir.

UART modülüne bakarsanız bir TX pini birde RX pini mevcut. Diğer taraftan RS485 entegresine bakarsan, 1 nolu PIN RO yani dışarıdan gelen bilginin işlemciye aktarıldığı pin (işlemcinin RX pinine bağlanacak) , 2 nolu pin RE pini, 3 nolu pin ise DE pini olup bu iki pin birleştirilecektir. Birleşen bu ikili pin gurubuna LOW verilirse entegre Receive modunda olur yalnızca alma (RX) yapar. Bu iki pine HIGH verilir ise entegre Verme moduna girer ve yalnızca verme (TX) yapar. 4 Nolu pin DI pini olup işlemcinin TX pinine bağlanacaktır. 6 nolu pin A pini , 7 nolu pin ise B pini olup karşılıklı iki sistem bu iki pin kullanılarak bir birine bağlanacaktır. Yani işlemciye bağladığın max485-487 entegresinin A ucu ile PLC den gelen hattın A ucu bir birbirine bağlanacaktır. Benzer şekilde iki tarafın B uçlarıda bir birlerine bağlanacaktır. Normalde GND hattı çekmeye gerek yoktur.
Bu durumda PLC tarafınada bakman gerekiyor. Orada standart bir RS485 çıkış pinleri var ise mutlaka A ve B pinleri olması gerekir ki işlemciden gelen A ve B pin hatlarını bu pinlere bağlaman yeterli olacaktır.Yok ise PLC tarafında da Uart pinleri ve peşine bir RS-485 entegresi daha kullanmak zorundasın. Kısaca her iki taraf iinde geçerli olacak şekilde şayet RS485 portu ve buna bağlı A ve B pinleri var ise ayrıca RS485 entegresi kullanmaya gerek yoktur. Yok ise entegreyi kullanmak zorundasın. Daha sonra bu iki (yada birden fazla) üniteli sistemin hangisinin alış hangisinin veriş yapacağına bağlı olarak her iki tarafta da RS485 entegresinin 2-3 nolu pinlerine ilgili lojik seviyeyi verip yönendirme yapacaksın.
ALış veriş işlemi sabit ise yani işlemci hep veren (yada alan) PLC hep alan (yada veren) ise iligili yönlendirme pinlerine sabit (kalıcı) bir değer verilebilir.
Kullanılacak kablo tamamen iki ünite arasındaki mesafeye bağlıdır. Mesafe kısa ise mesela 100m nin altında ise ikili (iki damarlı) telefon kablosu bile kullanabilirsin. Ama emniyetli olsun diyorsan kullanacağın kablo aşağıdaki linkte olandır.
http://www.ersekablo.com.tr/tr-TR/rs-485/3/19/405
Bu kabloda ana özellik çift olan kabloların bir birlerinin üzerinde bükülmüş olmasıdır. Buna twisted kablo deniliyor. Yalnızca bir çiftini kullanman yeterli veya yalnızca bükülmüş iki damar ve blendajı olan bir kabloda işini görür.
Hepsi bu kadar. Anlaşılmayan bir husus olursa sorarsın.

RS485 konusunda bir çalışmamız var idi. Dolaylı bir çalışma ama incelemeni özellikle şemalarada bakmanı öneririm.

https://etepic.com/index.php/topic,57.0.html

Ete

Mayhoş

Verdiğiniz bilgiler için çok teşekkür ederim. Bu bilgiler doğrultusunda çalışmamı sürdüreceğim.

Mayhoş

#3
Alıntı yapılan: ete - 10 Aralık 2019, 09:34:08dspic30F serisi çalışmadığım bir pic işlemci serisi. Ancak data sheet'e bakarak kolaylıkla sorularını yanıtlayabiliyorum. İşlemcide özel bir RS485 portu bulunmuyor.UART portu var bu belirtilen haberleşmeyi yapabilmek için kullanılabilir ancak kesinlikle RS485 (Max485-487 veya muadili,SN75176) bir entegre kullanmak gerekiyor.
RS485 normal şartlarda RS232 nin uzun mesafeli versiyonudur. Bütün haberleşme RS232 standartlarında yapılır ve yalnızca yazma yada okuma yapılırken RS485 entegresinin iligli girişine lojik seviye verilir.

UART modülüne bakarsanız bir TX pini birde RX pini mevcut. Diğer taraftan RS485 entegresine bakarsan, 1 nolu PIN RO yani dışarıdan gelen bilginin işlemciye aktarıldığı pin (işlemcinin RX pinine bağlanacak) , 2 nolu pin RE pini, 3 nolu pin ise DE pini olup bu iki pin birleştirilecektir. Birleşen bu ikili pin gurubuna LOW verilirse entegre Receive modunda olur yalnızca alma (RX) yapar. Bu iki pine HIGH verilir ise entegre Verme moduna girer ve yalnızca verme (TX) yapar. 4 Nolu pin DI pini olup işlemcinin TX pinine bağlanacaktır. 6 nolu pin A pini , 7 nolu pin ise B pini olup karşılıklı iki sistem bu iki pin kullanılarak bir birine bağlanacaktır. Yani işlemciye bağladığın max485-487 entegresinin A ucu ile PLC den gelen hattın A ucu bir birbirine bağlanacaktır. Benzer şekilde iki tarafın B uçlarıda bir birlerine bağlanacaktır. Normalde GND hattı çekmeye gerek yoktur.
Bu durumda PLC tarafınada bakman gerekiyor. Orada standart bir RS485 çıkış pinleri var ise mutlaka A ve B pinleri olması gerekir ki işlemciden gelen A ve B pin hatlarını bu pinlere bağlaman yeterli olacaktır.Yok ise PLC tarafında da Uart pinleri ve peşine bir RS-485 entegresi daha kullanmak zorundasın. Kısaca her iki taraf iinde geçerli olacak şekilde şayet RS485 portu ve buna bağlı A ve B pinleri var ise ayrıca RS485 entegresi kullanmaya gerek yoktur. Yok ise entegreyi kullanmak zorundasın. Daha sonra bu iki (yada birden fazla) üniteli sistemin hangisinin alış hangisinin veriş yapacağına bağlı olarak her iki tarafta da RS485 entegresinin 2-3 nolu pinlerine ilgili lojik seviyeyi verip yönendirme yapacaksın.
ALış veriş işlemi sabit ise yani işlemci hep veren (yada alan) PLC hep alan (yada veren) ise iligili yönlendirme pinlerine sabit (kalıcı) bir değer verilebilir.
Kullanılacak kablo tamamen iki ünite arasındaki mesafeye bağlıdır. Mesafe kısa ise mesela 100m nin altında ise ikili (iki damarlı) telefon kablosu bile kullanabilirsin. Ama emniyetli olsun diyorsan kullanacağın kablo aşağıdaki linkte olandır.
http://www.ersekablo.com.tr/tr-TR/rs-485/3/19/405
Bu kabloda ana özellik çift olan kabloların bir birlerinin üzerinde bükülmüş olmasıdır. Buna twisted kablo deniliyor. Yalnızca bir çiftini kullanman yeterli veya yalnızca bükülmüş iki damar ve blendajı olan bir kabloda işini görür.
Hepsi bu kadar. Anlaşılmayan bir husus olursa sorarsın.

RS485 konusunda bir çalışmamız var idi. Dolaylı bir çalışma ama incelemeni özellikle şemalarada bakmanı öneririm.

https://etepic.com/index.php/topic,57.0.html

Ete


Merhaba, yardımınız için tekrardan teşekkür ederim. Haberleşme anlamında şuan için bir sıkıntım yok.

Fakat farklı bir soruna çözüm aramaktayım. PIC'in 14 tane çıkışını ayrı ayrı kullanarak PLC'ye bilgi aktarıyordum.
Yani PLC'de de 14 tane girişi kullanıyordum. RS485 haberleşme ile bunun önüne geçmek istedim.

Ama picin bu çıkışlarını nasıl bir yöntemle aktarabileceğimi çözemedim.

Şöyle ki; B Portunun 0'dan 8. pinine kadar ve e portunun 0'dan 4.pinine kadar tüm hepsi çıkış. Bunları tek tek plc'ye gönderiyorum. Çok fazla giriş işgal ediyor ve çok fazla kablo kalabalığı oluyor. Bunun yerine rs485 ile bağlanıp bu çıkışları plc'ye aktarmak istedim. Ama nasıl bir yöntem kullanacağımı çözemedim.

Yardım ederseniz çok sevinirim.



Düzeltme: PIC'teki 14 çıkış sensörler için kullanıldı. Bunlarda plc'ye ayrı ayrı girdiği için hangi sensörün görüp görmediğini direkt plc girişimden anlıyorum. PIC'teki bu çıkışları bir araya getirip 14 bitlik bir veri göndermem gerekiyor. Yani sensörlerimin hepsi görüyorsa pic'te ki ilgili portlar 1111111...1 şeklinde olacak. Bunu plc'ye aktarabilirsem sorunum çözülecek. Ama PIC'in bu portlarındaki bilgileri nasıl bir araya getireceğimi çözemedim.

a.zorba

#4
aradıgınız sistem hemen hemen bütün PLC lerin destekledigi  modbus protokolu.
 MCU PLC  veya MCU DOP  ile 485 portundan modbus protokolu ıle haberleşebilirsin.

 

Mayhoş

Alıntı yapılan: a.zorba - 10 Aralık 2019, 14:37:27aradıgınız sistem hemen hemen bütün PLC lerin destekledigi  modbus protokolu.
 MCU PLC  veya MCU DOP  ile 485 portundan modbus protokolu ıle haberleşebilirsin.

 

Cevabınız için teşekkürler. Takıldığım kısım pic'in portlarındaki bilgiyi nasıl bir araya getirip göndereceğim. Pic'de bir program yazmam gerekli diye düşünüyorum.

Örneğin;

B portundaki bilgiler : 0 1 1 0 1 1 1 1 0
E portundaki bilgiler : 1 1 0 1 1

olsun. Ben rs485 ile bu portlardaki bilgileri bir araya getirip "0 1 1 0 1 1 1 1 0 1 1 0 1 1" gibi bir veri göndermem lazım. Modbus protokolüyle haberleşeceğim tamam ama bu şekilde port bilgilerini nasıl bir araya getireceğim?

Ya da tek tek göndermem mümkün mü rs485 ile? Mesela Portb.0=0 , Portb.1=1 şeklinde plc ye bilgi gönderip plc üzerine kayıt edip bir araya getirebilir miyim? ve yine tek tek göndermem gerekiyorsa nasıl bir kod ile bu durumu aşmam lazım.

Yardımınız için teşekkürler.

a.zorba

Alıntı yapılan: emaxx - 10 Aralık 2019, 14:48:33Ya da tek tek göndermem mümkün mü rs485 ile? Mesela Portb.0=0 , Portb.1=1 şeklinde plc ye bilgi gönderip plc üzerine
mümkün. benzerlerini   stm32 + DOP panel ile yaptım 
örnek olması açısından
https://etepic.com/index.php?topic=2096.0
  ve  pp de fxdev ve tagli nin modbus slave  kutuphaneleri var onlara bir bak 

Mayhoş

Yardımınız için teşekkür ederim.

Sorunumla ilgili şöyle bir örnekten ilerlemek istiyorum.

Örneğin aşağıdaki devrede B portuna lojik bilgiler gönderdim.



#include <16F84A.h>

#fuses XT,NOWDT,NOPROTECT

#use delay(clock=4000000)

#use rs232(baud=9600, xmit=PIN_A1, rcv=PIN_A2)

#byte port_b = 6

main() {

   int data;

   set_tris_b( 0x00 );	

   printf("calisiyor\n\r");

   while (TRUE)
   {

     data = port_b; 
     printf("%d", data);
     delay_ms(1000);

   } 
}

PIC içerisinede yukarıdaki programı yükledim. Terminalde picin B portundaki değerleri görmeyi istiyorum ama farklı karakterler görünmekte. Mesela bu devrede ya da programda ne gibi değişiklik yaparsam simülasyondaki terminalde 0000...00 görürürüm?

Mayhoş



#include <16F84A.h>

#fuses XT,NOWDT,NOPROTECT

#use delay(clock=4000000)

#use rs232(baud=9600, xmit=PIN_A1, rcv=PIN_A2)

#byte port_b = 6   

main() {

   int data;

   set_tris_b(11111111);   
   
   printf("bilgi yaziliyor\n\r");
   

   while (TRUE)
   {

     data = port_b; 
     printf("\n\r%d", data);
     delay_ms(500);
     
   }//sürekli tekrarla 
}


Merhaba,

Sorunumu çözdüm. Ufak bir dikkatsizlik, B portunu çıkış olarak atamışım programda ve lojik giriş vermeye çalışıyordum. O kısmı düzelttim. Fakat şimdi en sondaki pini 1 yapınca 128 bilgisi yerine -128 görmekteyim. Diğer pinleri açınca son bitten çıkarma işlemi yapıyor. İşaret biti gibi bir kavram vardı sanırım. Ama ben sondaki çıkışımıda aktif edince 128 görmek istiyorum. Diğer bitlerle toplansın o da. Ki çıkışımı tekrar binarye çevirdiğimde hangi pinler aktif anlayabilmem lazım. Nasıl yapabilirim acaba bunu?

Powered by EzPortal