Arduino MODBUS haberleşme

huh

Profesyonel Üye
Katılım
10 Şub 2007
Mesajlar
1,537
Puanları
281
Merhaba.

Arduino uno ile modbus haberleşme üzerinde öğrenme amaçlı çalışıyorum.

PLC ile modbus haberleşmede kullandığım USB RS485 dönüştürücüyü bilgisayara bağladım.
İnternetten bulduğum modbus slave kodunu ufak değişiklikler ile basitleştirerek arduinoya yükledim.

FULTEK scada programı ile bağlantı ayarlarını kurdum ancak bir türlü değer okuyamıyorum. Fultek ile connect bağlantı kurduğumda sürekli BAD sinyali alıyorum.

okuma yaptığım tag adresi 40001

Yanlışım nerede acaba????????

kod şöyle:

#include <SimpleModbusSlave.h>;
enum
{
// slave üzerindeki regesterlarımızı tanımlıyoruz.
// ilk register 0 numaralı adrese sahip olur ve sonrasındaki her register için adres 1 artar.
deneme,
HOLDING_REGS_SIZE // Yine buna dokunmuyoruz.Register sayımızı tutar ve otomatik artar
};
unsigned int holdingRegs[HOLDING_REGS_SIZE];
void setup()
{
modbus_configure(&Serial, 9600, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs);
modbus_update_comms(9600, SERIAL_8N2, 1);
}
void loop()
{
modbus_update();
holdingRegs[deneme] = 34; // master 0.1.0 paketinde bu değeri okuyor.
}



Arduino TTL 485 dönüştürücü ile aşağıdaki şekilde bağlı.

arduino ttl485 PC de usb-rs-485 dönüştürücü
---------- -------- ------------------------------------
2 ----------------RE,DE
1-TX ------------DI
0-RX-------------DO
...................B-------------------------------------B
...................A-------------------------------------A

Farklı bir kütüphane ve kod ile denedim yine olmadı.
hız 19200 pin 4 ayarlandı.

Yalnız burada haberleşme standardı ile ilgili çok ayrıntı yok, bu kod için biraz deneme yanılma ile ilerliyorum.

yeni kod:
#include <ModbusRtu.h>

// assign the Arduino pin that must be connected to RE-DE RS485 transceiver
#define TXEN 4

// data array for modbus network sharing
uint16_t au16data[16] = {
3, 1415, 9265, 4, 2, 7182, 28182, 8, 0, 0, 0, 0, 0, 0, 1, -1 };

/**
* Modbus object declaration
* u8id : node id = 0 for master, = 1..247 for slave
* u8serno : serial port (use 0 for Serial)
* u8txenpin : 0 for RS-232 and USB-FTDI
* or any pin number > 1 for RS-485
*/
Modbus slave(1,0,TXEN); // this is slave @1 and RS-485

void setup() {
slave.begin( 19200 ); // baud-rate at 19200
}
void loop() {
slave.poll( au16data, 16 );
}
 
Moderatör tarafında düzenlendi:
yanlış mesaj.
 
Kendi kendini çözen soru
 
Merhaba.

Arduino uno ile modbus haberleşme üzerinde öğrenme amaçlı çalışıyorum.

PLC ile modbus haberleşmede kullandığım USB RS485 dönüştürücüyü bilgisayara bağladım.
İnternetten bulduğum modbus slave kodunu ufak değişiklikler ile basitleştirerek arduinoya yükledim.

FULTEK scada programı ile bağlantı ayarlarını kurdum ancak bir türlü değer okuyamıyorum. Fultek ile connect bağlantı kurduğumda sürekli BAD sinyali alıyorum.

okuma yaptığım tag adresi 40001

Yanlışım nerede acaba????????

kod şöyle:

#include <SimpleModbusSlave.h>;
enum
{
// slave üzerindeki regesterlarımızı tanımlıyoruz.
// ilk register 0 numaralı adrese sahip olur ve sonrasındaki her register için adres 1 artar.
deneme,
HOLDING_REGS_SIZE // Yine buna dokunmuyoruz.Register sayımızı tutar ve otomatik artar
};
unsigned int holdingRegs[HOLDING_REGS_SIZE];
void setup()
{
modbus_configure(&Serial, 9600, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs);
modbus_update_comms(9600, SERIAL_8N2, 1);
}
void loop()
{
modbus_update();
holdingRegs[deneme] = 34; // master 0.1.0 paketinde bu değeri okuyor.
}



Arduino TTL 485 dönüştürücü ile aşağıdaki şekilde bağlı.

arduino ttl485 PC de usb-rs-485 dönüştürücü
---------- -------- ------------------------------------
2 ----------------RE,DE
1-TX ------------DI
0-RX-------------DO
...................B-------------------------------------B
...................A-------------------------------------A

Farklı bir kütüphane ve kod ile denedim yine olmadı.
hız 19200 pin 4 ayarlandı.

Yalnız burada haberleşme standardı ile ilgili çok ayrıntı yok, bu kod için biraz deneme yanılma ile ilerliyorum.

yeni kod:
#include <ModbusRtu.h>

// assign the Arduino pin that must be connected to RE-DE RS485 transceiver
#define TXEN 4

// data array for modbus network sharing
uint16_t au16data[16] = {
3, 1415, 9265, 4, 2, 7182, 28182, 8, 0, 0, 0, 0, 0, 0, 1, -1 };

/**
* Modbus object declaration
* u8id : node id = 0 for master, = 1..247 for slave
* u8serno : serial port (use 0 for Serial)
* u8txenpin : 0 for RS-232 and USB-FTDI
* or any pin number > 1 for RS-485
*/
Modbus slave(1,0,TXEN); // this is slave @1 and RS-485

void setup() {
slave.begin( 19200 ); // baud-rate at 19200
}
void loop() {
slave.poll( au16data, 16 );
}
Merhaba hocam iki şey sorucam 1.Kablo bağlantılarını nasıl yaptınız z merak ettim
2.modbus rtu - ascii var wpl softta arduino uno yu nasıl eşleştirdiniz yani stop bit 1 even 7 baud rate 9600 bu ayarları arduino da Nasıl yaptınız! Kullandığınız protokol ascii miydi.
Master delta plc - Slave ardunio data register lar nasıl oluyor onu anlayamadım??
Bende siz gibi öğrenmek amaçlı arduino aldım, ardunio ile fazla bilgim yok.
Bu arada iyi bayramlar
 
Son düzenleme:
Merhaba.
Sizede iyi bayramlar.
Dosyalar biryerlerde duruyor ama o işe biraz ara verdiğim için aramam lazım.

Bulduğumda buradan yazarım.

Ama yukarıda mevcut mesajdan hatırladıklarımla birşeyler yazayım.

Öncelikle plc ile denemedim. Fultek wintr scada programı ile haberleşme kurdum.

Ama pc ile olduğuna göre plc ilede olacaktır.

Ardino da verilen koda bakarsanız 9600 8N2 yazar. Baud 9600, 8 bit, none, 2 ayarlarını kullanıyor. Bu örnek kod slave için yazılmış. plc tarafı da aynı ayarlanacak ancak plc master olmalı. Rtu haberleşme.

Bağlantı şeklide önceki mesajda var. Sadece pc tarafındaki A ve B uçlarını plc de bağlayacaksınız. A-A ya B-B ye.

40001 modbus adresine karşılık plc tarafında MODRW komutu için h0 olacak, ama emin olamadım. Kontrol etmeyi ihmal etmeyin.

Benim diğer modbus ile ilgili mesajlarımda modrw komutu ve master plc ayarları ile ilgili bilgi var. Oradan veya web üzerinden bulabilirsiniz.
 
Son düzenleme:
Yıllar önce pic18f serisi ile plc kontrolünde iklimlendirme kontrolleri yapmıştım. Modbus rtu masterde ss2 ve sv2 serilerinde biraz sıkıntılı idi veriler parçalı geliyordu. Modbus master olarak en sorunsuz çalıştırdığım ES2 modeliydi. Arduinonuzu Modbus ascii kullanırsanız delta ile sıkıntısız okursunuz. Daha sonra master ve slavede kendi yaptığım kartlarımı kullandım.
 
merhabalar SimpleModbusSlave.h kütüphanesini nerden bulabilirim yardımcı olabilirmisiniz.
 

Forum istatistikleri

Konular
130,124
Mesajlar
933,332
Kullanıcılar
453,197
Son üye
Emre5212

Yeni konular

Geri
Üst