Arduino Mega25660 SPS Kommuikation MODBUS TCP

Guten Tag zusammen,
ich habe folgendes Proglem:
Und zwar ich habe mich ein wenig drüber informiert, wie man so eine Kommunikation einrichten kann. Wenn man bei YouTube dieses Titel eingibt findet man auch recht schnell Beispiele, welche leider bei mir nicht funktioniert haben.
Als Beispiel nehme ich jetzt mal dieses Skatch (die Librarys habe ich von GitHub):

#include<EtherCard.h>
#include<Modbus.h>
#include<ModbusIP_ENC28J60.h>


const int SENSOR_IREG = 100;
const int sensorPin = A0;
ModbusIP mb;
long lts1, lts2=0; 

void setup() {
  Serial.begin(9600);
  byte aucMac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  byte ip[] = {192, 168, 137, 185};
  mb.config(aucMac, ip);
  mb.addIreg(SENSOR_IREG);

}

void loop() {

  mb.task();
    lts1 = millis();
    
  if (lts1 > lts2+2000) {
    mb.Ireg(SENSOR_IREG, analogRead(sensorPin));
    Serial.println(analogRead(sensorPin));
    Serial.print("lts1= ");
    Serial.println(lts1);
    lts2=lts1;
  }
}

(die EtherCard.h library ist glaube ich für den einen Arduino UNO, dies habe ich auch schon ausprobiert leider ohne Erfolg)

Mein Ziel zunächst ist es, einfach den Arduino anpingen zu können und dieser Antwortet dann darauf.

Wenn jemand eine Idee hat woran dieses liegen könnte, würde ich mich sehr freuen wenn ihr mir helfen könntet.

Danke im voraus

Welches Netzwerkmodul/-shield hast Du denn überhaupt (bitte Link oder IC-Bezeichnung).

Gruß Tommy

was auch immer du für ein Ethernet Shield hast - versuche erst mal dieses zum laufen zu bringen.
Beginne mit einfachen TCP/IP Verbindungen aufzubauen.
Zum Beispiel ein Hello World Beispiel für einen ganz simplen Webserver.

Wenn das sauber funktioniert - erst dann probierst du mit modbus/TCP.

Dann wie Tommy schon schrieb ... Link auf genaues Ethernet Shield ist notwendig. wenn es losgeht mit Modbus/TCP ...

JA stimmt habe ich vergessen zu sagen
-> also das shield ist mit dem chip W5100 bestückt.

eine Html Seite habe ich bereits mit diesem Shield programmiert und funktioniert auch.
kann dort ohne Probleme drauf zugreifen etc.

ja jetzt komm.

Link auf dein Shield
Link auf die Libs die du verwendest,
woher ist der Code?
Von "Github" ist ca so eine genaue Ortsangabe wie "aus dem Internet".
Allein beim drüberscrollen über das Forum wirst du festgestellt haben, dass im deutschen Forum wenig über modbus - noch weniger über modbus TCP gesprochen wird. Ergo musst du da schon genauere Daten liefern oder eher im engl. fragen.

du schreibst du hättest einen W5100, warum wird dann eine
#include<ModbusIP_ENC28J60.h>

eingebunden?
Passt die Lib für den ENC28J60 zu deinem W5100? Steht das auch auf Github?

da habe ich das so verstanden wenn man unten auf der Seite schaut das der W5100 mit implementiert ist .

Vany007:
modbus-arduino/README.md at master · andresarmento/modbus-arduino · GitHub

da habe ich das so verstanden wenn man unten auf der Seite schaut das der W5100 mit implementiert ist .

Das hast Du falsch verstanden. Da wird nur ein Vergleich gemacht.

Grüße Uwe

Modbus IP

There are four examples that can be accessed from the Arduino interface, once you have installed the library. Let's look at the example Switch.ino (only the parts concerning Modbus will be commented):

#include <SPI.h>
#include <Ethernet.h>
#include <Modbus.h>
#include <ModbusIP.h>

alles klar oder? Ich rate dir dringend, zunächst die 4 Beispiele durchzugehen bzw. mit dem Switch.ino zu beginnen.

Bist du an den Mega2560 gebunden?
Ich mache auch Mobus TCP ,zusammen mit einer S7-1200 (1211C V3.1 ) und ESP8266/ESP32 als Remote I/O (ist billiger). Hat den ganz großen Vorteil man hängt die einfach an einen WLAN Router (Alte Fritzchen box mit WLAN) die SPS hängst du über LAN ein und schon läuft es super. Basis meiner Projekte ist von hier: Klick.
Ganz schön man braucht keine zusätzlichen Modbus Libs (hat aber auch ein paar einschränkungen).
An meinen Remote IO´s werden ESP8266-01 hängen die via I2C Portexpander IOs bekommen.
Man müsste halt mal testen ob man auch ohne Libs einfach die Ethernet Lib mit den entsprechenden Änderungeb des Server Start etc von Arduino reinpackt und das auf einem MEGA2560 mit WZ shield packt und läuft.

Gruß
DerDani

ja ich bin leider an dem Mega gebunden,
eigentlich soll der Arduino primär keine Daten schicken sondern Befehle von der SPS bekommen.

Das Beispiel ist auch ein Modbus/TCP Server (also die Daten werden von der Gegenstelle geschrieben / gelesen) Leider ist die Terminologie bei Modbus/TCO zu Mobus/RTU leicht misszudeuten.
Modbus RTU Master = Modbus/TCP CLIENT (der "aktive" Part der Kommunkation der initiert)
Modbus RTU Slave = Modbus/TCP SERVER (der "passive" Part der auf Anfragen reagiert)

Das Beispiel ist ein SERVER/SLAVE und sollte relativ einfach auf einen MEGA2560 umgeschrieben werden können. Also Arudino Beispiele schauen und vergleichen und Modbus Sketch anpassen.
Leider habe ich Moment keine Zeit zum anpassen / umschreiben und testen.
Gruß
DerDani

Alles gut ich schau mir das ganze schon an.

Bin mir noch nicht 100% sicher ob ich auf dem richtigen Weg bin aber mal schauen.

Danke vielmals für eure Hilfe!!!

Nur zu Information

Ich habe die Kommunikation ans laufen bekommen.

nochmal Danke!!

Hallo Vany007,
kann man fragen wie?
Mich interessiert das auch. Fertige Beispiele?
Gruß
DerDani

Also ich habe die Library geändert
benutze nicht mehr die Modbus.h bzw ModbusIP.h
sonder jetzt die Mudbus.h library
dazu habe ich dann noch die Ethernet library hinzugefügt hinzugefügt und dann ging es recht zügig, sodass die Kommunikation erfolgreich war

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

Mudbus Mb;
//Function codes 1(read coils), 3(read registers), 5(write coil), 6(write register)
//signed int Mb.R[0 to 125] and bool Mb.C[0 to 128] MB_N_R MB_N_C
//Port 502 (defined in Mudbus.h) MB_PORT
bool baktivierung = HIGH;
unsigned char ucBuffer;
void setup()
{
  Serial.begin(9600);
  uint8_t mac[]     = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 };
  uint8_t ip[]      = {192, 168, 137, 2};


  Serial.println("Initializing SD card...");


  Ethernet.begin(mac, ip);
  //Avoid pins 4,10,11,12,13 when using ethernet shield

  delay(1000);
  Serial.begin(9600);


  pinMode(7, INPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(A0, INPUT);
}

void loop()
{
  Mb.Run();

  //Analog inputs 0-1023
  Mb.R[0] = analogRead(A0); //pin A0 to Mb.R[0]


  Serial.println(analogRead(A0));
  while (Serial.available() > 0) {
    ucBuffer = Serial.read();
    baktivierung = HIGH;
  }


  if (baktivierung == HIGH) {
    Serial.println("Aktiviert");
    for  (int i = 0; i < 400; i++) {
      Mb.R[i] = 0;
    }
    baktivierung = LOW;
  }

  //Analog outputs 0-255
  // analogWrite(6, Mb.R[6]); //pin ~6 from Mb.R[6]



  //Digital outputs
  digitalWrite(8, Mb.C[0]); //pin 8 from Mb.C[8]
  /* Serial.print("Digital 00001=");
    Serial.println(Mb.C[0]);
    analogWrite(9, Mb.R[0]);
    Serial.print("0= ");
    Serial.println(Mb.R[0]);*/
  analogWrite(9, Mb.R[1]);
  Serial.print("1= ");
  Serial.println(Mb.R[1]);

}

an den digital/analog Writes habe ich Leds angeschlossen
und wo ein analog Read signal ist habe ich mit nem Poti nen Spannungsteiler aufgebaut und zur kontrolle auch noch über den Seriellen Monitor ausgeben lassen

die For schleife, mit dem if davor, brauchst du nicht beachten, die ist von mir, um zu versuchen ein neues Problem zu beheben

Dazu habe ich mir noch einen ModbusMaster für den PC runtergeladen, dass ich nicht die ganze zeit an der SPS sitzen muss

bei fragen kannste dich gerne noch melden

ich hoffe das war jetzt halbwegs verständlich:D

Danke für die Info.
Gruß
DerDani