[gelöst]Arduino tut nach Code hochladen seinen Dienst nicht mehr [Modbus]

Hallo.

Ich habe nicht viel Ahnung wenn es um Arduino geht. Ich nutzte diesen Notgedrungen um Analoge werte Auszulesen da dies die SPS selber nicht kann.
Leider Friert der Arduino Leonardo (ETH) immer ein wenn ich das Programm hochlade sobald dieser Modbusbefehl aktiv ist.

 // Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS, 21,4,0); // 16

wenn ich diesen ausblende tut der Arduino seinen Dienst. Da ich Wasserwerte und druck an eine SPS senden möchte wäre es schon gut wenn der Modbus auch Funktioniert. Aber so geht das leider nicht. Hier noch der ganze Code .

#include "adcHelper.h"
#include <Wire.h>
#include <SPI.h>
#include <Ethernet2.h>
#include "MgsModbus.h"
#include "TimerOne.h"
#include <avr/wdt.h>


float ph;
float orp;
char sensordata[32];                     //A 30 byte character array to hold incoming data from the sensors
byte sensor_bytes_received = 0;          // We need to know how many characters bytes have been received
byte code = 0;                           //used to hold the I2C response code.
byte in_char = 0;                        //used as a 1 byte buffer to store in bound bytes from an I2C stamp.
unsigned int CalMod = 0x0000;
#define TOTAL_CIRCUITS 2                 // <-- CHANGE THIS | set how many I2C circuits are attached to the Tentacle shield(s): 2

int channel_ids[] = {98, 99};// <-- CHANGE THIS.
  // A list of I2C ids that you set your circuits to.
  // This array should have 2 elements (2 circuits connected)
char const*channel_names[] = {"ORP", "PH"}; // <-- CHANGE THIS.
// A list of channel names (must be the same order as in channel_ids[]) 
// {"ORP","PH"}

/////#define DS_Pin 0x07, 0x08 // Pin wo die Drucksensoren angeschlossen sind
int DS_Pin[] = {0x07,0x08}; // A0, A4

MgsModbus Mb;

// Ethernet settings (depending on MAC and Local network)
byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB5 };
IPAddress ip(192, 168, 178, 13);
int pressure60,pressure5; // pressure60/60psi = A4, pressure5/5psi = A0
float Pbar;

void setup()
{
// slave address
  Mb.remSlaveIP = (192,168,178,114);
//  Serial.println(Mb.remSlaveIP);

  Serial.begin(9600);
  Wire.begin();                 // enable I2C port.
  Ethernet.begin(mac, ip);      // start etehrnet interface
  Timer1.initialize(10 * 1000); // zeit in microsekunden (1 / 1 000 000) s
  Timer1.attachInterrupt(mb);
  wdt_enable(WDTO_8S);          // Watchdog timer alle 8 s ohne timerreset wird das gerät neu gestartet

//  Mb.SetBit(0,false);
   Mb.MbData[0] = ph *10.0;
   Mb.MbData[1] = orp *10.0*2;
   Mb.MbData[2] = pressure60 /100*4 -5;
   Mb.MbData[3] = pressure5 *100 -6800;
   Mb.MbData[4] = CalMod
  }
 //  #define DRAW_DELAY 118
 //  #define D_NUM 47
 
   int i;

void mb() {
 // Mb.Req(MB_FC_READ_COILS,               0,1,0);
 // Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS, 21,4,0); // 16
 
 Mb.MbmRun();
 
}

void writeCommand(int addr ,char *cmd) {
 
 // Normalde Daten auslesen
   Wire.beginTransmission(addr);              // call the circuit by its ID number.
   Wire.write(cmd);                           // request a reading by sending 'r'
   Wire.endTransmission();     
   delay(1400);                               // AS circuits need a 1 second before the reading is ready
   sensor_bytes_received = 0;                 // reset data counter
   memset(sensordata, 0, sizeof(sensordata)); // clear sensordata array;

   Wire.requestFrom(addr, 48, 1);             // call the circuit and request 48 bytes (this is more then we need).
   code = Wire.read();

   while (Wire.available()) {                 // are there bytes to receive?
     in_char = Wire.read();                   // receive a byte.

     if (in_char == 0) {                      // null character indicates end of command
        Wire.endTransmission();               // end the I2C data transmission.
        break;                                // exit the while loop, we're done here
     }
     else {
       sensordata[sensor_bytes_received] = in_char;      // append this byte to the sensor data array.
       sensor_bytes_received++;
     }
   }
   Serial.print(code,HEX);
   Serial.print(" :=> ");
   Serial.println(sensordata);
  
}

void loop() {
   Mb.MbmRun();


  if (CalMod != Mb.MbData[4]) {
    CalMod = Mb.MbData[4];
    switch (CalMod)  {
      case 1: // TODO Calibriere mit PH 7.00
        Serial.println("Calibrierung Mittelwert PH: =7.00 ");
        writeCommand(99,"Cal,mid,7.00");
        break;
      case2: // TODO Calibriere mit ORP 225mV
        Serial.println("Calibrierung ORP: =475mV");
        writeCommand(98,"Cal,475");
        break;
    }
 }

  //Serial.println("loop start");
  for (int channel = 0; channel < TOTAL_CIRCUITS; channel++) {      // loop through all the sensors
    Wire.beginTransmission(channel_ids[channel]);                   // call the circuit by its ID number.
    Wire.write('r');                                                // request a reading by sending 'r'
    Wire.endTransmission();                                         // end the I2C data transmission.
    
    delay(1000);  // AS circuits need a 1 second before the reading is ready
    sensor_bytes_received = 0;                        // reset data counter
    memset(sensordata, 0, sizeof(sensordata));        // clear sensordata array;
    
    Wire.requestFrom(channel_ids[channel], 48, 1);    // call the circuit and request 48 bytes (this is more then we need).
    code = Wire.read();

  //   Serial.print(":");
    while (Wire.available()) {     // are there bytes to receive?
      in_char = Wire.read();       // receive a byte.

      if (in_char == 0) {          // null character indicates end of command
        Wire.endTransmission();    // end the I2C data transmission.
        break;                     // exit the while loop, we're done here
      }
      else {
       sensordata[sensor_bytes_received] = in_char;      // append this byte to the sensor data array.
       sensor_bytes_received++;
      }
    }

    switch (code) {                         // switch case based on what the response code is.
      case 1:                               // decimal 1  means the command was successful.
        if (channel == 1) {
          ph = atof(sensordata);
        } else {
          orp = atof(sensordata);
        }
        
        Serial.println(sensordata);          // print the actual reading
        break;                               // exits the switch case.

      case 2:                                // decimal 2 means the command has failed.
        Serial.println("command failed");    // print the error
        break;                               // exits the switch case.

      case 254:                              // decimal 254  means the command has not yet been finished calculating.
        Serial.println("circuit not ready"); // print the error
        break;                               // exits the switch case.

      case 255:                              // decimal 255 means there is no further data to send.
        Serial.println("no data");           // print the error
        break;                               // exits the switch case.
    }

    wdt_reset(); // Watchdog timer mit jeden loop durchlauf zurücksetzen, dauert der loop länger als 8s wird neu gestartet
  } // for int

  pressure60 = getPressure (0,60,20);
  pressure5  = getPressure (1,5,20);
  
} //for loop


int getPressure (int channel, int type, int mittel) {
  float vcc, vsensor, result=0,psi,bar;
  for (int i = 0; i < mittel; i++) {
    vcc = analogReadBG(0x1f); // dummy Read 
    vcc = 1.1 * 1024 /analogReadBG(0x1e) * 1000; // Bandgab Referenz bestimmen 1.1 V Default
    vsensor = (float) analogReadBG(DS_Pin[channel]) * vcc/1024; // Messwert mit korrektem spannungsbeszug
    result +=  vsensor;
  }
  psi  = (float)(result / mittel);
  if (psi < 500) { psi = 500; } // 0,5 mV => 0 PSi damit keine negativen drücke angezeigt werden
  // Serial.print("Druck in mV:  "); Serial.println(psi);
  switch (type) {
    case 60:
    case  5:
      psi =  (type/4.0 * (psi/1000))*100;
      break;
    default: // Fehler bei den Parametern
      return 0;
  }
  bar = psi * 0.0689;
  Pbar=bar;
  Serial.print("Druck Channel "); Serial.print(channel); Serial.print(" in Bar:  "); Serial.println(bar/100);
  return (int)psi;
}

kann mir da eventuell weiterhelfen um es zu verhindern das er den Durchlauf nur einmal macht und dann einfriert?

Evtl. ist der Modbus-Treiber nicht für den Leonardo geeignet bzw. freigegeben.

Danke.
Aber das Testprogramm vom MgsModbus Funktioniert ja, nur muss ich da die werte die ich schreibe noch selber ändern und übertragen. Sie kommen auch an der SPS an der Richtigen Stelle an. Daher schliesse ich den Treiber aus. Ich kann mir Vorstellen das es an einer Schleife liegt die er nicht durchläuft und deswegen nichts mehr macht.
Wie gesagt es wird ein Durchlauf gemacht, danach ist Ruhe und es werden keine Daten mehr übetragen. Auch nicht im SerialMonitor. Ändere ich den Code wieder kann ich ihn nur nach Drücken des Reset Knopfes X-mal Drücken den neuen Code wieder Hochladen. So als wenn Der kleine Feststeckt.
Er kann dann nicht auf den Port zugreifen. Nur halt mit der Radikalen Methode Reset+Kmpelieren.
Danach kann ich ganz normal wieder was hochladen. nur nicht wenn die oben genannte Zeile aktiv ist

Ok, da ich kein ModBus-Fachmann bin muss ich hier passen.

Allerdings solltest du die Beschreibung ändern, dass dein Problem beim Hochladen auftritt. Das irritiert.

Vielleicht spielt dir ja der WDT einen Streich.....

Nein Hochladen geht ja, aber sobald die Zeile Aktiv ist Friert er ein und nichts geht mehr.
Den WDT hatte ich Ausgeschaltet, an diesem liegt es auch nicht, Verhalten ist das gleiche.
Sobald ich die Register schreiben möchte passiert nichts mehr. Ich weiss nicht mehr was ich noch machen oder Testen soll damit es geht. Habe ich was Vergessen? Oder schreibt er die Änderungen zu schnell das der Kleine nicht nach kommt. Ich weiss es nicht. Dafür bin ich zu Grün hinter den Ohren um das jetzt zu verstehen.

luzie:
Habe ich was Vergessen?

Ja,ändere bitte deinen Titel und den Text, damit jeder gleich weiß, was du meinst.

Moin Luzie,
kannst Du uns mit einem Link auf die Library versorgen, von der 'MgsModbus.h' stammt?
Dann könnten wir mal nachsehen, was sich hinter dieser "Req"-Funktion verbirgt, die Du in der ominösen Zeile aufrufst.

Meine Vermutung: Da stimmt vielleicht was mit den Aufrufparametern nicht.

Ach so: Mit ModBus habe ich auch noch nie gearbeitet.

ich habe dies von hier.MgsModbus

luzie:
Nein Hochladen geht ja, aber sobald die Zeile Aktiv ist Friert er ein und nichts geht mehr.

Woher weisst Du, das er einfriert und nicht ständig neu startet?
Ich vermisse im setup eine Ausgabe auf den SerMon.
Unter die Zeile der .begin(9600) gehört eine Ausgabe in der Art: Serial.begin(F("Start...."));

Die Zeile mit dem WDT.enable sollte als letzte Zeile im setup stehen.
Dann im loop an erster Zeile.

Du rufst alle 10ms die ISR auf.
Kannst Du die Zeit mal höher stellen?

Und jetzt kommt mein gutgemeinter Hinweis:
Formatiere Deinen Code mit STRG-T!
Denn dann würde Dir auffallen, das hier etwas nicht stimmt:

  if (CalMod != Mb.MbData[4])
  {
    CalMod = Mb.MbData[4];
    switch (CalMod)
    {
      case 1:
        // TODO Calibriere mit PH 7.00
        Serial.println("Calibrierung Mittelwert PH: =7.00 ");
        writeCommand(99, "Cal,mid,7.00");
        break;
case2: // TODO Calibriere mit ORP 225mV
        Serial.println("Calibrierung ORP: =475mV");
        writeCommand(98, "Cal,475");
        break;
    }
  }

Danke für den Link!

Das hier passiert bei Deinem Aufruf:

//Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS, 21,4,0); // Ref, Count, Pos

... if(MbmFC == MB_FC_WRITE_MULTIPLE_REGISTERS) {
    if (Count < 1) {Count = 1;}
    if (Count > 100) {Count = 100;}
    MbmByteArray[10] = highByte(Count);
    MbmByteArray[11] = lowByte(Count);
    MbmByteArray[12] = (Count*2);
    MbmByteArray[4] = highByte(MbmByteArray[12] + 7); // Lenght high byte
    MbmByteArray[5] = lowByte(MbmByteArray[12] + 7); // Lenght low byte;
    for (int i=0; i<Count;i++) {
      MbmByteArray[(i*2)+13] = highByte (MbData[Pos + i]);
      MbmByteArray[(i*2)+14] = lowByte (MbData[Pos + i]);
    }
  }

Wenn ich das richtig sehe, müssten dann in dem MbData-Array dann 4 Worte mit sinnvollem Inhalt vorrätig sein.
Die Zuweisungen der floats an Index 0 und 1 in diesem “word”-Array sollte im Compiler mindestens eine Warnung auslösen - ob der Inhalt am Ende der Richtige ist, vermag ich nicht zu sagen.

  Mb.MbData[0] = ph * 10.0;
  Mb.MbData[1] = orp * 10.0 * 2;

Da solltest Du nochmal nachsehen, ob das alles so richtig ist.

Habe die Ratschläge umgesetzt.
der WDT ist nun am Ende vom Setup.
Der Fehler bei der Case2 wurde geändert in Case 2. Die Formatierung ist nun auch umgesetzt mit strg-t, wusste ich nicht.
das einziege was ich nioch nicht weiss was meist du mit alle 10ms den ISR. meinst du den Timer damit?

Die deklaration pH, ORP usw, liefern mir ja die Werte die die mb.Data schreiben sollen. diese kommen ja auch an im seriellen Monitor.
bei //Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS, 21,4,0); ich sende ab Adresse 21 4 Register zur Station 0.
oder sehe ich das Flasch?

luzie:
Habe die Ratschläge umgesetzt.

schick!

das einziege was ich nioch nicht weiss was meist du mit alle 10ms den ISR. meinst du den Timer damit?

Du setzt mb

 Timer1.initialize(10 * 1000); // zeit in microsekunden (1 / 1 000 000) s
  Timer1.attachInterrupt(mb);

Das heisst, das alle 10ms

void mb() {
  // Mb.Req(MB_FC_READ_COILS,               0,1,0);
  // Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS, 21,4,0); // 16
  Mb.MbmRun();
}

aufgerufen wird.

Wenn das Timing nicht passt, wird die ISR in Dauerschleife aufgerufen, noch bevor der WDT greift.

Eine Lösung wäre, die Interrupts abzuschalten, bis das gesamte setup durchgelaufen ist.

(Jetzt wo ich das als code bauen wollte....)
AAAHHHH!!!
Sag mal, das ist doch nicht gewollt????!!!!!

   Mb.MbData[3] = pressure5 *100 -6800;
   Mb.MbData[4] = CalMod
  }

Da fehlt ein semikolon!!
Das ist aus Deinem Code in #0 - kannst Du bitte Deinen aktuellen Code posten?

Was ich noch gefunden habe:
Mb.MbmRun(); sowohl im Timer als auch in der Loop? Kommen die sich nicht in die Quere, weil intern alles auf globalen Puffern arbeitet?

dies ist nun der aktuelle Code. habe die Änderungen gemacht, traue mich aber nicht ihn hochzuladen, da der kleine sonst wo wieder abstürzt und ich ewig brauche um wieder einen Code hoch laden zu können.

das mit dem : ist mir auch aufgefallen und bereinigt.

#include "adcHelper.h"
#include <Wire.h>
#include <SPI.h>
#include <Ethernet2.h>
#include "MgsModbus.h"
#include "TimerOne.h"
#include <avr/wdt.h>


float ph;
float orp;
char sensordata[32];                     //A 30 byte character array to hold incoming data from the sensors
byte sensor_bytes_received = 0;          // We need to know how many characters bytes have been received
byte code = 0;                           //used to hold the I2C response code.
byte in_char = 0;                        //used as a 1 byte buffer to store in bound bytes from an I2C stamp.
unsigned int CalMod = 0x0000;
#define TOTAL_CIRCUITS 2                 // <-- CHANGE THIS | set how many I2C circuits are attached to the Tentacle shield(s): 2

int channel_ids[] = {98, 99};// <-- CHANGE THIS.
int channel_posy [] = {1, 12}; // Posistion Anzeige x-Werte
// A list of I2C ids that you set your circuits to.
// This array should have 2 elements (2 circuits connected)
char const*channel_names[] = {"ORP", "PH"}; // <-- CHANGE THIS.
// A list of channel names (must be the same order as in channel_ids[])
// {"ORP","PH"}

/////#define DS_Pin 0x07, 0x08 // Pin wo die Drucksensoren angeschlossen sind
int DS_Pin[] = {0x07, 0x08}; // A0, A4

MgsModbus Mb;

// Ethernet settings (depending on MAC and Local network)
byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB5 };
IPAddress ip(192, 168, 178, 13);
int pressure60, pressure5; // pressure60/60psi = A4, pressure5/5psi = A0
float Pbar;

void setup()
{
  // slave address
  Mb.remSlaveIP = (192, 168, 178, 114);
  //  Serial.println(Mb.remSlaveIP);

  Serial.begin(9600);
  //  Serial.begin(F("Start...."));
  Wire.begin();                 // enable I2C port.
  Ethernet.begin(mac, ip);      // start etehrnet interface
  Timer1.initialize(100 * 1000); // zeit in microsekunden (1 / 1 000 000) s
  // Timer1.attachInterrupt(mb);

  //  Mb.SetBit(0,false);
  Mb.MbData[0] = 72; //ph * 10.0;
  Mb.MbData[1] = 6800; //orp * 10.0;
  Mb.MbData[2] = 3; //pressure60 *10;
  Mb.MbData[3] = 1160; //pressure5 * 10;

  wdt_enable(WDTO_8S); // Watchdog timer alle 8 s ohne timerreset wird das gerät neu gestartet

}
//  #define DRAW_DELAY 118
//  #define D_NUM 47

int i;

void mb()
{
  // Mb.Req(MB_FC_READ_COILS,               0,1,0);
  // Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS, 21,4,0); // 16

  // Mb.MbmRun();

}

void writeCommand(int addr , char *cmd)
{

  // Normalde Daten auslesen
  Wire.beginTransmission(addr);              // call the circuit by its ID number.
  Wire.write(cmd);                           // request a reading by sending 'r'
  Wire.endTransmission();
  delay(1400);                               // AS circuits need a 1 second before the reading is ready
  sensor_bytes_received = 0;                 // reset data counter
  memset(sensordata, 0, sizeof(sensordata)); // clear sensordata array;

  Wire.requestFrom(addr, 48, 1);             // call the circuit and request 48 bytes (this is more then we need).
  code = Wire.read();

  while (Wire.available())  // are there bytes to receive?
  {
    in_char = Wire.read(); // receive a byte.

    if (in_char == 0)  // null character indicates end of command
    {
      Wire.endTransmission();  // end the I2C data transmission.
      break;                  // exit the while loop, we're done here
    }
    else {
      sensordata[sensor_bytes_received] = in_char;      // append this byte to the sensor data array.
      sensor_bytes_received++;
    }
  }
  Serial.print(code, HEX);
  Serial.print(" :=> ");
  Serial.println(sensordata);

}

void loop()
{
  if (CalMod != Mb.MbData[4])
  {
    CalMod = Mb.MbData[4];
    switch (CalMod)
    {
      case 1: // TODO Calibriere mit PH 7.00
        Serial.println("Calibrierung Mittelwert PH: =7.00 ");
        writeCommand(99, "Cal,mid,7.00");
        break;
      case 2: // TODO Calibriere mit ORP 475mV
        Serial.println("Calibrierung ORP: =475mV");
        writeCommand(98, "Cal,475");
        break;
    }
  }

  //Serial.println("loop start");
  for (int channel = 0; channel < TOTAL_CIRCUITS; channel++) {      // loop through all the sensors
    Wire.beginTransmission(channel_ids[channel]);                   // call the circuit by its ID number.
    Wire.write('r');                                                // request a reading by sending 'r'
    Wire.endTransmission();                                         // end the I2C data transmission.

    delay(1000);  // AS circuits need a 1 second before the reading is ready
    sensor_bytes_received = 0;                        // reset data counter
    memset(sensordata, 0, sizeof(sensordata));        // clear sensordata array;

    Wire.requestFrom(channel_ids[channel], 48, 1);    // call the circuit and request 48 bytes (this is more then we need).
    code = Wire.read();

    //   Serial.print(":");
    while (Wire.available()) {     // are there bytes to receive?
      in_char = Wire.read();       // receive a byte.

      if (in_char == 0) {          // null character indicates end of command
        Wire.endTransmission();    // end the I2C data transmission.
        break;                     // exit the while loop, we're done here
      }
      else {
        sensordata[sensor_bytes_received] = in_char;      // append this byte to the sensor data array.
        sensor_bytes_received++;
      }
    }

    switch (code)
    { // switch case based on what the response code is.
      case 1:                               // decimal 1  means the command was successful.
        if (channel == 1)
        {
          ph = atof(sensordata);
        } else
        {
          orp = atof(sensordata);
        }
        Serial.println(sensordata);          // print the actual reading
        break;                               // exits the switch case.
      case 2:                                // decimal 2 means the command has failed.
        Serial.println("command failed");    // print the error
        break;                               // exits the switch case.
      case 254:                              // decimal 254  means the command has not yet been finished calculating.
        Serial.println("circuit not ready"); // print the error
        break;                               // exits the switch case.
      case 255:                              // decimal 255 means there is no further data to send.
        Serial.println("no data");           // print the error
        break;                               // exits the switch case.
    }

    wdt_reset(); // Watchdog timer mit jeden loop durchlauf zurücksetzen, dauert der loop länger als 8s wird neu gestartet
  }

  pressure60 = getPressure (0, 60, 20);
  pressure5  = getPressure (1, 5, 20);

  Mb.MbmRun();

}


int getPressure (int channel, int type, int mittel)
{
  float vcc, vsensor, result = 0, psi, bar;
  for (int i = 0; i < mittel; i++)
  {
    vcc = analogReadBG(0x1f); // dummy Read
    vcc = 1.1 * 1024 / analogReadBG(0x1e) * 1000; // Bandgab Referenz bestimmen 1.1 V Default
    vsensor = (float) analogReadBG(DS_Pin[channel]) * vcc / 1024; // Messwert mit korrektem spannungsbeszug
    result +=  vsensor;
  }
  psi  = (float)(result / mittel);
  if (psi < 500)
  {
    psi = 500;  // 0,5 mV => 0 PSi damit keine negativen drücke angezeigt werden
  }
  // Serial.print("Druck in mV:  "); Serial.println(psi);
  switch (type)
  {
    case 60:
    case  5:
      psi =  (type / 4.0 * (psi / 1000)) * 100;
      break;
    default: // Fehler bei den Parametern
      return 0;
  }
  bar = psi * 0.0689;
  Pbar = bar;
  Serial.print("Druck Channel "); Serial.print(channel); Serial.print(" in Bar:"); Serial.println(bar / 100);
  return (int)psi;
}

ich habe die Original werte erst einmal durch Fiktive ersetzt. ist nur zum Testen sollte es laufen.

luzie:
dies ist nun der aktuelle Code. habe die Änderungen gemacht, traue mich aber nicht ihn hochzuladen, da der kleine sonst wo wieder abstürzt und ich ewig brauche um wieder einen Code hoch laden zu können.

Das musst Du aber.
Ich habe Deine Hardware nicht und wenn der sich verabschiedet, dann ist was faul.

Ich hab mal den WDT auskommentiert und ne Handvoll serMon-Ausgaben eingepackt.

Der folgende Code ersetzt das setup und void md.

Einfach nur hier rauskopieren, im Originalcode markieren, ersetzen, hochladen.

Dann sollte erstmal alles durchlaufen.

Dann in der ISR mb deinen Code aktivieren - hochladen und die Ausgaben aus dem SerMon dann hier rein, wenn es nicht will.
ACHTUNG! Ich habe den SerMon auf 115200 gestellt, damit das Timing nicht solange dauert!!!
Ist ungetestet - aber ich hoffe, das klappt...
Irgendwann muss auf dem Sermon nur ein Bindestrich/Minuszeichen erscheinen.

void setup()
{
  Serial.begin(115220);
  Serial.begin(F("Start...."));
  // slave address
  Mb.remSlaveIP = (192, 168, 178, 114);
  //  Serial.println(Mb.remSlaveIP);
  Wire.begin();                 // enable I2C port.
  Ethernet.begin(mac, ip);      // start etehrnet interface
  Serial.println(F("Schalte Interrupts ab"));
  noInterrupts();
  Serial.println(F("Setze Timer"));
  Timer1.initialize(100 * 1000); // zeit in microsekunden (1 / 1 000 000) s
  Serial.println(F("Setze ISR"));
  Timer1.attachInterrupt(mb);
  Serial.println(F("Setze Array"));
  //  Mb.SetBit(0,false);
  Mb.MbData[0] = 72; //ph * 10.0;
  Mb.MbData[1] = 6800; //orp * 10.0;
  Mb.MbData[2] = 3; //pressure60 *10;
  Mb.MbData[3] = 1160; //pressure5 * 10;
  Serial.println(F("Watchdog"));
  // wdt_enable(WDTO_8S); // Watchdog timer alle 8 s ohne timerreset wird das gerät neu gestartet
  Serial.println(F("Schalte Interrupts ein"));
  interrupts()
}
//  #define DRAW_DELAY 118
//  #define D_NUM 47

int i;

void mb()
{
  // Mb.Req(MB_FC_READ_COILS,               0,1,0);
  // Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS, 21,4,0); // 16

  // Mb.MbmRun();
  Serial.println(F("-"));

}

@ by my_xy_projekt
.

ich habe das einmal eingespielt und es Funktioniert. Es waren wo doch die 10ms die das ganze zum Absturz gebracht haben. nun läuft er durch und gibt auch das "-" aus.

Danke

P.S.
Es sollten sich nur einige vor Augen führen das nicht alle Arrogant sind nur weil Sie nicht soviel Ahnung haben wie Sie selber. Ich nenne hier keine Namen. Aber die Stärken liegen bei jedem in anderen Bereichen. Wäre ja so als wenn ich jemanden Arrogant nenne wenn er nicht soviel weiss von dem was man selber gelernt hat und derjenige Hilfe diesbezüglich brauch.

In diesem Sinne. Ein Schönes Wochenende

luzie:
ich habe das einmal eingespielt und es Funktioniert. Es waren wo doch die 10ms die das ganze zum Absturz gebracht haben. nun läuft er durch und gibt auch das "-" aus.

Danke

Bitte.
Noch ne Bitte: geh mal in Dein erstes Post und editier die Betreffzeile und schreib ein [gelöst] rein. Zusätzlich villeicht am Ende noch ein ModBus, für spätere Suchen...

Danke fürs rückmelden.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.