ArduinoModbus
ArduinoModbus copied to clipboard
ID number seems not to work for modbus TCP server
Hi there. I have gotten this library running with a modified example. My ESP32 is a modbus TCP server and is getting polled from my PC using SimplyModbus software. This seems to work ok, but the code doesn't seem to care what modbus slave ID I ask for, it responds the same all the time.
In my application I need to do different things depending on which slave ID comes in with the modbus TCP query. Is there a way to do this?
I tried adding an argument to the modbusTCPServer.begin
call, like this modbusTCPServer.begin(5)
, but it still responds to all slave IDs.
Here is my code:
/*
Ethernet Modbus TCP Client Toggle
This sketch toggles the coil of a Modbus TCP server connected
on and off every second.
Circuit:
- Any Arduino MKR Board
- MKR ETH Shield
created 16 July 2018
by Sandeep Mistry
*/
#define SERIAL_PORT_HARDWARE Serial
#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoRS485.h> // ArduinoModbus depends on the ArduinoRS485 library
#include <ArduinoModbus.h>
// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
// The IP address will be dependent on your local network:
byte mac[] = {
0x98, 0x76, 0xB6, 0x11, 0x85, 0x82
};
IPAddress ip(10, 0, 6, 75);
EthernetServer ethServer(502);
ModbusTCPServer modbusTCPServer;
void updateLED() {
// read the current value of the coil
int coilValue = modbusTCPServer.coilRead(0x00);
if (coilValue) {
// coil value set, turn LED on
digitalWrite(BUILTIN_LED, HIGH);
} else {
// coild value clear, turn LED off
digitalWrite(BUILTIN_LED, LOW);
}
}
void setup() {
// You can use Ethernet.init(pin) to configure the CS pin
//Ethernet.init(10); // Most Arduino shields
//Ethernet.init(5); // MKR ETH shield
//Ethernet.init(0); // Teensy 2.0
//Ethernet.init(20); // Teensy++ 2.0
//Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet
Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Ethernet Modbus TCP Example");
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
// Check for Ethernet hardware present
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :(");
while (true) {
delay(1); // do nothing, no point running without Ethernet hardware
}
}
if (Ethernet.linkStatus() == LinkOFF) {
Serial.println("Ethernet cable is not connected.");
}
// start the server
ethServer.begin();
// start the Modbus TCP server
if (!modbusTCPServer.begin(5)) {
Serial.println("Failed to start Modbus TCP Server!");
while (1);
}
// configure the LED
pinMode(BUILTIN_LED, OUTPUT);
digitalWrite(BUILTIN_LED, LOW);
// configure a single coil at address 0x00
modbusTCPServer.configureCoils(0x00, 1);
modbusTCPServer.configureHoldingRegisters(100,10);
}
void loop() {
// listen for incoming clients
EthernetClient client = ethServer.available();
if (client) {
// a new client connected
Serial.println("new client");
// let the Modbus TCP accept the connection
modbusTCPServer.accept(client);
while (client.connected()) {
// poll for Modbus TCP requests, while client connected
modbusTCPServer.poll();
// update the LED
updateLED();
}
Serial.println("client disconnected");
}
}