New: the AI firewall watches the whole platform and explains each incident in plain words. See how it works

Reply To: Uno + ENC28J60 ile Modbus TCP slave: modbus poll bağlanıyor ama cevap gelmiyor

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.

Accepted solution♥ 5