Go Down

Topic: Arduino Nano Every ModBus  (Read 66 times) previous topic - next topic

tobias94

Hallo zusammen,


ich habe mit einem Arduino Pro Mini und dem nachfolgendem UART-TTL zu RS485 Converter eine Modbus Verbindung zu einer Siemens CPU1212C DC/DC/DC hergestellt und ich kann die gewünschten Register mit dem nachfolgendem Programm senden und empfangen.

https://www.ebay.de/itm/UART-TTL-zu-RS485-Converter-Modul-3-3V-5V/122285209187?_trkparms=aid%3D555018%26algo%3DPL.SIM%26ao%3D1%26asc%3D20131003132420%26meid%3D80d8ef58f7bc422d8cf3e09f0270928c%26pid%3D100005%26rk%3D6%26rkt%3D12%26mehot%3Dag%26sd%3D282787864737%26itm%3D122285209187%26pg%3D2047675&_trksid=p2047675.c100005.m1851


Da der Arduino Pro Mini ein  Auslaufprodukt  ist, möchte ich aus diesem Grund anstatt dem Arduino Pro mini einen Arduino Nano Every einsetzen.
Seit Wochen suche ich nach einer Lösung, doch ich schaffe es nicht die Verbindung mit dem Arduino Nano Every aufzubauen. Hat einer eine Idee woran das liegen könnte oder kennt jemand eine funktionale Modbus Bibliothek die ich einsetzen kann?

Über Hilfe wäre ich sehr dankbar.
Danke im Voraus. 


Code: [Select]

#include <ModbusRtu.h>
#include <Wire.h>
//#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <SoftwareSerial.h>

LiquidCrystal_I2C  lcd(0x27, 16,4);


//Ein- und Ausgänge festlegen
#define  iLuftMinus  5
#define  iLuftPlus  6
#define  iMaterialMinus 7
#define  iMaterialPlus  8



// data array for modbus network sharing
uint16_t Register[20] = {
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};


//Datenbereiche festlegen
uint16_t intSollLuft = 30;        //Sollwert Luftstrom
uint16_t intSollMaterial = 30;    //Sollwert Materialstrom


bool bFLK_Luft = false;           //Flankenmerker Luftstrom Plus / Minus
bool bFLK_Material = false;       //Flankenmerker Materialstrom Plus / Minus



/*
    Modbus object declaration
    u8id : node id = 0 for master, = 1..247 for slave
    u8serno : serial port (use 0 for Serial)
    u8txenpin : 0 for RS-232 and USB-FTDI
                 or any pin number > 1 for RS-485
*/
Modbus slave(1, 0, 0); // this is slave @1 and RS-485



// Einmaliger Programmablauf
void setup() {

  //Bautrate festlegen
  slave.begin( 19200 );


  //Deklaration der Ein- und Ausgänge
  pinMode(iLuftPlus, INPUT);
  pinMode(iLuftMinus, INPUT);
  pinMode(iMaterialPlus, INPUT);
  pinMode(iMaterialMinus, INPUT);



  //Aktiviere interne Pull UP Widerstände
  digitalWrite(iLuftPlus, HIGH);
  digitalWrite(iLuftMinus, HIGH);
  digitalWrite(iMaterialPlus, HIGH);
  digitalWrite(iMaterialMinus, HIGH);

  // Aktiviere LCD
   lcd.init();
   lcd.backlight();
}

//////////////////////////////////////////
// Ablaufprogramm
//////////////////////////////////////////
void loop() {

  //Modbus kommunikation
  slave.poll( Register, 30 );

  /////////////////////////////////////
  //Luftstromeinstellung
  /////////////////////////////////////
  //Luft Plus
  if (digitalRead(iLuftPlus) == LOW and bFLK_Luft)
  { intSollLuft = intSollLuft + 5;
  }


  //Luft Minus
  if (digitalRead(iLuftMinus) == LOW and bFLK_Luft)
  { intSollLuft = intSollLuft - 5;
  }

  //Luft Flankenmerker
  if (digitalRead(iLuftPlus) and digitalRead(iLuftMinus))
  { bFLK_Luft = 1;
  }
  else
  { bFLK_Luft = 0;
  }


  //Maximalwert Luftstrom festlegen
   
  if (not Register[7] and intSollLuft > 100)
  { intSollLuft = 100;
  }
else if
(Register[7] and intSollLuft > 60)
  { intSollLuft = 60;
  }

  //Minimalwert Luftstrom festlegen
  //darf nicht bei "0" sein da dei anzeige im Display falsch angezeigt wird
  if (intSollLuft < 20)
  { intSollLuft = 20;
  }



  /////////////////////////////////////
  //Materialstromeinstellung
  /////////////////////////////////////
  //Material Plus
  if (digitalRead(iMaterialPlus) == LOW and bFLK_Material)
  { intSollMaterial = intSollMaterial + 5;
  }


  //Material Minus
  if (digitalRead(iMaterialMinus) == LOW and bFLK_Material)
  { intSollMaterial = intSollMaterial - 5;
  }

  //Material Flankenmerker
  if (digitalRead(iMaterialPlus) and digitalRead(iMaterialMinus))
  { bFLK_Material = 1;
  }
  else
  { bFLK_Material = 0;
  }


  //Maximalwert Materialstrom festlegen
  if (intSollMaterial > 100)
  { intSollMaterial = 100;
  }

  //Minimalwert Materialstrom festlegen
  //darf nicht bei "0" sein da dei anzeige im Display falsch angezeigt wird
  if (intSollMaterial < 20)
  { intSollMaterial = 20;
  }
 

 ///////////////////////////////////////////////////
 // Ausgaben an Display
 ///////////////////////////////////////////////////
    // LCD ausgabe
    lcd.setCursor(0, 0);
    lcd.print("Luft    :");
    lcd.setCursor(12, 0);
    lcd.print("%");

    lcd.setCursor(0, 1);
    lcd.print("Material:");
    lcd.setCursor(12, 1);
    lcd.print("%");



    //Ausgabe Sollwert Luftstrom
    if (intSollLuft == 100) {
      lcd.setCursor(9, 0);
      lcd.print(intSollLuft);
    }

    if (intSollLuft < 100) {
      lcd.setCursor(10, 0);
      lcd.print(intSollLuft);
      lcd.setCursor(9, 0);
      lcd.print(" ");
    }

    //Ausgabe Sollwert Materialstrom
    if (intSollMaterial == 100) {
      lcd.setCursor(9, 1);
      lcd.print(intSollMaterial);
    }

    if (intSollMaterial < 100) {
      lcd.setCursor(10, 1);
      lcd.print(intSollMaterial);
      lcd.setCursor(9, 1);
      lcd.print(" ");
    }


  // Slave Registerdaten zuweisen
  Register[18] = 0;
  Register[19] = intSollLuft;
  Register[20] = intSollMaterial;

}


uwefed

#1
Mar 20, 2020, 09:47 am Last Edit: Mar 20, 2020, 09:49 am by uwefed
Quote
Da der Arduino Pro Mini ein  Auslaufprodukt  ist, möchte ich aus diesem Grund anstatt dem Arduino Pro mini einen Arduino Nano Every einsetzen.
Ich glaube der Nano EVERY ist schneller weg als Arduino Pro MINI Nachbauten.

Wie Du erkennst ist der Nano EVERY ein relativ neues Produkt. Die wenigsten Bibliotheken sind angepaßt.

Grüße Uwe

Go Up