Sida 1 av 12

Läsa Modbus med arduino

Postat: 28 juli 2021, 00:15:36
av EonX
God kväll!

Jag är i färd med att läsa av en modbuss komunikation med en arduino UNO samt ESP8266 wifimodul

WiFi modulen fungerar när jag kör den med en annan kod och svarar på Ping.

Mitt problem uppkommer när jag kör <ModbusIP_ESP8266.h> biblioteket får jag felmeddelande enl nedan:

Arduino:1.8.13 (Windows 7), Kort:"Arduino Uno"

In file included from C:\Users\P�l\Documents\Arduino\libraries\modbus-esp8266\src\Modbus.cpp:6:0:

C:\Users\P�l\Documents\Arduino\libraries\modbus-esp8266\src\Modbus.h:9:10: fatal error: vector: No such file or directory

#include <vector>

^~~~~~~~

compilation terminated.

exit status 1

Error compiling for board Arduino Uno.


Är det någon som vet om det finns någon lösning på problemet?

Kan tillägga att när man letar efter exemplkoden i "exempel" menyn ligger dom under en kategori som heter "EJ KOMPATIBLA" längs ner i rullisten.



Här mr även koden om det kan hjälpa:

Kod: Markera allt

/*
  Modbus-Arduino Example - Master Modbus IP Client (ESP8266/ESP32)
  Read Holding Register from Server device

  (c)2018 Alexander Emelianov (a.m.emelianov@gmail.com)
  https://github.com/emelianov/modbus-esp8266
*/

#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <ModbusIP_ESP8266.h>

const int REG = 528;               // Modbus Hreg Offset
IPAddress remote(192, 168, 0, 208);  // Address of Modbus Slave device
const int LOOP_COUNT = 10;

ModbusIP mb;  //ModbusIP object

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

  WiFi.begin("TP-Link_2640", "**********");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  mb.client();
}

uint16_t res = 0;
uint8_t show = LOOP_COUNT;

void loop() {
  if (mb.isConnected(remote)) {   // Check if connection to Modbus Slave is established
    mb.readHreg(remote, REG, &res);  // Initiate Read Coil from Modbus Slave
  } else {
    mb.connect(remote);           // Try to connect if no connection
  }
  mb.task();                      // Common local Modbus task
  delay(100);                     // Pulling interval
  if (!show--) {                   // Display Slave register value one time per second (with default settings)
    Serial.println(res);
    show = LOOP_COUNT;
  }
}

Re: Läsa Modbus med arduino

Postat: 28 juli 2021, 00:32:37
av JimmyAndersson
Gokväll :)
Nu är jag inte alls hemma på just arduino, men man kan ju klura lite ändå.

Ligger Modbus.h i katalogen
C:\Users\P�l\Documents\Arduino\libraries\modbus-esp8266\src\ ?

Hur ser isåfall den filen ut?

Re: Läsa Modbus med arduino

Postat: 28 juli 2021, 00:36:44
av TomasL
C:\Users\P�l\Documents\Arduino\libraries\modbus-esp8266\src\Modbus.h:9:10: fatal error: vector: No such file or directory
Hur ser koden för Modbus.h ut.
Den inkluderar sannolikt en fil som inte existerar, filen heter sannolikt "vector", och där har du troligen felet.

Re: Läsa Modbus med arduino

Postat: 28 juli 2021, 22:37:50
av pfyra
"vector" är väl en del av standardbiblioteket för C++? Arduino inkluderar sannolikt inte (hela?) standardbiblioteket.

Kan du kopiera vector.h där exemplet hittades?

Re: Läsa Modbus med arduino

Postat: 28 juli 2021, 22:45:31
av TomasL
måste man då inte skriva

Kod: Markera allt

#include <vector.h>

Re: Läsa Modbus med arduino

Postat: 28 juli 2021, 23:18:07
av pfyra
Vill minnas att <vector.h> är C-sättet att inkludera standardfilerna på och att man använder <vector> i C++. Var dock ett tag sen jag pillade med C++...

Re: Läsa Modbus med arduino

Postat: 29 juli 2021, 00:21:07
av EonX
Jag har grejat lite med detta i kväll med hjälp av era kloka svar och ni har givetvis rätt :D

Går man in i biblioteken hänvisar dom vidare till vector.h som inte finns att tillgå.
Jag provade sedan att använda ett annat liknande bibliotek och konstaterade att även om jag skulle få det att fungera blir det way för stort för en nano.

Så jag har nu hissat den vita flaggan och beställt en RaspberryPi för detta ändamål.
Men tack för responsen, hatten av!

Re: Läsa Modbus med arduino

Postat: 29 juli 2021, 00:25:41
av JimmyAndersson
Aha!
Kul att du berättade hur det gick. :tumupp: :tumupp:

Re: Läsa Modbus med arduino

Postat: 22 september 2021, 09:45:29
av DanielM
Nyfiken fråga!

Hur är det att använda ModBus på ett inbyggt system?
Måste man ha trådar och ökad minneskapacitet?

Eller räcker det bara att man läser "frame" som man skickar och utför instruktionerna som finns i datat?

Jag ser att många bibliotek för modbus verkar vara överdrivet svårt skrivet och innehåller massvis med trådar och olika lager.
Då ställer jag mig frågan. Är det inte meningen att ModBus ska vara enkelt och smidigt? Det uppfanns ju 1979.

Re: Läsa Modbus med arduino

Postat: 23 september 2021, 11:48:35
av Icecap
ModBus är bara ett kommunikationsprotokoll. Lite som att skicka frågor o svar i ASCII (typ "Q0143" med svar "A5571").

Nej, det behövs ingen lager och annat avancerat, jag gjorde det förvisso med en interrupstyrd TX & RX-funktion men det var mest för att det fungerade bäst.

Behöver man göra trådar är det för att man kör ett RTOS i någon form, jag klarade enkelt med att skicka en fråga och få ett svar som jag sedan tolkade.
Och såklart vänta lite mellan varje fråga då det inte var akut real-time information jag hämtade.

Re: Läsa Modbus med arduino

Postat: 24 september 2021, 08:29:09
av DanielM
Jag har ett STM32 kretskort med ethernet som jag vill använda.

Då funderar jag på om jag ska använda ModBus, men de flesta bibliotek som är skapat för modbus vill ha något sorts tråd-applikation. Libmodbus, som brukar vara det mest använda modbusbiblioteket, verkar vara skapat för lite mer avancerade hårdvara som kräver operativsystem.

Jag tror detta har med att detta bibliotek använder TCP/IP sockets, dvs inväntar client förfrågan och binder en socketanslutning mot en viss enhet.
Eller måste jag använda trådar om jag ska hantera flera TCP/IP socketsanslutningar?

Re: Läsa Modbus med arduino

Postat: 24 september 2021, 08:56:21
av TomasL
De flesta bibliotek är nog gjorda för ett RTOS.

Men det är ju inget som hindrar dig från att skriva ett själv.
Modbus är tämligen enkelt.

Re: Läsa Modbus med arduino

Postat: 24 september 2021, 12:52:49
av DanielM
Jag antar att Modbus ska vara enkelt med tanke på att det uppfanns 1979.

Skulle du, TomasL, rekommendera denna sida för att komma igång med Modbus TCP/IP?

https://ipc2u.com/articles/knowledge-ba ... -examples/

Jag vet att det finns färdiga bibliotek för Modbus. Men dom kanske är bara anpassade för vissa processorer eller operativsystem.
När jag skrev mitt J1939 bibliotek så skrev jag det i C99 och gjorde det portabelt för alla system. Det går även att använda det för USB.

Då tänkte jag: Undra om man kan göra liknande för modbus.

Jag tycker att många som skriver bibliotek gör det för svårt och det blir grötigt.
Ta t.ex. denna kod. https://github.com/CANopenNode/CANopenN ... ay_ascii.c

Horribelt!
Att dom använder #if och #else överallt i koden tyder på dåliga lager i koden. #if och #else ska man bara använda om man vill tala med hårdvara. Men här använder dom det för flödesprogrammering.
Dessutom 2000 rader kod i en .c fil. :shock: Max 300 rader per .c fil är min rekommendation.

Jag har dock aldrig stött på CANOpen i verkligheten.

Re: Läsa Modbus med arduino

Postat: 24 september 2021, 13:33:42
av pfyra
> #if och #else ska man bara använda om man vill tala med hårdvara.

Jag förstår inte riktigt vad du menar, men nej, #if och #else och dess kompisar används inte för att prata med hårdvara utan de används för att vid preprocessningen bestämma vilked kod som ska vara med i kompileringen. Man kan till exempel välja att kompilera med stöd för olika protokoll, varianter av protokoll eller dylikt. Kan till exempel vara användbart när det är ont om minne och man inte vill ha med allt krimskrams från ett bibliotek.

> Dessutom 2000 rader kod i en .c fil. :shock: Max 300 rader per .c fil är min rekommendation.

Skulle du välja bort ett bibliotek baserat på hur långa filerna är? Personligen har jag gärna över 300 rader i filerna om jag slipper byta fil fram och tillbaka hela tiden. Så länge koden är uppdelad på ett vettigt sätt mellan filer som har olika syften/ansvarsområden så struntar jag helt i hur stora de är.

Re: Läsa Modbus med arduino

Postat: 24 september 2021, 14:47:32
av DanielM
Jag pratar om tillämpningen utav #if och #else. Jag vet att det är till för preprocessorn att bestämma vilken kod som ska köras. Men det används oftast när koden som man använder passar olika system.

>> Kan till exempel vara användbart när det är ont om minne och man inte vill ha med allt krimskrams från ett bibliotek.

Det är därför man använder lite kod i varje fil. :)
Jag väljer bort ett bibliotek som är skrivet utan förklarande struktur.

Nej, det räcker inte med kommentarer eller att funktionerna har ett namn t.ex. send_app_uart_server(Struct Trix* fix). Det ska vara långa namn t.ex. send_data_via_socket(uint8_t data[], uint32_t data_length, char id_address_in_hex[]);

Bibliotek ska förklaras med bilder också. Då kan jag använda det.