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);
}