Hallo alle zusammen,
ich habe durch eine Firmenauflösung einen Differenzdrucksensor der Firma Fischer bekommen, mit diesem würde ich gerne Windgeschwindigkeiten in einem Zuluftkanal bei mir regeln. Wenn das ganze so mal funktioniert würde ich gerne ein Instructable zum Reglerentwurf + eigener Visual Studio GUI mit Arduino machen. Leider ist dieser Sensor nur MODBUS-RTU-RS485 fähig. Ihr ahnt damit hatte ich noch nie zu tun :).
Ich verwende einen Arduino UNO mit einem breakout board max485
http://www.dx.com/de/p/ttl-to-rs485-module-for-arduino-green-163849?tc=EUR&gclid=CLW7q_3EjdMCFScz0wodDuEAow#.WOUA1E1MQkg
Die Verkabelung hierzu:
Arduino <-> max485
0RX <-> RO
1TX <-> DI
2 <-> DE+RE
5V <-> VCC
GND<-> GND
Sensor <-> max485
D1 <-> A (Hier meine erste Unsicherheit, ob A auf D1 gehört hab den Hersteller mal angefragt)
D0 <-> B
Bus-R <-> mit allen GND Potentialen verbunden
Bus-R ist so eine Art 3. Busanschluss um alles auf ein gemeinsames Potential zu legen. (Hoffe das ist so in Ordnung)
Der Sensor ist bezüglich der Baudrate, Adresse und Paritäts und Stopbits mit einem DIP-Schalter zu konfigurieren
Hier habe folgendes eingestellt:
Baudrate:9600
Adresse : 24
Parität : keine
Stopbits : 1 Stopbit
Das Modbus Telegramm setzt sich dabei aus
1 Byte SlaveAdresse + 1 Byte Funktionscode + 0...252 Byte Daten + 2 Byte CRC Prüfwert zusammen
Als Libary würde ich gerne die SimpleModbusMaster.h benutzen (bin für anderes jedoch offen)
Ich habe hier mal den Beispielcode angefangen habe aber Probleme damit wie ich das Telegramm zusammenbaue. Nach Anleitung Seite 6 Kapitel 5.3.5 (siehe ganz unten Link zur Anleitung) enthält der Funktionscode "0x04 Read Input Registers" meine Druckwerte.
Jetzt frage ich mal die Modbus-Spezialisiten unter euch.
Nach Modbus Function Code 04 | Read Input Registers | Simply Modbus Software würde sich mein Telegramm um den ersten Druckmesswert Kanal 1 auszulesen doch folgendermaßen zusammensetzen : 18 04 0000 0001 CRC
Mein Gedankengang hierzu:
18 HEX entspricht als Dezimal 24 (meine Slave Adresse)
04 Funktionscode 0x04
0000 Adresse für Druckmesswert Kanal 1 ( Hier verstehe ich das Beispiel nicht ganz, also unsicher)
0001 Register 1 für Druckmesswert Kanal 1 ( Sollte stimmen oder? will ja nur ein Register auslesen)
CRC wird hoffentlich von der Libary automatisch berechnet weis hierzu jemand was?
So und zu meinem bisherigen Code der mir nur Schwachsinn liefert:
Wäre Cool wenn wer helfen könnte. Ich weis Modbusprobleme sind nix allzu neues hier aber die Topics hier beziehen sich meist auf Modbus Kommunikation Arduino zu Arduino.
Ich weis das ist viel was ich hier schreibe, aber ich hoffe es findet sich doch der ein oder andere der so etwas schon einmal gemacht hat und helfen kann, da es ja nicht ganz eigennützig sein soll.
Gruß und vielen Dank schon mal
Zaragesh
#include <SimpleModbusMaster.h>
/*
The example will use packet1 to read a register from address 0 (the adc ch0 value)
from the arduino slave (id=1). It will then use this value to adjust the brightness
of an led on pin 9 using PWM.
It will then use packet2 to write a register (its own adc ch0 value) to address 1
on the arduino slave (id=1) adjusting the brightness of an led on pin 9 using PWM.
*/
//////////////////// Port information ///////////////////
#define baud 9600
#define timeout 1000
#define polling 200 // the scan rate
#define retry_count 10
// used to toggle the receive/transmit pin on the driver
#define TxEnablePin 2
// The total amount of available memory on the master to store data
#define TOTAL_NO_OF_REGISTERS 1
// This is the easiest way to create new packets
// Add as many as you want. TOTAL_NO_OF_PACKETS
// is automatically updated.
enum
{
PACKET1,
// PACKET2,
TOTAL_NO_OF_PACKETS // leave this last entry
};
// Create an array of Packets to be configured
Packet packets[TOTAL_NO_OF_PACKETS];
// Masters register array
unsigned int regs[TOTAL_NO_OF_REGISTERS];
void setup()
{
// Initialize each packet
// erste 1 Steht für mein Register nach Anleitung 1
modbus_construct(&packets[PACKET1], 1, READ_INPUT_REGISTERS, 3, 1,18); // 3= Read Input Resgisters // 1 = ehrlich gesagt keine Ahnung hier //18 = Meine Slave Adresse in HEX
// Initialize the Modbus Finite State Machine
modbus_configure(&Serial, baud, SERIAL_8N1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs); // SERIAL_8N1 = Keine parität und 1 Stopbit
Serial.begin(9600);
}
void loop()
{
modbus_update();
// Soll mir die antwort ausgeben welche in regs geschrieben wird denke ich mal
Serial.print(regs[0]);
Serial.print(regs[1]);
Serial.print(regs[2]);
Serial.print(regs[3]);
Serial.print(regs[4]);
Serial.print(regs[5]);
Serial.print(regs[6]);
Serial.print(regs[7]);
Serial.print(regs[8]);
Serial.println(regs[9]);
}
Bedienungsanleitung Sensor mit BUS Beschreibung: http://www.fischermesstechnik.de/sites/default/files/BA_DE_DE43.pdf
Beschreibung der Simple Master Bibliothek: https://drive.google.com/drive/folders/0B0B286tJkafVYnBhNGo4N3poQ2c

