Node MCU mit ESP8266

Hallo,
ich kämpfe gerade mit einem Node MCU mit ESP8266.
Ich möchte mit ihm gerne eine Modbuskommunikation
aufbauen aber irgendwie muß ich gestehen habe ich gerade
überhaupt keinen Plan wie ich das anstellen kann.
Hat das hier vielleicht schon mal jemand realisiert ?
und mag mir da mal vielleicht helfen ?

MFG

Was für eine Firmware ist denn auf dem ESP8266 installiert? Kann man diesen eventuell mit MQTT oder anderen Methoden ansprechen?

zur Firmware kann ich nicht sagen, die Kommunikationsmethode sollte aber schon Modbus sein.

Wie arbeitest du den mit Modul ohne zu Wissen was für eine Firmware drauf ist. Je nach Firmware unterscheidet sich ja die Programmierung komplett. Ich habe die immer mit eigenem Firmware (Arduinobased) betrieben. Am Anfang auch mal mit Python gearbeitet (und der entsprechenden Firmware).

Ich habe kleinere Programme via Arduino IDE auf
den Node geladen, über die Firmware habe ich mir
bis jetzt noch keine gedanken gemacht.

Wenn du mir Arduino arbeitest hast du keine Firmware drauf, sondern das was du in Arduino gebaut hast. Alternativ hättest du auch eine Firmware drauf haben können die direktes Skripten in LUA oder Python erlaubt. Die haben dann schon einen fertigen Netzwerkstack und teilweise auch schon eine Libs.

Hallo,
ich habe schon so einige Forschungsergebnisse.
Ich habe hier im Forum Beiträge zur Modbuskommunikation
mit einem Arduino gefunden.
Also mit dem Arduino UNO + Ethernetshield funktioniert es.



#include <SPI.h>
#include <Ethernet.h>
#include "Mudbus.h"

Mudbus Mb;

void setup()
{
  uint8_t mac[]     = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 };
  uint8_t ip[]      = { 192, 168, 178, 5 };
  uint8_t gateway[] = { 192, 168, 178, 1 };
  uint8_t subnet[]  = { 255, 255, 255, 0 };
  Ethernet.begin(mac, ip, gateway, subnet);
  //Avoid pins 4,10,11,12,13 when using ethernet shield

  delay(5000);
  Serial.begin(9600);
}

void loop()
{
  Mb.Run();
  
 
  Mb.R[1] = 1234;   
}

Mein Projekt ist es nun aber das ganze auf einem NODE MCU mit ESP8266 ans laufen zu bekommen.
mir ist jetzt nicht klar wie ich das anstellen kann. Ich habe auch ein Beispiel gefunden das sehr vielversprechend aussieht,
aber mit diesem Code verbindet sich der ESP nicht mal mit dem Wlan.


#include <ESP8266WiFi.h>
#include <ModbusTCPSlave.h>

//WIFI Settings
byte ip[]      = { 192, 168, 1, 126};
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[]  = { 255, 255, 255, 0 };

ModbusTCPSlave Mb;

unsigned long timer;
unsigned long checkRSSIMillis;

void setup()
{

  Mb.begin("Telecom-28778737", "passwordwificasa47893000", ip, gateway, subnet);

  delay(1000);
  Mb.MBInputRegister[0] = 100;
  Mb.MBInputRegister[1] = 65500;
  Mb.MBInputRegister[2] = 300;
  Mb.MBInputRegister[3] = 400;
  Mb.MBInputRegister[4] = 500;

  Mb.MBHoldingRegister[0] = 1;
  Mb.MBHoldingRegister[1] = 2;
  Mb.MBHoldingRegister[2] = 3;
  Mb.MBHoldingRegister[3] = 4;
  Mb.MBHoldingRegister[4] = 5;

}

void loop()
{
  Mb.Run();
  delay(10);

  if (millis() - timer >= 1000) {
    timer = millis();
    Mb.MBInputRegister[1]++;
  }

  if (millis() - checkRSSIMillis >= 10000) {
    checkRSSIMillis = millis();
    Mb.MBInputRegister[0] = checkRSSI();
  }
}

/*****FUNZIONI*****/

byte checkRSSI() {
  byte quality;
  long rssi = WiFi.RSSI();
  if (rssi <= -100)
    quality = 0;
  else if (rssi >= -50)
    quality = 100;
  else
    rssi = rssi + 100;
  quality = byte(rssi * 2);

  return quality;
}

Folgender Code auf meinem Node geht so halb.
Verbindung wird aufgebaut und der ESP erscheint auch in der
Fritzbox als Teilnehmer. Aber IPS kann keine client Verbindung
zum Node herstellen.


#include <ESP8266WiFi.h>
#include <ModbusTCPSlave.h>

const char* ssid     = "++++++++++++++";
const char* password = "+++++++++++ ";
const char* streamId   = "....................";
const char* privateKey = "....................";

ModbusTCPSlave Mb;

unsigned long timer;
unsigned long checkRSSIMillis;

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

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

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



  Mb.MBInputRegister[0] = 100;
  Mb.MBInputRegister[1] = 65500;
  Mb.MBInputRegister[2] = 300;
  Mb.MBInputRegister[3] = 400;
  Mb.MBInputRegister[4] = 500;

  Mb.MBHoldingRegister[0] = 1;
  Mb.MBHoldingRegister[1] = 2;
  Mb.MBHoldingRegister[2] = 3;
  Mb.MBHoldingRegister[3] = 4;
  Mb.MBHoldingRegister[4] = 5;
}



void loop()
{
  Mb.Run();
  delay(10);

  if (millis() - timer >= 1000) {
    timer = millis();
    Mb.MBInputRegister[1]++;
  }

  if (millis() - checkRSSIMillis >= 10000) {
    checkRSSIMillis = millis();
    Mb.MBInputRegister[0] = checkRSSI();
  }
}

/*****FUNZIONI*****/

byte checkRSSI() {
  byte quality;
  long rssi = WiFi.RSSI();
  if (rssi <= -100)
    quality = 0;
  else if (rssi >= -50)
    quality = 100;
  else
    rssi = rssi + 100;
  quality = byte(rssi * 2);

  return quality;
}


#include <ESP8266WiFi.h>
#include <ModbusTCPSlave.h>

//WIFI Settings
//byte ip[]      = { 192, 168, 1, 126};
//byte gateway[] = { 192, 168, 1, 1 };
//byte subnet[]  = { 255, 255, 255, 0 };

ModbusTCPSlave Mb;

unsigned long timer;
unsigned long checkRSSIMillis;

const int gasPin = A0; //GAS sensor output pin to Arduino analog A0 pin

void setup()
{

  Mb.begin("SSID", "17061706");

  delay(1000);
  
  Mb.MBInputRegister[10] = 10;
  Mb.MBInputRegister[11] = 11;
  Mb.MBInputRegister[12] = 12;
  Mb.MBInputRegister[13] = 13;
  Mb.MBInputRegister[14] = 14;
  Mb.MBInputRegister[15] = 15;
  Mb.MBInputRegister[16] = 16;
  Mb.MBInputRegister[17] = 17;
  Mb.MBInputRegister[18] = 18;
  Mb.MBInputRegister[19] = 19;

  

  Mb.MBHoldingRegister[10] = 1;
  Mb.MBHoldingRegister[11] = 2;
  Mb.MBHoldingRegister[12] = 3;
  Mb.MBHoldingRegister[13] = 4;
  Mb.MBHoldingRegister[14] = 5;

}

void loop()
{
  Mb.Run();
  delay(10);

 Mb.MBInputRegister[10]   = (analogRead(gasPin));
 Mb.MBHoldingRegister[10] = (analogRead(gasPin));

  if (millis() - timer >= 1000) {
    timer = millis();
    Mb.MBInputRegister[1]++;
  }

  if (millis() - checkRSSIMillis >= 10000) {
    checkRSSIMillis = millis();
    Mb.MBInputRegister[0] = checkRSSI();
  }
}

/*****FUNZIONI*****/

byte checkRSSI() {
  byte quality;
  long rssi = WiFi.RSSI();
  if (rssi <= -100)
    quality = 0;
  else if (rssi >= -50)
    quality = 100;
  else
    rssi = rssi + 100;
  quality = byte(rssi * 2);

  return quality;
}


THX HelmutNumberOne

Wenn man in der ModbusTCPSlave.h den Port in 502 ändert dann bekommt man auch eine ClientSocket Verbindung
aufgebaut, ist im Download schon geändert. Verbindung = Modbus TCP , ID1

Die Werte werden leider immer nur dann einmal aktualisiert wenn ich die ClientSocket Verbindung einmal deaktiviere und wieder aktiviere.
Ich habe zum Test den Analogwert in das InputRegister und in das HoldingRegister geschrieben, wollte eben feststellen
ob sich in IPS die Werte aktualisieren was sie aber einfach nicht tun.

Vielleicht hat jemand eine Idee ?

ModbusTCPSlave.zip (8.8 KB)

Hat Helmut Dir per Mail schon geschrieben, mit Bildern…

Du mußt eine Modbusinstance mit einer Leseanfrage auf die Modbusregisteradr machen, von allein kommt nichts.

Es ist ein Modbus Slave, der braucht Ansprache :wink:

Dann siehst Du auch im Comport Daten.
Gruß Helmut

L_1.PNG

ich denke ich habe alles durch, es klappt einfach nicht.
Was meinst du denn mit einer Leseanfrage ?

Was kommt denn in der seriellen Schnittstelle des Wemos an, was im Debug des Client in IP-Symcon?

Die serielle Ausgabe zeigt ob eine Anfrage kommt, wenn ja ist da auch was zu sehen, wenn da nichts angezeigt wird ist der Wemos von IP-Symcon nicht erreicht worden.

Ist im Debug nur die IP-Symcon Anfrage zu sehen oder auch eine Antwort des Wemos.
Das wären gute Infos zum Problem.
Gruß Helmut
Edit: google mal nach „ModMaster-Win32-exe-0.4.7“ Das ist ein gutes Testprg für Modbus RTU und TCP

hier ein screenshot , das Testprogramm installiere ich gerade

Bitte das Client Debug mal in Hex
Und wenn möglich mal den analogen Wert des Wemos zum Vergleich, was steht in der Variablen der Modbus Instanz?

Hier die die Ergebnisse des Kommunikationstests mit
qModMaster: Der Analogwert wird übertragen, der Screenshot
zeigt den Analogeingang A1 an 5 Volt. Andere Analogwerte werden
auch übertragen, aber sie aktualisieren sich hier auch nur wenn ich
mich mit dem Slave einmal Disconnekte. Der Read/Write Button bewirkt
keine Aktualisierung. Also irgendwie ist es identisch zu dem in IPS.

Hm
Dein RX Wert entspricht nicht der 1024 … Da steht Hex 02
Bei mir ist der Wert im Busmonitor rechnerisch richtig, gemessen wurde 300, im Busmonitor kommt als Hex Wert 01 2C und das ist dez 300…

Was bekommst Du im Clientsocket von IPS in Hex?
Gruß Helmut

hier der Hexwerte (1024)

bin mir nicht so sicher aber gibts da im Arduino Code nicht irgendwie die Möglichkeit
so eine Art Diskonnekt Befehl einzubauen? Oder Ein Holdingregisterupdate oder so?
Könnte der Fehler vielleicht im Arduino liegen ? Ich weiß nicht wann die Registervariablen
im Arduino neu geschrieben werden ? Könnte es sein das sie erst nach einem Diskonnekt
neu beschriebn werden ???:confused:

19:12:14 und 19:12:15
(Die letzten 2 Zeilen 19:12:15)
Da war der Wert richtig angekommen, kann es sein, dass Dein Wemos einen sehr schwankenden Wert auf dem analogen Eingang bekommt?

Gib doch mal so eine Debugausgabe nach der Wandlung per ser Schnittstelle am Wemos aus.
Gruß Helmut
Edit: zur Wemosfrage, die Wandlung wird in der Zeile

Mb.MBInputRegister[10] = (analogRead(gasPin));
Mb.MBHoldingRegister[10] = (analogRead(gasPin));

ausgeführt, ev hilft eine Pause zwischen den beiden Befehlen und so wie ich den Code verstanden habe wird von IPS beim Wemos angefragt und nur dann antwortet der Wemos mit den Werten. Slave eben :wink:

Am Analogeingang sind wieder 5Volt

Hi,

schau mal ins Datenblatt: max. 1 Volt !