Uno + ENC28J60 ile Modbus TCP slave: modbus poll bağlanıyor ama cevap gelmiyor
Bitirme projesinde bir Arduino Uno’yu Modbus TCP slave yapmaya çalışıyorum. Elimde ENC28J60 Ethernet modülü var (mavi kart, SPI). Plan şu: Uno 3 sıcaklık değerini holding register 0-2’de tutacak, bir Raspberry Pi bunları pymodbus ile okuyup Hermetry’ye gönderecek. Pi tarafı hazır, gerçek bir PLC ile denedim, çalışıyor.
Uno tarafında UIPEthernet kütüphanesi ile ping atabiliyorum, port 502’ye bağlanılıyor. Ama Modbus Poll’dan okuma isteyince «Timeout error» alıyorum. Derleme çıktısı şöyle:
Sketch uses 26814 bytes (83%) of program storage space.
Global variables use 1789 bytes (87%) of dynamic memory, leaving 259 bytes for local variables.
Low memory available, stability problems may occur.
İnternette ArduinoModbus kütüphanesi öneriliyor ama o Ethernet.h istiyor, ENC28J60 ile derlenmiyor. Ne yapmalıyım?
259 byte kalmış, sorun büyük ihtimalle orada. Modbus cevabını oluşturacak yer kalmıyordur.
Oğuz Bey’e katılıyorum. ENC28J60 «aptal» bir çip, TCP/IP yığınının tamamı Uno’nun 2 KB RAM’inde dönüyor. UIPEthernet tek başına RAM’in büyük kısmını yiyor, üstüne Modbus tamponu gelince bağlantı açılıyor ama cevap oluşturulurken bellek bitiyor. Yıllar önce ev otomasyonunda aynı modülle aynı duvara çarptım, birkaç gün uğraştıktan sonra modülü çekmeceye attım.
Gerçekçi seçenekler:
W5500 (ya da W5100) modülü al. TCP/IP yığını çipin içinde, Uno’nun RAM’ini yemiyor, Ethernet.h ile çalışıyor, ArduinoModbus’ın ModbusTCPServer’ı da direkt derleniyor. Fiyat farkı birkaç kahve parası.
#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoModbus.h>
EthernetServer server(502);
ModbusTCPServer modbus;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0x00, 0x01};
void setup() {
Ethernet.begin(mac, IPAddress(192, 168, 1, 50));
server.begin();
modbus.begin();
modbus.configureHoldingRegisters(0x00, 3);
}
void loop() {
EthernetClient client = server.available();
if (client) {
modbus.accept(client);
while (client.connected()) {
modbus.holdingRegisterWrite(0, readTempX10(0)); // 23.4 °C -> 234
modbus.poll();
}
}
}
Ya da Uno yerine bir ESP32 kullan, RAM sorunu kalmıyor.
ENC28J60’ta ısrar edersen: Serial.print’leri F() ile flash’a al, kullanmadığın her şeyi çıkar, UIPEthernet ayar dosyasında soket sayısını 1’e indir. Çalışır hale gelebilir ama ders için sürekli takılan bir sistem istemezsin.
Bir de sıcaklığı float değil, 10 ile çarpılmış tamsayı olarak koy, Pi tarafında 10’a bölüp Hermetry’ye gönder. Pi’de pymodbus ile okurken adres 0’dan başladığını unutma, Modbus Poll’da «40001» gördüğün register kodda 0.
W5500 aldım, Büşra Hanım’ın koduyla ilk denemede çalıştı, Modbus Poll’da 234, 241, 229 geliyor. Derlemede dinamik bellek %41’e düştü. Pi tarafı değerleri 10’a bölüp Hermetry’ye gönderiyor, dashboard’da üç seri var. ENC28J60 çekmeceye gitti 🙂
- Debes estar registrado para responder a este debate.
Únete a la conversación
Inicia sesión para preguntar y responder, dar me gusta a las publicaciones útiles y marcar la respuesta que resolvió tu problema. Cada aportación suma puntos y niveles.

