Code Monkey home page Code Monkey logo

arduinomodbus's Introduction

Modbus Library for Arduino

Check Arduino status Compile Examples status Spell Check status

Use Modbus with your Arduino.

Using TCP or RS485 shields, like the MKR 485 Shield. This library depends on the ArduinoRS485 library.

This library is based on libmodbus, modifications were made to the lower level RS485 and TCP layers to use Arduino Serial/RS485 and Client API’s. Then an Arduino friendly API was added on top.

For more information about this library please visit us at https://www.arduino.cc/en/ArduinoModbus/ArduinoModbus

Useful resources

License

Copyright (c) 2018 Arduino SA. All rights reserved.

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

arduinomodbus's People

Contributors

adamcummick avatar aentinger avatar akash73 avatar ant32 avatar dependabot[bot] avatar facchinm avatar hannes7eicher avatar jahartley avatar karlsoderby avatar kidpixo avatar kscholty avatar manchoz avatar mhei avatar nsted avatar patricklaf avatar per1234 avatar rocketct avatar sandeepmistry avatar simonfj20 avatar stephane avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

arduinomodbus's Issues

Can I use the MAX485?

Can i use the max485 instead of using the other shield?
do you know if you have any more settings than just changing the builder parameters? #

Can not communicate with ArduinoMega2560

I try this library to Arduino Mega 2560, but can not respond, and i try to arduino nano it success.

#include <ArduinoRS485.h> // ArduinoModbus depends on the ArduinoRS485 library
#include <ArduinoModbus.h>

const int numCoils = 10;
const int numDiscreteInputs = 10;
const int numHoldingRegisters = 10;
const int numInputRegisters = 10;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  if (!ModbusRTUServer.begin(1, 9600)) {
    //Serial.println("Failed to start Modbus RTU Server!");
    while (1);
  }

  ModbusRTUServer.configureHoldingRegisters(0x00, numHoldingRegisters);
  
}

void loop() {
  ModbusRTUServer.poll();
  
  // put your main code here, to run repeatedly:
  for (int i = 0; i < numHoldingRegisters; i++) {
    ModbusRTUServer.holdingRegisterWrite(i, 12345); 
  }
}

Problems debugging the library

Hey everyone,
hope you're all safe and sound (as possible) during these dark times.

Aditional Information

  • SAMD based board
  • Arduino IDE 1.8.13

Problem

I'm using the ArduinoModbus library and so far so good. However, yesterday, I tried communicating with a different hardware with the Arduino as the slave to have its input registers read. The code, Modbus RTU Server Kitchen Sink with little modifications, receives the message right (added print function to the .cpp) but doesn't reply as it should.

Due to most past of the core code being in c i can't use Serial.print() to debug and looks like printf and fprintf doesn't work (at least not for me).

Have anyone managed to make those two functions work? How are you debugging it?

(Slave/Server) Serial Monitor

21:23:06.865 -> Received: 2A040000000137D1 
21:23:06.902 -> RETURN: modbus_reply: 7

(Master/Client) Serial Monitor

Master send:2A040000000137D1
Master received:

Cannot stop Modbus RTU communication

Hello,
for few days I'm trying to solve this problem somehow but without any luck.
I'm using Arduino Nano with connected TTLtoRS484 module.
Arduino is connected to my laptop via USB cable.
With you class I can read and write data to my modbus end device.
The problem is that I cannot stop modbus connection after its started.
I want to be able to read Serial inputs - like from Arduino IDE serial monitor like that:

if(Serial.available() > 0) { inputCommand = Serial.readStringUntil('\n'); Serial.println(inputCommand); }

I'm able to do this before calling:
ModbusRTUClient.begin(9600, SERIAL_8N1);

....but after above I cannot do anything - I used ModbusRTUClient.end(), I was trying to restart Serial communication by Serial.end(), but now i don't know what to do in order to make it work.

I know that in my case its hard to use Modbus connection and serial read from input, because I have just one serial TX/RX, so I was trying to use some softwareSerial libs, but without success (maybe i connected something wrong i dont know).

If for example there is a way for sending request via modbus, then close/pause connection and use Serial input for other things it would be great.

Do you think there can be solution for this ?

SERIAL_8N1 error on Siemens IoT2020 (Intel Galileo Gen2)

I am trying to compile a Modbus TCP server for the Siemens IoT2020 (seens as a Intel Galileo Gen2 board from the Arduino IDE point of view), and I am getting the following error:


In file included from C:\Users\cdh4u\Documents\Arduino\libraries\ArduinoModbus\src/ArduinoModbus.h:23:0,
from C:\Users\cdh4u\Desktop\NiryoConveyerBeltControllerModbus\NiryoConveyerBeltControllerModbus.ino:10:
C:\Users\cdh4u\Documents\Arduino\libraries\ArduinoModbus\src/ModbusRTUClient.h:38:55: error: 'SERIAL_8N1' was not declared in this scope
In file included from C:\Users\cdh4u\Documents\Arduino\libraries\ArduinoModbus\src/ArduinoModbus.h:24:0,
from C:\Users\cdh4u\Desktop\NiryoConveyerBeltControllerModbus\NiryoConveyerBeltControllerModbus.ino:10:
C:\Users\cdh4u\Documents\Arduino\libraries\ArduinoModbus\src/ModbusRTUServer.h:39:63: error: 'SERIAL_8N1' was not declared in this scope
Multiple libraries were found for "EthernetClient.h"
Used: C:\Users\cdh4u\Documents\ArduinoData\packages\Intel\hardware\i586\1.6.7+1.0\libraries\Ethernet
Not used: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\libraries\Ethernet
exit status 1
Error compiling for board Intel® Galileo Gen2.


Uncorrect modbuss reception packet

Trying the modbus library with the following sketch:

#include <ArduinoModbus.h>

float temperature, humidity;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("Modbus Temperature Humidity Sensor");

  if (!ModbusRTUClient.begin(9600)) {
    Serial.println("Failed to start Modbus RTU Client!");
    while (1);
  }
}
 int i=0;
void loop() {
  if (!ModbusRTUClient.requestFrom(1, HOLDING_REGISTERS, 0x00, 2)) {
    Serial.print("failed to read registers! ");
    Serial.println(ModbusRTUClient.lastError());
  } else {
    short rawtemperature = ModbusRTUClient.read();
    short rawhumidity = ModbusRTUClient.read();
    temperature = rawtemperature / 10.0;
    humidity = rawhumidity / 10.0;
    Serial.println(temperature);
    Serial.println(humidity);
  }
 Serial.println(i);
  delay(1000);
  i++;
  if(i>2){
    while(1);
  }
}

rise an issue related to reception of the packet from the RS485 channels, it alternate a good reception with a discard, as show in the in the image.
I have sniffed the channel with the Saleae analyzer, and the packet are the same, the capture are in the following .zip.

modbus.zip

The problem could be located in the library libmodusb/modbus.c in modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest) or in the integrity check function of the class modbus_backend_type_t.
In particular must be checked how the CRC is calculated in two consecutive reading from the RS485 .
Following, also, a stamp of serial monitor output:

modbusissue

ESP32

Hi,
How i can use this library for ESP32 Dev kit?
Thanks a lot

ESP32

PIN 2 not working like INPUT

Arduino Mega 2560
pinMode(2, INPUT_PULLUP);

after
ModbusRTUServer.begin(1, 9600);

digital input 2 not working.

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

Conflict with serial MKR 1010

Hi,

I tried the ModBusRTUClient class with the RS485 shield for MKR 1010. I had no troubles to read holding registers when I was debugging with USB plug connected.
But when I removed the cable, I was unable to read Modbus and I have a long timeout when I try to read it.
I tried to not use Serial USB, but i encountered the same problem, when I unplug the cable I was unable to read the modbus. I also tried to supply my board on USB 5V without communication and without success.

Someone already encountered this issue?

Thanks in advance!

Blocked Communication

I have a project where I read serveral modbus register. It works so far. If I will store the values to mySql database, the communication is blocked. I have tried with the mySql _Connection Library and via php-script. Both storage-applications are running, if I used in separate sketches.
My hardware is an Arduino Mega2560 with an Ethernet Shield 2.
The inserted libraries are: ArduinoModbus Version 1.0.3, MySql_Connection Version 1.2.0.

TCP Server in endless loop when client doesn't close

Hi guys,

I'm trying to provide values from my MKRZERO + MKR ETH Shield to my home automation server (Loxone Miniserver).
I ran into an issue with your example.

You are in a while-loop as long as the client is connected:

...
    while (client.connected()) {
      // poll for Modbus TCP requests, while client connected
      modbusTCPServer.poll();

      // update the LED
      updateLED();
    }
...   

My client (Loxone Miniserver) doesn't close the connection after reading it (I can't change this behaviour!). So I'm stuck here as my MKRZero wants to do different things as well in its void loop().

My idea was now to close the TCP connection from my/Arduino side once everything is done (reads are replied to, writes are written).

WiFiModbusServerLED.ino: Update 1:

...
    // WHILE is now an IF
    if (client.connected()) {
      // poll for Modbus TCP requests, while client connected
      modbusTCPServer.poll();

      // update the LED
      updateLED();

      // CLOSE the connection
      client.stop();
    }
...   

Is this a valid approach to close the connection?

The issue now is that not everything is processed the client wants to do. I reckon this is because the modbusTCPServer.poll() is not in a loop anymore.
After investigating the modbusTCPServer.poll() method I think this problem can be solved by giving it a return value.

WiFiModbusServerLED.ino: Update 2:

...
    // WHILE is now an IF
    if (client.connected()) {
      // processing ALL requests until nothing is to do anymore
      while(modbusTCPServer.poll()>0);

      // update the LED
      updateLED();

      // CLOSE the connection
      client.stop();
    }
...   

This has to go of course with this (including all the virtual stuff in all the other files):
ModbusTCPServer.cpp: Update 1:

int ModbusTCPServer::poll()
{
  if (_client != NULL) {
    uint8_t request[MODBUS_TCP_MAX_ADU_LENGTH];

    int requestLength = modbus_receive(_mb, request);

    if (requestLength > 0) {
      modbus_reply(_mb, request, requestLength, &_mbMapping);
    }
    return requestLength;
  }
  return -1;
}

Does this make sense to you guys and is it a valid approach?

Arduino: Crash when calling ModbusTCPServer.begin()

ModbusTCPServer.begin() initializes the client in the libmodbus data structure with NULL and
then calls close() which in turn tries to call the client's stop function.
This leads to a NULL-Pointer access.

ModbusRTUClient.read()

Hopefully someone can point me in the right direction, im probably making this more complicated than it really is.

When a requestform is sent to the slave node, and the client gets a response. Where is that response stored in memory?

Invalid CRC error

I'm using the latest version of the library. Via the rs485 library, I can get my counter to answer the request correctly. Implementing the sketch with this lib, it gives me Invalid CRC error and Response not from requested slave.
So there is a problem with the receiving buffer. Could it be timeout? I think it is splitting the msg in two.

HW:
Arduino MKR WIFI1010 with MKR485 shield
Finder 7E.64.8.230.0210 Meter

Does Not Work With Portenta H7 MachineControl

Unfortunately ModbusRTUServer does not seem to work with the portenta machinecontrol, using the kitchen sink examples and connecting 2 machinecontrol boards together the client connection times out on every read and write request. Additionally using the machinecontrol as a server and a third party device as a client the result is the same.

I have successfully used ModbusRTUClient on the machinecontrol with a third party device.

Can anyone else confirm this or give me pointers so that i can attempt to debug the issue further myself ?

ModbusRTUServer not working on baudrate above 32000 in Arduino mega 2560

I'm using an Arduino mega 2560 as a slave on rs485 networks where the master is pc with a python script on baudrate 115200
the ArduinoModbus is working fine with baudrate under 32000 no problem.
but it's freezing on the poll() function on any baud rate above 32000
ModbusRTUServer.poll();
get stuck a few ms and then continue the loop but with no reply or error
note : i have tested the same setup on baudrate 115200 in stm32F446RE and its working fine!

Compiler Warnings

This library has many compiler warnings. For example, compiling for SAMD MKR1000 with Preferences set to All warnings gives this:

In file included from /home/paul/teensy/sketch/libraries/ArduinoModbus/src/ModbusRTUClient.cpp:27:0:
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/ModbusRTUClient.h: In constructor 'ModbusRTUClientClass::ModbusRTUClientClass(RS485Class&)':
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/ModbusRTUClient.h:44:25: warning: 'ModbusRTUClientClass::_rs485' will be initialized after [-Wreorder]
   RS485Class* _rs485 = &RS485;
                         ^~~~~
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/ModbusRTUClient.cpp:35:36: warning:   base 'ModbusClient' [-Wreorder]
   _rs485(&rs485), ModbusClient(1000)
                                    ^
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/ModbusRTUClient.cpp:34:1: warning:   when initialized here [-Wreorder]
 ModbusRTUClientClass::ModbusRTUClientClass(RS485Class& rs485) :
 ^~~~~~~~~~~~~~~~~~~~
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/libmodbus/modbus.c: In function '_sleep_response_timeout':
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/libmodbus/modbus.c:161:5: warning: implicit declaration of function 'delay' [-Wimplicit-function-declaration]
     delay(ctx->response_timeout.tv_sec * 1000);
     ^~~~~
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/libmodbus/modbus.c:162:5: warning: implicit declaration of function 'delayMicroseconds' [-Wimplicit-function-declaration]
     delayMicroseconds(ctx->response_timeout.tv_usec);
     ^~~~~~~~~~~~~~~~~
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/libmodbus/modbus.c: In function '_modbus_receive_msg':
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/libmodbus/modbus.c:501:20: warning: this statement may fall through [-Wimplicit-fallthrough=]
                 if (length_to_read != 0) {
                    ^
/home/paul/teensy/sketch/libraries/ArduinoModbus/src/libmodbus/modbus.c:505:13: note: here
             case _STEP_META:
             ^~~~

The "implicit declaration of function" warnings are only because Arduino.h is not included, by code using Arduino APIs. Easy to fix.

Arduino Nano Output D2 lighting up on Modbus msg

Hey guys, I am not sure if this is the right way to ask about this.

I am using your library in my project to set outputs on my Nano via Modbus.
The Nano is setup as a RTUServer and I have configured several registers to set different outputs. It's all working as its supposed to be, except the output on D2. Everytime a Modbus message is received or sent (can't make out if it's just on either send or receive), the output on D2 (my LED) lights up quickly. This only happens when D2 is low, I can see no flickering when D2 is high already.
I have found nothing about this in the library nor in the Nano specs and it only lights up when a Modbus message is sent/recvd.
The nano handles non-modbus standard messages as well and these do not trigger D2.
Any insight into this issue would be greatly appreciated, I would just like to know why this happens.

I've included my code, but please be gentle.

I have tried to not configure D2 as an output but it still lights up.

ArduinoModbus.txt

holdingRegisterWrite() stop after some hours

Hi,

I have the example led which I've added holdingRegisterWrite function for lm35 sensor temperature.

All works fine, but after some hours holding Register stops working, coil register keeps working properly.

Any ideas?

Sorry, after some test I've saw that the problem is generic for all system, holding registers and coils. The problem looks like lots connection or something like that.

Add configuration for rx buffer size in Modbus RTU server

I'm using this library as a Modbus RTU server on a Arduino Nano board.

Since I have a lot of other libraries, RAM usage is very high and the application crashes due to stack overflow.

I noticed that inside ModbusRTUServerClass:Poll(), a request buffer is allocated:

void ModbusRTUServerClass::poll()
{
  uint8_t request[MODBUS_RTU_MAX_ADU_LENGTH];

  int requestLength = modbus_receive(_mb, request);

  if (requestLength > 0) {
    modbus_reply(_mb, request, requestLength, &_mbMapping);
  }
}

MODBUS_RTU_MAX_ADU_LENGTH is 256 bytes, which is more than 10% of the RAM available on the Arduino Nano.

Since all Modbus messages in my application are way smaller than that, I added a parameter to the class beginmethod in order to choose the request buffer size.

Do you think that could be useful? I can open a PR if you think so.

`ModbusServer::writeInputRegisters` not implemented

Hello,

When trying to use the function ModbusServer::writeInputRegisters got the following error:

/tmp/ccmQwHO6.ltrans1.ltrans.o: In function `main':
<artificial>:(.text.startup+0x996): undefined reference to `ModbusServer::writeInputRegisters(int, unsigned int*, int)'
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Mega or Mega 2560.

The function is documented under the official ArduinoModbus library site:
https://www.arduino.cc/en/ArduinoModbus/ModbusServerwriteInputRegisters

However, looking inside the code, the function seems to be defined in ModbusServer.h, but not implemented in ModbusServer.cpp.

Is there any specific reason for this or is just a lapse?

Conflict with Sercom

On a MKRZero i want to do modbus RTU slave communication using MKR485 with the ArduinoModbus library. Examples are working, so far so good. I needed an additional serial port to read information from a sensor and used for that Sercom3 on pins 0 and 1. This is also working fine.... but when i combine both .... then ModbusRTUServer.begin() is failing when i first define my sercom3 and open serial port (serial3.begin(9600)...). If i put first ModbusRTUServer.begin() in my code then this is working but serial3 (sercom3) nolonger.

I was looking into both libraries but can't find out what is causing this....

Your help is appreciated ...

thanks

Crash after 1.0.4 update

Hi,

I just update to 1.0.4 and my code crash (reboot by WDT) on the following line
... if (!ModbusRTUClient.begin(9600)) { ...

Arduino MKRZero + MKR RS485 shield + MKR Ethernet shield

Rollback to 1.0.3 and everything is OK :)

Any chance to implement software serial? and several more.

I've been reading this good article. He's been testing some libraries across the web and make some good comparison points.
Let me quote some for this particular library:

https://github.com/arduino-libraries/ArduinoModbus

  • Official library from Arduino.
  • Master and slave.
  • Uses the RS485 library to communicate, but does not offer any way to pass a custom RS485 instance, so it is effectively hardcoded to a specific serial port.
  • Offers only single value reads and writes.
  • Slave stores value internally and reads/writes directly from those, without any callback or way to detect that communication has happened.

More on the page, and I hope this reference makes a good study for further improvement.
So, for my personal request, Any chance to implement to softwareSerial? So many other boards can use this library later.

Because I want the official library can cover it all.

Thanks in advance.

ModbusTCPClient has very long and unchangeable TimeOut

Hello,

I have an unreliable ModbusTCP device I want to read via this library which sometimes just doesn't reply.

It is unfortunate that the ModbusTCPClient waits 30 seconds for a reply. Even more bad: I cannot change this timeout (excerpt of ModbusTCPClient.cpp):

int ModbusTCPClient::begin(IPAddress ip, uint16_t port)
{
  modbus_t* mb = modbus_new_tcp(_client, ip, port);

  // Here is the timeout set to 30 Seconds
  modbus_set_response_timeout(mb, 30, 0);

  return ModbusClient::begin(mb, MODBUS_TCP_SLAVE);
}

An overload would be great here! You can exchange the whole upper part with:

int ModbusTCPClient::begin(IPAddress ip, uint16_t port, uint32_t usecTimeout)
{
  modbus_t* mb = modbus_new_tcp(_client, ip, port);

  // Set Timeout to value provided
  modbus_set_response_timeout(mb, 0, usecTimeout);

  return ModbusClient::begin(mb, MODBUS_TCP_SLAVE);
}
int ModbusTCPClient::begin(IPAddress ip, uint16_t port)
{
  // Keep standard timeout of 30 seconds
  return begin(ip, port, 30000000);
}

Do you think you can make this official so I can revert my local changes in your library.

Thanks
Soko

PRESET_MULTIPLE_REGISTERS (0x10) fails on values above 10 bit, PRESET_SINGLE_REGISTER (0x06) does not.

Hello,
I am using MKR1010 Modbus TCP/IP. It seems that the command 0x10 is built in line with the Modicon (PI-MBGUS-300-REV J.) spec and the PRESET_SINGLE_REGISTER is built in line with the MODBUS APPLICATOIN PROTOCOL SPECIFICATION V1.1b3. The latter does not limit the target values to 10 bit for write to a register whereas the first does.

Proposal: remove limitation of 10 bit in library if bug analysis is correct.

In attachment debug output from a WinSock based wxWidgets test application I wrote that details the TCP/IP communication with my MKR1010 and its Ethernet shield.

printscreenfailingtransaction

.

client connect issue

I am working with this library
I can connect to the client fine , read and update holding registers in the while loop
if the client disconnects the code jumps out of the while loop as it should.
The problem I am having is that if the clients then tries to reconnect
the server does not respond and the client times out
for the client I am using a PC running MODBUS Poll.
I am using the library version 1.0.3 downloaded from Arduino site to Arduino ide.
using the feather m4.
so after the first connection was made
the function ethernetserver Available();always returns zero

client = server.available();
if(client){
modbusTCPServer.accept(client);
while (client.connected()) {

any help will be appreciated

modbus_sserver.zip

Cannot run example program on uno wifi rev 2

Despite the last fix, I cannot run the exemple program on uno wifi rev 2. I used the code in the ArduinoModbus version 1.02 modified 8 days ago, and the IDE 1.8.13 under OSX. I get the following message :

Arduino : 1.8.13 (Mac OS X), Carte : "Arduino Uno WiFi Rev2, None (ATMEGA4809)"

/Users/xxx/Library/Arduino15/packages/arduino/hardware/megaavr/1.8.6/cores/arduino/main.cpp: In function 'main':
/Users/xxx/Library/Arduino15/packages/arduino/hardware/megaavr/1.8.6/cores/arduino/api/Stream.h:50:7: warning: 'MEM[(struct Stream &)&client]._startMillis' may be used uninitialized in this function [-Wmaybe-uninitialized]
 class Stream : public Print
       ^
/Users/xxx/Documents/Arduino/libraries/WiFiNINA/src/WiFiServer.cpp:69:20: note: 'MEM[(struct Stream &)&client]._startMillis' was declared here
         WiFiClient client(sock);
                    ^
/Users/xxx/Documents/Arduino/libraries/WiFiNINA/src/WiFiClient.h:28:7: warning: 'client._socket' may be used uninitialized in this function [-Wmaybe-uninitialized]
 class WiFiClient : public Client {
       ^
/Users/xxx/Documents/Arduino/libraries/WiFiNINA/src/WiFiServer.cpp:69:20: note: 'client._socket' was declared here
         WiFiClient client(sock);
                    ^
/var/folders/kf/5_pjskbd1yg3j6qlthc39v5m0000gn/T//ccpthV3p.ltrans0.ltrans.o: In function `begin':
/Users/xxx/Documents/Arduino/libraries/ArduinoModbus-master/src/ModbusTCPServer.cpp:40: undefined reference to `modbus_new_tcp'
/Users/xxx/Documents/Arduino/libraries/ArduinoModbus-master/src/ModbusTCPServer.cpp:46: undefined reference to `modbus_tcp_listen'
/var/folders/kf/5_pjskbd1yg3j6qlthc39v5m0000gn/T//ccpthV3p.ltrans0.ltrans.o: In function `accept':
/Users/xxx/Documents/Arduino/libraries/ArduinoModbus-master/src/ModbusTCPServer.cpp:55: undefined reference to `modbus_tcp_accept'
collect2: error: ld returned 1 exit status
exit status 1
Erreur de compilation pour la carte Arduino Uno WiFi Rev2

Did I missed something ?

Best Regards
Frederic

Return error with RTU master

When I did it, I have error

[code]
include <ArduinoModbus.h>

#define Entrada0 A0
#define Entrada1 A1
#define Entrada2 A2
#define Entrada3 A3

const int numCoils = 10;
const int numDiscreteInputs = 10;
const int numHoldingRegisters = 10;
const int numInputRegisters = 10;

void setup()
{
ModbusRTUServer.configureCoils(0x00, numCoils);
ModbusRTUServer.configureDiscreteInputs(0x00, numDiscreteInputs);
ModbusRTUServer.configureHoldingRegisters(0x00, numHoldingRegisters);
ModbusRTUServer.configureInputRegisters(0x00, numInputRegisters);

Serial.begin(9600);
while (!Serial);

if (!ModbusRTUServer.begin(1, 9600))
{
while (1);
}
}

void loop()
{
ModbusRTUServer.poll();

ModbusRTUServer.holdingRegisterWrite(1,analogRead(Entrada0));
ModbusRTUServer.holdingRegisterWrite(2,analogRead(Entrada1));
ModbusRTUServer.holdingRegisterWrite(3,analogRead(Entrada2));
ModbusRTUServer.holdingRegisterWrite(4,analogRead(Entrada3));

}
[/code]

This is the error

[RTU]>Tx > 10:31:12:301 - 01 03 00 00 00 04 44 09
[RTU]>Rx > 10:31:12:316 - 01 83 02 C0 F1
Sys > 10:31:12:316 - Error : Illegal data address

I think that Rx must be this

[RTU]>Rx > 10:33:06:273 - 01 03 08 00 00 00 00 00 00 00 00 95 D7

Please can you help me?
Thank you so much, and excuse my bad english

Add support for STM32 architecture

Hello.

I'm trying this official Modbus library for Arduino IDE 1.8.13 with stm32duino.
I tried compiling ModbusRTUServerLED with no success.

image

Here is a log.

In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/boards.h:38:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:54,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish_types.h:65:1: error: unknown type name 'bool'
 typedef bool boolean;
 ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:54:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/boards.h:111:1: error: unknown type name 'bool'
 bool boardUsesPin(uint8 pin);
 ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:58:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/ext_interrupts.h:90:6: error: conflicting types for 'attachInterrupt'
 void attachInterrupt(uint8 pin, voidArgumentFuncPtr handler, void *arg,
      ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/ext_interrupts.h:69:6: note: previous declaration of 'attachInterrupt' was here
 void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode);
      ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:60:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish_math.h:59:6: error: conflicting types for 'random'
 long random(long min, long max);
      ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish_math.h:50:6: note: previous declaration of 'random' was here
 long random(long max);
      ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:60:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish_math.h:179:17: error: conflicting types for 'makeWord'
 extern uint16_t makeWord( uint8_t h, uint8_t l ) ;
                 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish_math.h:178:17: note: previous declaration of 'makeWord' was here
 extern uint16_t makeWord( uint16_t w ) ;
                 ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:63:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wiring_pulse.h:34:72: error: expected ';', ',' or ')' before '=' token
 uint32_t pulseIn( uint32_t ulPin, uint32_t ulState, uint32_t ulTimeout = 1000000L ) ;
                                                                        ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Print.h:28:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareSerial.h:38,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:69,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Printable.h:25:1: error: unknown type name 'class'
 class Print;
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Printable.h:33:1: error: unknown type name 'class'
 class Printable
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Printable.h:34:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 {
 ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareSerial.h:38:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:69,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Print.h:37:1: error: unknown type name 'class'
 class Print {
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Print.h:37:13: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 class Print {
             ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareSerial.h:40:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:69,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Stream.h:38:1: error: unknown type name 'class'
 class Stream : public Print
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Stream.h:38:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
 class Stream : public Print
              ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:69:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareSerial.h:125:1: error: unknown type name 'class'
 class HardwareSerial : public Stream {
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareSerial.h:125:22: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
 class HardwareSerial : public Stream {
                      ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareSerial.h:189:1: error: unknown type name 'HardwareSerial'
 extern HardwareSerial Serial1;
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareSerial.h:192:1: error: unknown type name 'HardwareSerial'
 extern HardwareSerial Serial2;
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareSerial.h:195:1: error: unknown type name 'HardwareSerial'
 extern HardwareSerial Serial3;
 ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:70:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareTimer.h:48:1: error: unknown type name 'class'
 class HardwareTimer {
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareTimer.h:48:21: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 class HardwareTimer {
                     ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareTimer.h:371:1: error: unknown type name 'HardwareTimer'
 extern HardwareTimer Timer1;
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareTimer.h:377:1: error: unknown type name 'HardwareTimer'
 extern HardwareTimer Timer2;
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareTimer.h:383:1: error: unknown type name 'HardwareTimer'
 extern HardwareTimer Timer3;
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/HardwareTimer.h:389:1: error: unknown type name 'HardwareTimer'
 extern HardwareTimer Timer4;
 ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:71:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/usb_serial.h:41:1: error: unknown type name 'class'
 class USBSerial : public Stream {
 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/usb_serial.h:41:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
 class USBSerial : public Stream {
                 ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/usb_serial.h:96:5: error: unknown type name 'USBSerial'
     extern USBSerial Serial;
     ^
In file included from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/wirish.h:78:0,
                 from C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/Arduino.h:30,
                 from C:\Users\rafae\OneDrive\Documentos\Arduino\libraries\ArduinoModbus\src\libmodbus\modbus.c:22:
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isAlphaNumeric':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:54:30: error: 'false' undeclared (first use in this function)
   return ( isalnum(c) == 0 ? false : true);
                              ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:54:30: note: each undeclared identifier is reported only once for each function it appears in
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:54:38: error: 'true' undeclared (first use in this function)
   return ( isalnum(c) == 0 ? false : true);
                                      ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isAlpha':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:62:30: error: 'false' undeclared (first use in this function)
   return ( isalpha(c) == 0 ? false : true);
                              ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:62:38: error: 'true' undeclared (first use in this function)
   return ( isalpha(c) == 0 ? false : true);
                                      ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isAscii':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:71:31: error: 'false' undeclared (first use in this function)
   return ( (c & ~0x7f) != 0 ? false : true);
                               ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:71:39: error: 'true' undeclared (first use in this function)
   return ( (c & ~0x7f) != 0 ? false : true);
                                       ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isWhitespace':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:78:31: error: 'false' undeclared (first use in this function)
   return ( isblank (c) == 0 ? false : true);
                               ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:78:39: error: 'true' undeclared (first use in this function)
   return ( isblank (c) == 0 ? false : true);
                                       ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isControl':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:85:31: error: 'false' undeclared (first use in this function)
   return ( iscntrl (c) == 0 ? false : true);
                               ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:85:39: error: 'true' undeclared (first use in this function)
   return ( iscntrl (c) == 0 ? false : true);
                                       ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isDigit':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:92:31: error: 'false' undeclared (first use in this function)
   return ( isdigit (c) == 0 ? false : true);
                               ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:92:39: error: 'true' undeclared (first use in this function)
   return ( isdigit (c) == 0 ? false : true);
                                       ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isGraph':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:99:31: error: 'false' undeclared (first use in this function)
   return ( isgraph (c) == 0 ? false : true);
                               ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:99:39: error: 'true' undeclared (first use in this function)
   return ( isgraph (c) == 0 ? false : true);
                                       ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isLowerCase':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:106:30: error: 'false' undeclared (first use in this function)
   return (islower (c) == 0 ? false : true);
                              ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:106:38: error: 'true' undeclared (first use in this function)
   return (islower (c) == 0 ? false : true);
                                      ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isPrintable':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:113:31: error: 'false' undeclared (first use in this function)
   return ( isprint (c) == 0 ? false : true);
                               ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:113:39: error: 'true' undeclared (first use in this function)
   return ( isprint (c) == 0 ? false : true);
                                       ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isPunct':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:121:31: error: 'false' undeclared (first use in this function)
   return ( ispunct (c) == 0 ? false : true);
                               ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:121:39: error: 'true' undeclared (first use in this function)
   return ( ispunct (c) == 0 ? false : true);
                                       ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isSpace':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:130:31: error: 'false' undeclared (first use in this function)
   return ( isspace (c) == 0 ? false : true);
                               ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:130:39: error: 'true' undeclared (first use in this function)
   return ( isspace (c) == 0 ? false : true);
                                       ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isUpperCase':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:137:31: error: 'false' undeclared (first use in this function)
   return ( isupper (c) == 0 ? false : true);
                               ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:137:39: error: 'true' undeclared (first use in this function)
   return ( isupper (c) == 0 ? false : true);
                                       ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h: In function 'isHexadecimalDigit':
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:145:32: error: 'false' undeclared (first use in this function)
   return ( isxdigit (c) == 0 ? false : true);
                                ^
C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\cores\maple/WCharacter.h:145:40: error: 'true' undeclared (first use in this function)
   return ( isxdigit (c) == 0 ? false : true);
                                        ^
Foram encontradas múltiplas bibliotecas para "Wire.h"
Usado: C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\libraries\Wire
Não usado: C:\Users\rafae\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.12.26\libraries\WireSlave
exit status 1
Erro compilando para a placa Generic STM32F103C6/fake STM32F103C8

_modbus_rtu_select() chooses insane timeout delays

For some reason the timeout for a modbus reply ends up being 1 whole second. I'm using a RTOS on my arduino and since this is talking in a timing sensitive manner it has to be wrapped by disabling the scheduler.... problem is this causes everything else to come to a halt for 1 entire second... 1 second is insanely long at 57600bps 2ms is more than enough.....

Cannot run example program on uno wifi rev 2

Hello!

I tried to run the example program on an Arduino Uno Wifi Rev. 2 but i get errors on compiling.

In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:27:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.h:35:25: error: expected ')' before '&' token
   ModbusTCPClient(Client& client);
                         ^
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.h:46:13: error: reference to 'IPAddress' is ambiguous
   int begin(IPAddress ip, uint16_t port = 502);
             ^~~~~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:24:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:13:7: note: candidates are: class IPAddress
 class IPAddress;
       ^~~~~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../Client.h:23:0,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/Client.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:27:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../IPAddress.h:35:7: note:                 class arduino::IPAddress
 class IPAddress : public Printable {
       ^~~~~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:27:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.h:46:13: error: 'IPAddress' has not been declared
   int begin(IPAddress ip, uint16_t port = 502);
             ^~~~~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.h:61:3: error: reference to 'Client' is ambiguous
   Client* _client;
   ^~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:24:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:12:7: note: candidates are: class Client
 class Client;
       ^~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/Client.h:23:0,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:27:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../Client.h:27:7: note:                 class arduino::Client
 class Client : public Stream {
       ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:29:33: error: expected constructor, destructor, or type conversion before '(' token
 ModbusTCPClient::ModbusTCPClient(Client& client) :
                                 ^
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:38:28: error: 'int ModbusTCPClient::begin' is not a static data member of 'class ModbusTCPClient'
 int ModbusTCPClient::begin(IPAddress ip, uint16_t port)
                            ^~~~~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:38:28: error: reference to 'IPAddress' is ambiguous
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:24:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:13:7: note: candidates are: class IPAddress
 class IPAddress;
       ^~~~~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../Client.h:23:0,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/Client.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:27:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../IPAddress.h:35:7: note:                 class arduino::IPAddress
 class IPAddress : public Printable {
       ^~~~~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:38:51: error: expected primary-expression before 'port'
 int ModbusTCPClient::begin(IPAddress ip, uint16_t port)
                                                   ^~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp: In member function 'int ModbusTCPClient::connected()':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:49:10: error: '_client' was not declared in this scope
   return _client->connected();
          ^~~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPClient.cpp:49:10: note: suggested alternative: 'Client'
   return _client->connected();
          ^~~~~~~
          Client
*** [.pio/build/uno_wifi_rev2/libe31/ArduinoModbus/ModbusTCPClient.cpp.o] Error 1
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:27:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.h:46:15: error: reference to 'Client' is ambiguous
   void accept(Client& client);
               ^~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:24:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:12:7: note: candidates are: class Client
 class Client;
       ^~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/Client.h:23:0,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:27:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../Client.h:27:7: note:                 class arduino::Client
 class Client : public Stream {
       ^~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:27:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.h:46:15: error: 'Client' has not been declared
   void accept(Client& client);
               ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.h:54:3: error: reference to 'Client' is ambiguous
   Client* _client;
   ^~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:24:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:12:7: note: candidates are: class Client
 class Client;
       ^~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/Client.h:23:0,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:27:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../Client.h:27:7: note:                 class arduino::Client
 class Client : public Stream {
       ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp: In constructor 'ModbusTCPServer::ModbusTCPServer()':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:30:3: error: class 'ModbusTCPServer' does not have any field named '_client'
   _client(NULL)
   ^~~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp: In member function 'int ModbusTCPServer::begin(int)':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:40:39: error: reference to 'IPAddress' is ambiguous
   modbus_t* mb = modbus_new_tcp(NULL, IPAddress(0, 0, 0, 0), 0);
                                       ^~~~~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:24:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:13:7: note: candidates are: class IPAddress
 class IPAddress;
       ^~~~~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../Client.h:23:0,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/Client.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:27:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../IPAddress.h:35:7: note:                 class arduino::IPAddress
 class IPAddress : public Printable {
       ^~~~~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp: At global scope:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:53:30: error: variable or field 'accept' declared void
 void ModbusTCPServer::accept(Client& client)
                              ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:53:30: error: reference to 'Client' is ambiguous
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:24:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:12:7: note: candidates are: class Client
 class Client;
       ^~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/Client.h:23:0,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:27:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/deprecated/../Client.h:27:7: note:                 class arduino::Client
 class Client : public Stream {
       ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:53:38: error: 'client' was not declared in this scope
 void ModbusTCPServer::accept(Client& client)
                                      ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:53:38: note: suggested alternative: 'Client'
 void ModbusTCPServer::accept(Client& client)
                                      ^~~~~~
                                      Client
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp: In member function 'virtual void ModbusTCPServer::poll()':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:62:7: error: '_client' was not declared in this scope
   if (_client != NULL) {
       ^~~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/ModbusTCPServer.cpp:62:7: note: suggested alternative: 'Client'
   if (_client != NULL) {
       ^~~~~~~
       Client
*** [.pio/build/uno_wifi_rev2/libe31/ArduinoModbus/ModbusTCPServer.cpp.o] Error 1
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:82:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp-private.h:34:5: error: reference to 'IPAddress' is ambiguous
     IPAddress ip;
     ^~~~~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:81:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:13:7: note: candidates are: class IPAddress
 class IPAddress;
       ^~~~~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/Client.h:23:0,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/ArduinoAPI.h:29,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/Arduino.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp-private.h:12,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:82:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/IPAddress.h:35:7: note:                 class arduino::IPAddress
 class IPAddress : public Printable {
       ^~~~~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:82:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp-private.h:35:5: error: reference to 'Client' is ambiguous
     Client* client;
     ^~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:81:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:12:7: note: candidates are: class Client
 class Client;
       ^~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/ArduinoAPI.h:29:0,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/Arduino.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp-private.h:12,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:82:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/Client.h:27:7: note:                 class arduino::Client
 class Client : public Stream {
       ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp: In function 'long unsigned int _modbus_tcp_send(modbus_t*, const uint8_t*, int)':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:201:21: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'client'
     return ctx_tcp->client->write(req, req_length);
                     ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp: In function 'long unsigned int _modbus_tcp_recv(modbus_t*, uint8_t*, int)':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:219:21: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'client'
     return ctx_tcp->client->read(rsp, rsp_length);
                     ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp: In function 'int _modbus_tcp_connect(modbus_t*)':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:373:19: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'client'
     if (!ctx_tcp->client->connect(ctx_tcp->ip, ctx_tcp->port)) {
                   ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:373:44: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'ip'
     if (!ctx_tcp->client->connect(ctx_tcp->ip, ctx_tcp->port)) {
                                            ^~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp: In function 'void _modbus_tcp_close(modbus_t*)':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:501:14: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'client'
     ctx_tcp->client->stop();
              ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp: In function 'int _modbus_tcp_flush(modbus_t*)':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:516:21: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'client'
     while (ctx_tcp->client->available()) {
                     ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:517:18: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'client'
         ctx_tcp->client->read();
                  ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp: At global scope:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:741:38: error: reference to 'Client' is ambiguous
 int modbus_tcp_accept(modbus_t *ctx, Client* client)
                                      ^~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:81:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:12:7: note: candidates are: class Client
 class Client;
       ^~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/ArduinoAPI.h:29:0,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/Arduino.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp-private.h:12,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:82:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/Client.h:27:7: note:                 class arduino::Client
 class Client : public Stream {
       ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:741:38: error: 'Client' has not been declared
 int modbus_tcp_accept(modbus_t *ctx, Client* client)
                                      ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp: In function 'int modbus_tcp_accept(modbus_t*, int*)':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:764:14: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'client'
     ctx_tcp->client = client;
              ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp: In function 'int _modbus_tcp_select(modbus_t*, void**, timeval*, int)':
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:834:25: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'client'
         s_rc = ctx_tcp->client->available();
                         ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:839:64: error: 'modbus_tcp_t {aka struct _modbus_tcp}' has no member named 'client'
     } while ((millis() - start) < wait_time_millis && ctx_tcp->client->connected());
                                                                ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp: At global scope:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:916:26: error: 'modbus_t* modbus_new_tcp' redeclared as different kind of symbol
 modbus_t* modbus_new_tcp(Client* client, IPAddress ip_address, int port)
                          ^~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:81:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:49:22: note: previous declaration 'modbus_t* modbus_new_tcp(Client*, IPAddress, int)'
 MODBUS_API modbus_t* modbus_new_tcp(Client* client, IPAddress ip_address, int port);
                      ^~~~~~~~~~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:916:26: error: reference to 'Client' is ambiguous
 modbus_t* modbus_new_tcp(Client* client, IPAddress ip_address, int port)
                          ^~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:81:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:12:7: note: candidates are: class Client
 class Client;
       ^~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/ArduinoAPI.h:29:0,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/Arduino.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp-private.h:12,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:82:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/Client.h:27:7: note:                 class arduino::Client
 class Client : public Stream {
       ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:916:34: error: 'client' was not declared in this scope
 modbus_t* modbus_new_tcp(Client* client, IPAddress ip_address, int port)
                                  ^~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:916:34: note: suggested alternative: 'Client'
 modbus_t* modbus_new_tcp(Client* client, IPAddress ip_address, int port)
                                  ^~~~~~
                                  Client
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:916:42: error: reference to 'IPAddress' is ambiguous
 modbus_t* modbus_new_tcp(Client* client, IPAddress ip_address, int port)
                                          ^~~~~~~~~
In file included from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:81:0:
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.h:13:7: note: candidates are: class IPAddress
 class IPAddress;
       ^~~~~~~~~
In file included from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/Client.h:23:0,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/ArduinoAPI.h:29,
                 from /Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/Arduino.h:23,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp-private.h:12,
                 from .pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:82:
/Users/fabian/.platformio/packages/framework-arduino-megaavr/cores/arduino/api/IPAddress.h:35:7: note:                 class arduino::IPAddress
 class IPAddress : public Printable {
       ^~~~~~~~~
.pio/libdeps/uno_wifi_rev2/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:916:64: error: expected primary-expression before 'int'
 modbus_t* modbus_new_tcp(Client* client, IPAddress ip_address, int port)
                                                                ^~~
*** [.pio/build/uno_wifi_rev2/libe31/ArduinoModbus/libmodbus/modbus-tcp.cpp.o] Error 1</code>

Is the uno wifi rev 2 not supported?

Problem with single coil functions

Hello sandeepmistry,

I need your help with this problem, I've managed to master a good part of the Arduinomodbus library, and in C language I have a great knowledge, but I really can't get over this problem, in example (ModbusRTUClientKitchenSink), after the void loop you specified functions for write a single coil, read single register, etc.(the comments after the voids of each function)
I am trying to use ModbusRTUClient.coilread, and also .write, but it returns me -1 or some strange character, sometimes does not return anything, other functions I use normally, but these I can't. Thanks if you can help me. I am using an Arduino mega 2560 as client, and a pro mini as server, I do not think the problem is in one of them because so far the Arduinos have done several things I did with this library, I will attach the part of the code as image. I don't know if I'm making a stupid mistake, don't notice my english, it's not the best :)
error 1
I've done without client.read, I've used other functions but it didn't work

Modbus RTU library Problem of time consuming when multiple slave on same bus

Hi

I had problem of time consuming of pool() method in my design using this library.

  • when the master is not polling any devices on modbus : 0 to 2ms maximum => Fine for me
  • when the master pool the arduino device : 36-37ms => fine for me
  • when the master pool another address :
ms: 7
ms: 500
ms: 7
ms: 500
ms: 8
ms: 500
ms: 8
ms: 500

So here there is a problem because it block my program for half a second when the master interrogate another device.
Do i need to configure something for to solve this ?
Is the library capable of doing 1 master with several slaves ? I supposed it was possible.

I used an Arduino Nano Every, but now I tried simple way :

  • Regular Arduino MEGA
  • example software "Modbus RTU Server Kitchen Sink" with just adding few lines to measure the time of the Pool() method and sent the time to Serial2 for logging purpose
  • Arduino mega is connected without RS485, direct on a RS232 TTL to a computer.
  • Arduino Master RTU is a Computer software used : QModMaster
    9600bauds 1stop bits, parity none
    Modbus address is 42.

When sending to device 42

[RTU]>Tx > 13:36:22:648 - 2A  03  00  00  00  01  82  11  
[RTU]>Rx > 13:36:22:673 - 2A  03  02  00  00  9C  42  

Everything fine, pool method using 15ms of time.

When sending to device 41 ( who do not exist )

[RTU]>Tx > 13:36:32:289 - 29  03  00  00  00  01  82  22  

Nobody reply, so normal but the pool() method on the arduino adr42 take 7ms and then 500ms.

So this 500ms block the rest of the program in the arduino.

So there is a problem in this library.
That's so strange that nobody had this issue before, it is so simple to encounter.

Hope someone can give me directions because.

/*
  Modbus RTU Server Kitchen Sink

  This sketch creates a Modbus RTU Server and demostrates
  how to use various Modbus Server APIs.

  Circuit:
   - MKR board
   - MKR 485 shield
     - ISO GND connected to GND of the Modbus RTU server
     - Y connected to A/Y of the Modbus RTU client
     - Z connected to B/Z of the Modbus RTU client
     - Jumper positions
       - FULL set to OFF
       - Z \/\/ Y set to OFF

  created 18 July 2018
  by Sandeep Mistry
*/

#include <ArduinoRS485.h> // ArduinoModbus depends on the ArduinoRS485 library
#include <ArduinoModbus.h>

unsigned int cycle;

const int numCoils = 10;
const int numDiscreteInputs = 10;
const int numHoldingRegisters = 10;
const int numInputRegisters = 10;

void setup() {  
  Serial.begin(9600);
  while (!Serial);
  
  Serial2.begin(115200);

  Serial2.println("Modbus RTU Server Kitchen Sink");

  // start the Modbus RTU server, with (slave) id 42
  if (!ModbusRTUServer.begin(42, 9600)) {
    Serial2.println("Failed to start Modbus RTU Server!");
    while (1);
  }

  // configure coils at address 0x00
  ModbusRTUServer.configureCoils(0x00, numCoils);

  // configure discrete inputs at address 0x00
  ModbusRTUServer.configureDiscreteInputs(0x00, numDiscreteInputs);

  // configure holding registers at address 0x00
  ModbusRTUServer.configureHoldingRegisters(0x00, numHoldingRegisters);

  // configure input registers at address 0x00
  ModbusRTUServer.configureInputRegisters(0x00, numInputRegisters);
}

void loop() {
  cycle = millis();

  // Pool for modbus requests
  ModbusRTUServer.poll();

  cycle = millis() - cycle ;
  if ( cycle > 2 )
  {
    Serial2.print("ms: ");
    Serial2.println(cycle);
  }  

  // map the coil values to the discrete input values
  for (int i = 0; i < numCoils; i++) {
    int coilValue = ModbusRTUServer.coilRead(i);

    ModbusRTUServer.discreteInputWrite(i, coilValue);
  }

  // map the holiding register values to the input register values
  for (int i = 0; i < numHoldingRegisters; i++) {
    long holdingRegisterValue = ModbusRTUServer.holdingRegisterRead(i);

    ModbusRTUServer.inputRegisterWrite(i, holdingRegisterValue);
  }
}

ConfigureCoils start address issue

Hi, I have a question about the start address of the coil. Should it be always 0x00? If I change it to a different address, I am getting the '02 illegal data address' error.
ModbusRTUServer.configureCoils(0x00, 4) No issues.
ModbusRTUServer.configureCoils(0x01, 4) Error message!

Samd boards update problem

Hi,

I updated the board to 1.8.10 / 1.8.11 versión and the Arduinomodbus has a compile error.

If I came back to 1.8.9 all work fine again.

ModbusRTUClient.requestFrom can lead to bus collisions

Not exactly sure if this qualifies. I have a loop that steps through reading a bunch of inputs.
The first run through works perfectly I do one requestFrom() and then process the resulting data
then the loop pops onto it's next iteration and tries to take over the RS-485 bus while the server is still in TX mode, corrupting the first few bits of the request... the library doesn't generate the necessary 3.5 character wait time.

ModbusRTUServerKitchenSink example does not setup holding register

I am trying to turn my Arduino MKR WiFI 1010 with MKR485 Shield into a modbus slave/server.

When I use the simplified example sketch ModbusRTUServerLED I can read and write to the coil that gets setup in this chunk of code:

#include <ArduinoRS485.h> // ArduinoModbus depends on the ArduinoRS485 library
#include <ArduinoModbus.h>

void setup() {
  Serial.begin(9600);

  Serial.println("Modbus RTU Server LED");

  // start the Modbus RTU server, with (slave) id 1
  if (!ModbusRTUServer.begin(1, 9600)) {
    Serial.println("Failed to start Modbus RTU Server!");
    while (1);
  }
  // configure a single coil at address 0x00
  ModbusRTUServer.configureCoils(0x00, 1);
}

void loop() {
  // poll for Modbus RTU requests
  ModbusRTUServer.poll();
}

If I change the coil to a holding register, however, I cannot read the data in the holding register back from the slave. Why would the server return an error when reading the following:

#include <ArduinoRS485.h> // ArduinoModbus depends on the ArduinoRS485 library
#include <ArduinoModbus.h>

void setup() {
  Serial.begin(9600);

  Serial.println("Modbus RTU Server LED");

  // start the Modbus RTU server, with (slave) id 1
  if (!ModbusRTUServer.begin(1, 9600)) {
    Serial.println("Failed to start Modbus RTU Server!");
    while (1);
  }
  // configure a single holding at address 0x00
  ModbusRTUServer.configureHoldingRegisters(0x00, 1);
}

void loop() {
  // poll for Modbus RTU requests
  ModbusRTUServer.poll();
}

printf compile error

I tried compiling the WiFiModbusServer example and am getting:

/home/chris/Arduino/libraries/ArduinoModbus/src/libmodbus/modbus-tcp.cpp:32:21: error: expected unqualified-id before '{' token
   32 | #define printf(...) {}
      |                     ^
/home/chris/.arduino15/packages/adafruit/hardware/samd/1.6.4/cores/arduino/Print.h:88:10: note: in expansion of macro 'printf'
   88 |     void printf(const char[], ...);
      |          ^~~~~~

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.