Läsa Modbus med arduino

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Läsa Modbus med arduino

Inlägg 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;
  }
}
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Läsa Modbus med arduino

Inlägg 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?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45169
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg 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.
pfyra
Inlägg: 345
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Läsa Modbus med arduino

Inlägg 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?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45169
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

måste man då inte skriva

Kod: Markera allt

#include <vector.h>
pfyra
Inlägg: 345
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Läsa Modbus med arduino

Inlägg 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++...
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Läsa Modbus med arduino

Inlägg 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!
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av JimmyAndersson »

Aha!
Kul att du berättade hur det gick. :tumupp: :tumupp:
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Läsa Modbus med arduino

Inlägg 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.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg 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?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45169
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg 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.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg 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.
pfyra
Inlägg: 345
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Läsa Modbus med arduino

Inlägg 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.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg 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.
Skriv svar