Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
ESP32 MODBUS Bağlantısı
#1
Merhaba,

Bilgisayar ile MODBUS cihazına bağlanıyorum ama ESP32 ile bağlanamıyorum.

MODBUS protokolü ile çalışan sıcaklık sensörü aldım.
Sensörün özellikleri bu şekildedir: 

   

Sensörü dönüştürücü ile PC'ye bağladım. MODBUS POL programı ile bağlanıp okuyabiliyorum.

   

MODBUS POL bağlantı ayarları: 

   

Burada Read Input Register ile bağlanıp veri okuyabiliyorum.

   

Bu şekilde sensörün bilgilerini sorunsuz okuyabiliyorum. 
ESP32'de ise aşağıdaki kodu kullanarak 
SLAVE ID 1, Register adres 0 olarak deneme yapıyorum ama sürekli aynı hatayı alıyorum. 

#include <Arduino.h>
#include <ModbusMaster.h>

ModbusMaster myModbus;                    

#define SLAVE_ID 1                        
             
ModbusMaster node;

void setup()
{
 Serial.begin(115200);                            
 Serial2.begin(9600);  //MODBUS
 node.begin(1, Serial2);              
}


void loop()
{

 uint8_t res = node.readInputRegisters(0, 2);
 Serial.print("res: ");
 Serial.println(res);  
 
 
 if (res == node.ku8MBSuccess) {
   Serial.print("temp: ");
   Serial.println(node.getResponseBuffer(0));
   Serial.print("hum: ");
   Serial.println(node.getResponseBuffer(1));
 } else {
   Serial.println("Modbus error!");
 }
 delay(1000);



 
}

ESP32 Serial2'ye MODBUS dönüştürücüden (MAX3485) veri almaya çalışıyorum ama hata veriyor.

   

   

Kullandığım dönüştürücü bir taraf UART diğer taraf A, B, GND RS-485 tarafıdır.

   

Arduino kodunda readInputRegisters(0, 2);  0 adresini 1,2,3,4 yapsam da aynı hatayı alıyorum. 

Sorunu nasıl çözebilirim?

İyi Çalışmalar.
Öğrenci, EEM, SAÜ.
Youtube
Cevapla
#2
MAX3485 i  Transmit veya Receive moda almak için kontrol pinleri var. Sizin kullandığınınz UART-485 modülde bu durum pek anlaşılmıyor. U2 ile gösterilen entegrenin kodu nedir. Gönderme veya alma ile ilgili durumu nasıl yönetiyorlar belki bir fikir yürütebiliriz.

Donanımsal bağlantı şu şekilde olmalı. Resimde soldaki iki bloğa odaklanın. (uC ve MAX3485) RE/DE seçimini bir şeyin kontrol etmesi gerekiyor.

Not: Kullandığınız modbus kütüphanesine hızlıca göz attım ama bu yönlendirme ile ilgili bir seçenek göremedim. Belki gözümden kaçmıştır.


scheme-jpg.172552

Bir önceki mesajda baktığım modbusmaster kütüphanesi eskiydi. Son sürümde (2.0.1) yukarıdaki mesajda bahsettiğim durum eklenmiş.

Kütüphane içerisinde verilen örnek. Kendi projeni buna göre uyarlarsın.



#include <ModbusMaster.h>

/*!
 We're using a MAX485-compatible RS485 Transceiver.
 Rx/Tx is hooked up to the hardware serial port at 'Serial'.
 The Data Enable and Receiver Enable pins are hooked up as follows:
*/
#define MAX485_DE      3     // <-------------------- BU SATIR
#define MAX485_RE_NEG  2     // <-------------------- BU SATIR

// instantiate ModbusMaster object
ModbusMaster node;

void preTransmission()  // <-------------------- BU SATIR
{
 digitalWrite(MAX485_RE_NEG, 1);
 digitalWrite(MAX485_DE, 1);
}

void postTransmission() // <-------------------- BU SATIR
{
 digitalWrite(MAX485_RE_NEG, 0);
 digitalWrite(MAX485_DE, 0);
}

void setup()
{
 pinMode(MAX485_RE_NEG, OUTPUT);
 pinMode(MAX485_DE, OUTPUT);
 // Init in receive mode
 digitalWrite(MAX485_RE_NEG, 0); // <-------------------- BU SATIR
 digitalWrite(MAX485_DE, 0); // <-------------------- BU SATIR

 // Modbus communication runs at 115200 baud
 Serial.begin(115200);

 // Modbus slave ID 1
 node.begin(1, Serial);
 // Callbacks allow us to configure the RS485 transceiver correctly
 node.preTransmission(preTransmission); // <-------------------- BU SATIR
 node.postTransmission(postTransmission); // <-------------------- BU SATIR
}

bool state = true;

void loop()
{
 uint8_t result;
 uint16_t data[6];
 
 // Toggle the coil at address 0x0002 (Manual Load Control)
 result = node.writeSingleCoil(0x0002, state);
 state = !state;

 // Read 16 registers starting at 0x3100)
 result = node.readInputRegisters(0x3100, 16);
 if (result == node.ku8MBSuccess)
 {
   Serial.print("Vbatt: ");
   Serial.println(node.getResponseBuffer(0x04)/100.0f);
   Serial.print("Vload: ");
   Serial.println(node.getResponseBuffer(0xC0)/100.0f);
   Serial.print("Pload: ");
   Serial.println((node.getResponseBuffer(0x0D) +
                   node.getResponseBuffer(0x0E) << 16)/100.0f);
 }

 delay(1000);
}

Cevapla
#3
(01-05-2025, Saat: 09:45)frmman Adlı Kullanıcıdan Alıntı: MAX3485 i  Transmit veya Receive moda almak için kontrol pinleri var. Sizin kullandığınınz UART-485 modülde bu durum pek anlaşılmıyor. U2 ile gösterilen entegrenin kodu nedir. Gönderme veya alma ile ilgili durumu nasıl yönetiyorlar belki bir fikir yürütebiliriz.

Donanımsal bağlantı şu şekilde olmalı. Resimde soldaki iki bloğa odaklanın. (uC ve MAX3485) RE/DE seçimini bir şeyin kontrol etmesi gerekiyor.

Not: Kullandığınız modbus kütüphanesine hızlıca göz attım ama bu yönlendirme ile ilgili bir seçenek göremedim. Belki gözümden kaçmıştır.


scheme-jpg.172552

Bir önceki mesajda baktığım modbusmaster kütüphanesi eskiydi. Son sürümde (2.0.1) yukarıdaki mesajda bahsettiğim durum eklenmiş.

Kütüphane içerisinde verilen örnek. Kendi projeni buna göre uyarlarsın.



#include <ModbusMaster.h>

/*!
 We're using a MAX485-compatible RS485 Transceiver.
 Rx/Tx is hooked up to the hardware serial port at 'Serial'.
 The Data Enable and Receiver Enable pins are hooked up as follows:
*/
#define MAX485_DE      3     // <-------------------- BU SATIR
#define MAX485_RE_NEG  2     // <-------------------- BU SATIR

// instantiate ModbusMaster object
ModbusMaster node;

void preTransmission()  // <-------------------- BU SATIR
{
 digitalWrite(MAX485_RE_NEG, 1);
 digitalWrite(MAX485_DE, 1);
}

void postTransmission() // <-------------------- BU SATIR
{
 digitalWrite(MAX485_RE_NEG, 0);
 digitalWrite(MAX485_DE, 0);
}

void setup()
{
 pinMode(MAX485_RE_NEG, OUTPUT);
 pinMode(MAX485_DE, OUTPUT);
 // Init in receive mode
 digitalWrite(MAX485_RE_NEG, 0); // <-------------------- BU SATIR
 digitalWrite(MAX485_DE, 0); // <-------------------- BU SATIR

 // Modbus communication runs at 115200 baud
 Serial.begin(115200);

 // Modbus slave ID 1
 node.begin(1, Serial);
 // Callbacks allow us to configure the RS485 transceiver correctly
 node.preTransmission(preTransmission); // <-------------------- BU SATIR
 node.postTransmission(postTransmission); // <-------------------- BU SATIR
}

bool state = true;

void loop()
{
 uint8_t result;
 uint16_t data[6];
 
 // Toggle the coil at address 0x0002 (Manual Load Control)
 result = node.writeSingleCoil(0x0002, state);
 state = !state;

 // Read 16 registers starting at 0x3100)
 result = node.readInputRegisters(0x3100, 16);
 if (result == node.ku8MBSuccess)
 {
   Serial.print("Vbatt: ");
   Serial.println(node.getResponseBuffer(0x04)/100.0f);
   Serial.print("Vload: ");
   Serial.println(node.getResponseBuffer(0xC0)/100.0f);
   Serial.print("Pload: ");
   Serial.println((node.getResponseBuffer(0x0D) +
                   node.getResponseBuffer(0x0E) << 16)/100.0f);
 }

 delay(1000);
}



Merhaba,

Elimdeki çeviricinin bir tarafı Rs485 A,B,GND diğer taraf UART şeklinde VCC,GND,RX,TX. 
Bu modül ile Uno işlemcisi ile sensöre bağlananları görüp almıştım.
Sizin verdiğiniz örnekteki çevirici galiba bu:
 
   

ESP32 de olmayınca bu sabah arduiuno Mega ile denedim yine olmadı.
Deneme yanılma ile sorunu buldum. 
Adres 0x0001 , modül ile işlemci arasındaki bağlantı TX->TX, RX->RX olunca veri geldi. Huh
   
     
#include <Arduino.h>
#include <ModbusMaster.h>

ModbusMaster node;
void setup()
{
 Serial.begin(115200);//esp32
 Serial2.begin(9600); //modbus

 node.begin(1, Serial2);
}

void loop()
{
 uint8_t result;
 uint16_t data[2];

 result = node.readInputRegisters(0x0001, 2);
 Serial.print("res");
 Serial.println(result);


 if (result == node.ku8MBSuccess)
 {
     data[0] = node.getResponseBuffer(0);
     data[1] = node.getResponseBuffer(1);

     float sicaklik = data[0] / 10.0;
     float nem = data[1] / 10.0;

     Serial.print("sicaklik");
     Serial.println(sicaklik);
     Serial.print("nem");
     Serial.println(nem);
 }
 
delay(1000);
}
Öğrenci, EEM, SAÜ.
Youtube
Cevapla
#4
Probleminizi çözmenize sevindim.

Hobi amaçlı üretilen modüllerde dokümantasyon, notasyon gibi konularda maalesef çok özenli olmuyorlar. Modülün üzerinde yazan notasyon ile fiziksel gerçeklik bazen farklı olabiliyor.

Yukarıdaki mesajımda elinizdeki modüldeki U2 entegresinin kodunu sormuştum. DE/RE seçim işlemini ona yaptırmışlar gibi görünüyor. Üzerinde yazan kod okunabiliyorsa merakımız giderilmiş olur.

fr3t1g5.png
Cevapla
#5
(02-05-2025, Saat: 08:59)frmman Adlı Kullanıcıdan Alıntı: Probleminizi çözmenize sevindim.

Hobi amaçlı üretilen modüllerde dokümantasyon, notasyon gibi konularda maalesef çok özenli olmuyorlar. Modülün üzerinde yazan notasyon ile fiziksel gerçeklik bazen farklı olabiliyor.

Yukarıdaki mesajımda elinizdeki modüldeki U2 entegresinin kodunu sormuştum. DE/RE seçim işlemini ona yaptırmışlar gibi görünüyor. Üzerinde yazan kod okunabiliyorsa merakımız giderilmiş olur.

fr3t1g5.png

Merhaba, 

Okuyabildiğim kadarıyla 74HC04 entegresi.

   


İyi Çalışmalar.
Öğrenci, EEM, SAÜ.
Youtube
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Star Modbüs veri göndermek TurboPascal 5 2.457 06-10-2021, Saat: 09:38
Son Yorum: TurboPascal



Konuyu Okuyanlar: 1 Ziyaretçi