Codesys Raspberry - Arduino Kommunikation Analoger Wert senden

Sandro95

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> 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));
}

}
 
Hallo,
was Du oben schreibst
Ich habe ein kleines Problem zu meiner Arbeit. Ich habe ein Programm gefunden, welchen den Wert eines Analogen Pins des Arduino
und was im Quellcode steht
Code:
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.
passt nicht zusammen. Du wartest auf das Echo an einem digitalen Pin und berechnest über erfasste Zeit die Entfernung. Das sieht nach einem digitalen Sensor aus, wie etwa der HC-SR04.

Nebenbei: Es gibt auch analoge Entfernungssensoren, für Schülerexperimente hatte ich den https://www.dfrobot.com/product-1862.html im Einsatz.

Zu Modbus kann ich leider nichts sagen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann mir hierbei jemand helfen?
Klaro.
Auch ohne code-Tags erkennt der Fachmann, dass es sich hierbei mit an Sicherheit grenzender Wahrscheinlichkeit um einen Sketch für einen Arduino Modbus-Slave handelt, in den irgendwer etwas Code von 'nem Ultraschall Sensor a la HC-SR04 halbfertig reingefriemelt hat.

Und frei nach dem Motto "Hilfe zur Selbsthilfe" hier eine Beschreibung ohne fertigen Code:
Du müsstest statt dem AIN deine entfernung-Variable in die Modbus Register schieben.
Sprich die "rangier-for-schleife" um eins verkürzen oder die Schnittstelle erweitern.
Dann mit der modbus.lreg() Funktion, deinen Wert mit richtiger Skalierung (16 Bit (?) ) senden.
Wo genau hakts denn?


Und um gleich etwas vorzugreifen:
Der zu Grunde liegenden Frage entnehme ich, dass du wahrscheinlich nicht weißt, worum es sich bei &Serial handelt: ich weiß nicht wie gut das ist, wenn du die gleiche serielle Schnittstelle mit 2 unterschiedlichen Baudrates für Modbus und zum Debuggen verwendest. Wahrscheinlich nicht so gut. Nimm das Serial.begin(9600) raus.
 
Hallo,
was Du oben schreibst

und was im Quellcode steht
Code:
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.
passt nicht zusammen. Du wartest auf das Echo an einem digitalen Pin und berechnest über erfasste Zeit die Entfernung. Das sieht nach einem digitalen Sensor aus, wie etwa der HC-SR04.

Nebenbei: Es gibt auch analoge Entfernungssensoren, für Schülerexperimente hatte ich den https://www.dfrobot.com/product-1862.html im Einsatz.

Zu Modbus kann ich leider nichts sagen.
Hallo

Danke für die Mitteilung. Das stimmt ist in verbindung mit dem HC-SR04. Dies ist jedoch nicht das Problem ich möchte den Wert, welche ich schlussentlich erhalte, ins modbusregister schreiben und im codesys modbusregister lesen.

Grüsse
 
Klaro.
Auch ohne code-Tags erkennt der Fachmann, dass es sich hierbei mit an Sicherheit grenzender Wahrscheinlichkeit um einen Sketch für einen Arduino Modbus-Slave handelt, in den irgendwer etwas Code von 'nem Ultraschall Sensor a la HC-SR04 halbfertig reingefriemelt hat.

Und frei nach dem Motto "Hilfe zur Selbsthilfe" hier eine Beschreibung ohne fertigen Code:
Du müsstest statt dem AIN deine entfernung-Variable in die Modbus Register schieben.
Sprich die "rangier-for-schleife" um eins verkürzen oder die Schnittstelle erweitern.
Dann mit der modbus.lreg() Funktion, deinen Wert mit richtiger Skalierung (16 Bit (?) ) senden.
Wo genau hakts denn?


Und um gleich etwas vorzugreifen:
Der zu Grunde liegenden Frage entnehme ich, dass du wahrscheinlich nicht weißt, worum es sich bei &Serial handelt: ich weiß nicht wie gut das ist, wenn du die gleiche serielle Schnittstelle mit 2 unterschiedlichen Baudrates für Modbus und zum Debuggen verwendest. Wahrscheinlich nicht so gut. Nimm das Serial.begin(9600) raus.
Salü reeve

Danke für deine Hilfe. Das mit dem Ultraschall sensor stimmt das hat da jemand halbfertig reingefriemelt.

Wenn ich die entfernungsvariable auch als 16 Bit ins modbus.Ireg reinschriebe, dann schmiert mir die verbindung ab und erhalte dann im Codesys auch den fehler, das die verbindung nicht mehr steht. Man hört auch, dass das Echosignal nicht mehr mit der geschwindigkeit taktet, welches oben definiert wird... aber dann versuche ich das morgen nach der Arbeit mal so hineinzufriemeln. Ich bin leider mit dem Arduino Systemen nicht so vertraut, da ich eher mit Siemens (Tia), codesys oder Freelance programmiere... das ist schon ein wenig komplexer für mich :)

Grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin mir auch nicht sicher ob das hier unbedingt das richtige Forum für Mikrocontroller ist (obwohl ich dir mikrocontroller.net auch nicht antun möchte), die meisten hier kennen sich eher mit industrieller Steuerungstechnik aus, aber ich versuchs trotzdem mal.

Aus dem Bauch hätt' ich gesagt, dass das eher mit dem delay() im main zusammenhängt, als damit was du in das Register schiebst.
Da kannst du eigentlich nur versuchen Schritt-für-Schritt zurück zu gehen und zu schauen was den Arduino zum Absturz bringt.
Ist auf deinem Raspberry irgendein Timeout eingestellt in den der mit dem 100ms Delay laufen würde?

Ich hab da auch nur mal kurz nach irgendwelchen Beschreibungen für die Libs gegooglet, scheinbar scheint die ModbusSerial.h aus dem LDuino Projekt zu sein, das auch FreeRTOS verwendet und der Modbus Mimik einen eigenen Task (wahrscheinlich genau dafür) spendiert hat.
FreeRTOS an sich ist schon ein echt interessantes Thema, leider hatte ich bis jetzt noch nicht wirklich Zeit damit rumzuspielen.
 
Aus dem Bauch hätt' ich gesagt, dass das eher mit dem delay() im main zusammenhängt, als damit was du in das Register schiebst.
Da kannst du eigentlich nur versuchen Schritt-für-Schritt zurück zu gehen und zu schauen was den Arduino zum Absturz bringt.
Ist auf deinem Raspberry irgendein Timeout eingestellt in den der mit dem 100ms Delay laufen würde?
Genau genommen hat ein delay() in einem ernsthaften Programm nichts zu suchen.

Man kann das auch mit der millis()-Funktion einfach umgehen:
.. Man hört auch, dass das Echosignal nicht mehr mit der geschwindigkeit taktet, welches oben definiert wird... aber dann versuche ich das morgen nach der Arbeit mal so hineinzufriemeln. Ich bin leider mit dem Arduino Systemen nicht so vertraut
Was hörst Du da? Wir reden von 5 oder 10 ms ...

Programmierst Du mit der Arduino-IDE? Da muss man wissen, dass diese ursprünglich für die Realisierung interaktiver Kunstwerke entwickelt wurde. Um es für die Anfänger und Künstler so einfach wie möglich zu machen, sind die Libraries so universell ausgelegt, dass Anwender wenig über die Hardware wissen muss. Das macht den erzeugten Maschinencode ineffizient.

Ich würde an Deiner Stelle mal mit einem ganz einfachen Programm anfangen, das nur eine vorgegebene Realzahl über Modbus schickt. Wenn das funktioniert, kannst Du Richtung Sensor gehen.
 
Und es würde sinn machen wenn du deine Hardware genauer beschreibst ;)
delay(100); //Das delay sorgt für einene Verzögerung des neuen Messwert.
{

}
Sowas ist immer gefährlich ;), wurde ja schon erwähnt.

Mach es so, dann wird dein Programm weiter verarbeitet:

Du weist ja nicht was dein Modbus Programm im Hintergrund so treibt, mit dem delay würgst du es auf jeden fall ab, das kann, muss aber nicht kritisch sein!

Auch wenn bei vielen Tutorials für den HC-SR04 mit den 2/5ms Delay gearbeitet wird, würde ich die Funktion mal separieren und nicht mit einem Delay verzögern. Sondern mit der "millis()" Methode erstmal nur alle x Sekunden triggern, damit Modbus Zeit hat. Und dann gibt es "Code Versionen" für den Sensor ohne Delay.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau genommen hat ein delay() in einem ernsthaften Programm nichts zu suchen.

Man kann das auch mit der millis()-Funktion einfach umgehen:

Was hörst Du da? Wir reden von 5 oder 10 ms ...

Programmierst Du mit der Arduino-IDE? Da muss man wissen, dass diese ursprünglich für die Realisierung interaktiver Kunstwerke entwickelt wurde. Um es für die Anfänger und Künstler so einfach wie möglich zu machen, sind die Libraries so universell ausgelegt, dass Anwender wenig über die Hardware wissen muss. Das macht den erzeugten Maschinencode ineffizient.

Ich würde an Deiner Stelle mal mit einem ganz einfachen Programm anfangen, das nur eine vorgegebene Realzahl über Modbus schickt. Wenn das funktioniert, kannst Du Richtung Sensor gehen.
Ich Porgrammiere ein Raspbery pie mit Codesys und ein Arduino uno mit dem Arduino IDE (Verbindung über USB). Ich habe versucht einen Analogen Wert zu senden, leider ohne Erfolg. Die Rx und Tx leuchte werden langsamer und ich erhalte eine Modbusstörung - keine Verbindung. nehmen wir das Programm heraus haben wir ja folgendens:

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);
}
}


void setup()
{

//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()
{

//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) ));
}
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));
}

}


Dies ist ja eine reine Arduino IDE programmierung.... Die Verbindung steht, Modbusvverbindung in Ordnung aber damit kann ich halt nur einen analogen Pin weiterleiten....
 
Und es würde sinn machen wenn du deine Hardware genauer beschreibst ;)

Sowas ist immer gefährlich ;), wurde ja schon erwähnt.

Mach es so, dann wird dein Programm weiter verarbeitet:


Du weist ja nicht was dein Modbus Programm im Hintergrund so treibt, mit dem delay würgst du es auf jeden fall ab, das kann, muss aber nicht kritisch sein!

Auch wenn bei vielen Tutorials für den HC-SR04 mit den 2/5ms Delay gearbeitet wird, würde ich die Funktion mal separieren und nicht mit einem Delay verzögern. Sondern mit der "millis()" Methode erstmal nur alle x Sekunden triggern, damit Modbus Zeit hat. Und dann gibt es "Code Versionen" für den Sensor ohne Delay.
Hei Muck danke für die Rückmeldung. lassen wir das Program mal bei Seite. Es wäre schon super wenn ich einen Wert ins Register schreiben könnte...

Hardware: Raspberry Pie mit Codesysprogrammierung und Arduino Uno mit Arduino IDE Programmierung. Ohne "Programm" würde es ja wie folgt aussehen:


#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);
}
}

void setup()
{

//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()
{

//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) ));
}
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));
}

}
 
Ich bin mir auch nicht sicher ob das hier unbedingt das richtige Forum für Mikrocontroller ist (obwohl ich dir mikrocontroller.net auch nicht antun möchte), die meisten hier kennen sich eher mit industrieller Steuerungstechnik aus, aber ich versuchs trotzdem mal.

Aus dem Bauch hätt' ich gesagt, dass das eher mit dem delay() im main zusammenhängt, als damit was du in das Register schiebst.
Da kannst du eigentlich nur versuchen Schritt-für-Schritt zurück zu gehen und zu schauen was den Arduino zum Absturz bringt.
Ist auf deinem Raspberry irgendein Timeout eingestellt in den der mit dem 100ms Delay laufen würde?

Ich hab da auch nur mal kurz nach irgendwelchen Beschreibungen für die Libs gegooglet, scheinbar scheint die ModbusSerial.h aus dem LDuino Projekt zu sein, das auch FreeRTOS verwendet und der Modbus Mimik einen eigenen Task (wahrscheinlich genau dafür) spendiert hat.
FreeRTOS an sich ist schon ein echt interessantes Thema, leider hatte ich bis jetzt noch nicht wirklich Zeit damit rumzuspielen.
Vielen Dank für die Auskunft. Werde mich dann wahrscheinlich doch auf dem Forum austoben müssen :)

Mit Industrieller Steuerungstechnik kenne ich mich ein wenig aus, arbeite auch auf dem Beruf (Automation in einem Chemiekonzern)...

Im Raspberry ist die Standard Delay Zeit bei Modbus eingestellt, jedoch sollte dies ja eigentlich kein Problem sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
mein Tipp und Vorgehen ist bei solchen größeren Projekten, erst jeden Teil für sich zu testen und dann alle Teile im Programmcode Schritt für Schritt zusammenbringen. Also erst den Ultraschallsensor, dann den Modbusbaustein und dann beides zusammen testen.

Ich habe mit der lib noch nicht gearbeitet, aber du hast wahrscheinlich einen Beispielcode verwendet?
Dann müsste das letzte Programmsnippet von dir erstmal nichts weiter tun als diverse digitale/analoge Ein und Ausgänge zu lesen bzw. zu schreiben:

uint8_t pinMask_DIN[] = {12, 8}; //%QX0.0 %QX0.1
//Update modbus registers
for (int i = 0; i < NUM_DISCRETE_INPUT; ++i)
{
modbus.Ists(i, digitalRead(pinMask_DIN));
}
Schau doch mal wenn du das laufen lässt, ob du die Digitaleingänge 12 und 8 des Arduinos in den Modbus-Input-Registern siehst.
Also mit Modbus Function Code 2 (Read discrete Inputs) auslesen und schauen, ob sich was ändert, wenn du an den Eingängen des Arduinos Spannung anlegst.

Gruß Sven
 
Verwende doch erstmal Code tags damit das leserlich hier im Forum ist ;). Dann passt auch das eingerückte und es ist leserlich :D.

Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.

Du brauchst dann ja IMHO die andere Richtung? Wie ist denn der Arduino UNO mit dem Raspberry verbunden?
 
Verwende doch erstmal Code tags damit das leserlich hier im Forum ist ;). Dann passt auch das eingerückte und es ist leserlich :D.
@Sandro95 ... wie @the_muck schon geschrieben hat, bietet das Forum ein spezielles Quellcode-Feld:
Code:
[CODE] Code [ /CODE] // ohne Leerzeichen vor dem Backslash

code.png

Bitte editiere auch Deine oberen Beiträge und mache sie besser lesbar
 
Zurück
Oben