Modbus tcp client e server

Ciao a tutti. Sto cercando di creare una connessione modbus sia client che server su un unico Arduino collegandomi ad un PLC esistente. Ho utilizzato la libreria arduinomodbus.h. tutto funziona se Arduino fa da server oppure da client ma se fa sia uno che l'altro anche utilizzando 2 porte differenti 502 e 503 funziona solamente o la parte server o la parte client. Qualcuno sa dirmi se è possibile fare fare ad Arduino sia da server che fa client?

Guardando la libreria, client e server sono due classi distinte quindi dovrebbe funzionare.

Puoi mettere il codice che stai usando?

Buongiorno !
Ecco il codice che ho usato , in questo caso ho provato a fare si che Arduino facesse sia da Clien che da Server, funziona solo la parte Server.

Se però elimino la parte server allora funziona anche solo il client.

#include <Ethernet.h>
#include <ArduinoModbus.h>

bool _1s;
int stato_spezzata;
unsigned long  HodingResult, InputResult, i, StartingAddr;
long Cmd;


EthernetServer EthServer(502);
ModbusTCPServer modbusTCPServer;
EthernetClient ethClient;
ModbusTCPClient modbusTCPClient(ethClient);
IPAddress server(192, 168, 0, 154); // update with the IP Address of your Modbus server
void setup() {
  // Ethernet Settings
  byte mac[] = { 0x4E, 0xA0, 0xBE, 0x3F, 0xFE, 0x0F };  // Define MAc address
  byte ip[] = { 192, 168, 0, 155 };                      // Define IP address
  byte subnet[] = { 255, 255, 255, 0 };                 // Define SubNEt mask



  // initialize the ethernet device
  Ethernet.begin(mac, ip, subnet);                      // Assign MAC, IP, and subnet mask
  Serial.begin(9600);
  EthServer.begin();          // start listening for clients
  modbusTCPServer.begin();    // start listening for clients

  // Define Holding register:
  HodingResult = modbusTCPServer.configureHoldingRegisters(0, 10);
  InputResult = modbusTCPServer.configureInputRegisters(0, 10);

}

void loop() {
  // Modbus server accept incoming connections
  EthernetClient client = EthServer.available();

  if (client.connected()) {
    modbusTCPServer.accept(client);
    // poll for Modbus TCP requests, while client connected
    modbusTCPServer.poll();
    // Serial.print("poll");
  }



  // Modbus server  :

  // holding resgiter 40001:  (FC3)
  modbusTCPServer.holdingRegisterWrite(0x01, 45); //registro 2 su Logo



  modbus_leggi();

}

void modbus_leggi()
{
  if (!modbusTCPClient.connected()) {
    // client not connected, start the Modbus TCP client
    Serial.println("Attempting to connect to Modbus TCP server");

    if (!modbusTCPClient.begin(server, 503)) {
      Serial.println("Modbus TCP Client failed to connect!");
    } else {
      Serial.println("Modbus TCP Client connected");
    }
  }

  stato_spezzata = (modbusTCPClient.holdingRegisterRead(0, 0x02));
  Serial.print("spezzata ");
  Serial.println (stato_spezzata);
  delay(500);

}

@mattia237 : In conformità al REGOLAMENTO, fosse anche per una sola riga, il codice va racchiuso negli appositi tag ... :roll_eyes:

... cortesemente, quindi, edita il tuo post più sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice.

Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'intero del IDE). Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non si sarà sistemato il codice come da regolamento, nel rispetto del citato regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di fare il tutto al più presto. :wink:

Ok, grazie per le note.
Ho modificato come richiesto.

Ciao a tutti, qualcuno ha qualche idea su come si possa risolvere ?