-> Hier kostenlos registrieren
Hallo Zusammen
Ich habe ein kleines Problem zu meiner Arbeit. Ich habe ein Programm gefunden, welchen den Wert eines Analogen Pins des Arduino ins Modbus register schreibt und diesen kann ich auch im Raspberry im Codesys auslesen. Nun möchte ich jedoch den Wert "entfernung" als analoger Wert hineinscshreiben.
Kann mir hierbei jemand helfen?
Vielen Dank im Voraus
#include <Arduino.h>
#include "Modbus.h"
#include "ModbusSerial.h"
//ModBus Port information
#define BAUD 115200
//Baud Rate
#define ID 1 // This is ID comunication, to use together with COM in order to estabilish communication
#define TXPIN -1 //Don't change it
//Define the number of registers, inputs and coils to be created
#define NUM_COILS 2 // Number of Digital Out
#define NUM_DISCRETE_INPUT 2 // Number of Digital Input
#define NUM_HOLDING_REGISTERS 2 // Number of Analog Output
#define NUM_INPUT_REGISTERS 2 // Number of Analog Input
//Create the I/O pin masks
uint8_t pinMask_DOUT[] = {9, 4}; //%IX0.0 %IX0.1
uint8_t pinMask_DIN[] = {12, 8}; //%QX0.0 %QX0.1
uint8_t pinMask_AOUT[] = {A3, A4}; //%IW1 %IW2
uint8_t pinMask_AIN[] = {A0, A1}; //%QW1 %QW2
//Modbus Object
ModbusSerial modbus;
void configurePins()
{
for (int i = 0; i < NUM_DISCRETE_INPUT; i++)
{
pinMode(pinMask_DIN, INPUT);
}
for (int i = 0; i < NUM_INPUT_REGISTERS; i++)
{
pinMode(pinMask_AIN, INPUT);
}
for (int i = 0; i < NUM_COILS; i++)
{
pinMode(pinMask_DOUT, OUTPUT);
}
for (int i = 0; i < NUM_HOLDING_REGISTERS; i++)
{
pinMode(pinMask_AOUT, OUTPUT);
}
}
int trigger=7; //Trigger-Pin des Ultraschallsensors an Pin7 des Arduino-Boards
int echo=6; // Echo-Pim des Ultraschallsensors an Pin6 des Arduino-Boards
long dauer=0; // Das Wort dauer ist jetzt eine Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
int entfernung=0; // Das Wort „entfernung“ ist jetzt die variable, unter der die berechnete Entfernung gespeichert wird. Info: Anstelle von „int“ steht hier vor den beiden Variablen „long“. Das hat den Vorteil, dass eine größere Zahl gespeichert werden kann. Nachteil: Die Variable benötigt mehr Platz im Speicher.
void setup()
{
Serial.begin (9600); //Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.
pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
//Setup board I/O
configurePins();
//Config Modbus Serial (port, speed, rs485 tx pin)
modbus.config(&Serial, BAUD, TXPIN);
//Set the Slave ID
modbus.setSlaveId(ID);
//Add all modbus registers
for (int i = 0; i < NUM_DISCRETE_INPUT; ++i)
{
modbus.addIsts(i);
}
for (int i = 0; i < NUM_INPUT_REGISTERS; ++i)
{
modbus.addIreg(i);
}
for (int i = 0; i < NUM_COILS; ++i)
{
modbus.addCoil(i);
}
for (int i = 0; i < NUM_HOLDING_REGISTERS; ++i)
{
modbus.addHreg(i);
}
}
void loop()
{
digitalWrite(trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); //Dauer: 5 Millisekunden
digitalWrite(trigger, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
digitalWrite(trigger, LOW);//Dann wird der „Ton“ abgeschaltet.
dauer = pulseIn(echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
entfernung = (dauer/2) * 0.3432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Milimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
delay(100); //Das delay sorgt für einene Verzögerung des neuen Messwert.
{
}
//Run the main modbus task
modbus.task();
//Update modbus registers
for (int i = 0; i < NUM_DISCRETE_INPUT; ++i)
{
modbus.Ists(i, digitalRead(pinMask_DIN));
}
for (int i = 0; i < NUM_INPUT_REGISTERS; ++i)
{
modbus.Ireg(i, (analogRead(pinMask_AIN) ));
//modbus.Ireg(i, (analogRead(pinMask_AIN) * 64))
}
for (int i = 0; i < NUM_COILS; ++i)
{
digitalWrite(pinMask_DOUT, modbus.Coil(i));
}
for (int i = 0; i < NUM_HOLDING_REGISTERS; ++i)
{
analogWrite(pinMask_AOUT, (modbus.Hreg(i) / 4));
// analogWrite(pinMask_AOUT, (modbus.Hreg(i) / 256));
}
}
Ich habe ein kleines Problem zu meiner Arbeit. Ich habe ein Programm gefunden, welchen den Wert eines Analogen Pins des Arduino ins Modbus register schreibt und diesen kann ich auch im Raspberry im Codesys auslesen. Nun möchte ich jedoch den Wert "entfernung" als analoger Wert hineinscshreiben.
Kann mir hierbei jemand helfen?
Vielen Dank im Voraus
#include <Arduino.h>
#include "Modbus.h"
#include "ModbusSerial.h"
//ModBus Port information
#define BAUD 115200
//Baud Rate
#define ID 1 // This is ID comunication, to use together with COM in order to estabilish communication
#define TXPIN -1 //Don't change it
//Define the number of registers, inputs and coils to be created
#define NUM_COILS 2 // Number of Digital Out
#define NUM_DISCRETE_INPUT 2 // Number of Digital Input
#define NUM_HOLDING_REGISTERS 2 // Number of Analog Output
#define NUM_INPUT_REGISTERS 2 // Number of Analog Input
//Create the I/O pin masks
uint8_t pinMask_DOUT[] = {9, 4}; //%IX0.0 %IX0.1
uint8_t pinMask_DIN[] = {12, 8}; //%QX0.0 %QX0.1
uint8_t pinMask_AOUT[] = {A3, A4}; //%IW1 %IW2
uint8_t pinMask_AIN[] = {A0, A1}; //%QW1 %QW2
//Modbus Object
ModbusSerial modbus;
void configurePins()
{
for (int i = 0; i < NUM_DISCRETE_INPUT; i++)
{
pinMode(pinMask_DIN, INPUT);
}
for (int i = 0; i < NUM_INPUT_REGISTERS; i++)
{
pinMode(pinMask_AIN, INPUT);
}
for (int i = 0; i < NUM_COILS; i++)
{
pinMode(pinMask_DOUT, OUTPUT);
}
for (int i = 0; i < NUM_HOLDING_REGISTERS; i++)
{
pinMode(pinMask_AOUT, OUTPUT);
}
}
int trigger=7; //Trigger-Pin des Ultraschallsensors an Pin7 des Arduino-Boards
int echo=6; // Echo-Pim des Ultraschallsensors an Pin6 des Arduino-Boards
long dauer=0; // Das Wort dauer ist jetzt eine Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
int entfernung=0; // Das Wort „entfernung“ ist jetzt die variable, unter der die berechnete Entfernung gespeichert wird. Info: Anstelle von „int“ steht hier vor den beiden Variablen „long“. Das hat den Vorteil, dass eine größere Zahl gespeichert werden kann. Nachteil: Die Variable benötigt mehr Platz im Speicher.
void setup()
{
Serial.begin (9600); //Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.
pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
//Setup board I/O
configurePins();
//Config Modbus Serial (port, speed, rs485 tx pin)
modbus.config(&Serial, BAUD, TXPIN);
//Set the Slave ID
modbus.setSlaveId(ID);
//Add all modbus registers
for (int i = 0; i < NUM_DISCRETE_INPUT; ++i)
{
modbus.addIsts(i);
}
for (int i = 0; i < NUM_INPUT_REGISTERS; ++i)
{
modbus.addIreg(i);
}
for (int i = 0; i < NUM_COILS; ++i)
{
modbus.addCoil(i);
}
for (int i = 0; i < NUM_HOLDING_REGISTERS; ++i)
{
modbus.addHreg(i);
}
}
void loop()
{
digitalWrite(trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); //Dauer: 5 Millisekunden
digitalWrite(trigger, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
digitalWrite(trigger, LOW);//Dann wird der „Ton“ abgeschaltet.
dauer = pulseIn(echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
entfernung = (dauer/2) * 0.3432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Milimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
delay(100); //Das delay sorgt für einene Verzögerung des neuen Messwert.
{
}
//Run the main modbus task
modbus.task();
//Update modbus registers
for (int i = 0; i < NUM_DISCRETE_INPUT; ++i)
{
modbus.Ists(i, digitalRead(pinMask_DIN));
}
for (int i = 0; i < NUM_INPUT_REGISTERS; ++i)
{
modbus.Ireg(i, (analogRead(pinMask_AIN) ));
//modbus.Ireg(i, (analogRead(pinMask_AIN) * 64))
}
for (int i = 0; i < NUM_COILS; ++i)
{
digitalWrite(pinMask_DOUT, modbus.Coil(i));
}
for (int i = 0; i < NUM_HOLDING_REGISTERS; ++i)
{
analogWrite(pinMask_AOUT, (modbus.Hreg(i) / 4));
// analogWrite(pinMask_AOUT, (modbus.Hreg(i) / 256));
}
}