Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
08.08.2018, 07:39 (Dieser Beitrag wurde zuletzt bearbeitet: 08.08.2018 08:04 von jg.)
ich versuch euch mein Problem so gut wie möglich zu erklären & freue mich über jede Hilfe
Ich verweise gleich mal am Anfang darauf hin, dass ich mein Problem schon in einem Arduino Forum geteilt habe (https://forum.arduino.cc/index.php?topic=561969.0 ). Jedoch kennt sich dort kaum jemand mit LabVIEW selbst aus und da ich meine Software eben mit LabVIEW schreibe hoffe ich, dass ihr mir hier mit dem Softwareprogramm weiterhelfen könnt. Selbstverständlich stell ich, falls wir eine Lösung gefunden haben, diese sofort auf beiden Foren - möchte keine Crossposts erzeugen, mit denen ihr euch dann ewig beschäftigt, obwohl schon eine Lösung existiert.
Ich habe einen Stellantrieb (Master) und einen Sensor (Slave). Beide sind über I2C miteinander verbunden. Der Slave schickt nach Anforderung des Stellantriebes gewisse Messdaten an diesen. Jetzt soll dieser Sensor jedoch ersetzt werden.
Hierfür muss eine LabVIEW Software geschrieben werden, die je nach dem welche Registeradresse der Stellantrieb anfordert eben einen gewissen Wert zurückgibt. Das habe ich mit einem SubVI realisiert, der mittels Cases verschiedene Aktionen ausführt. Ich habe die Cases in Abhängigkeit von erstellten Adressen aufgebaut. Folglich wird wenn Adresse eins angegeben wird eben die Aktion vom 1 "Casefall" ausgeführt und wenn Adresse 2 dann die Aktion vom 2 "Casefall" usw. (bspw. Bit gesetzt oder nicht, Wert ausgegeben). Alles aktuellen Werte werden dann in einem Array gespeichert und sollen das Register des Stellantriebes nachbilden.
Als Schnittstelle habe ich einen Arduino Uno, da der auch als I2C Slave genutzt werden kann. Dieser Arduino ist über die Daten-, Takt- und Masseleitung mit dem Stellantrieb verbunden und soll nach Anfrage dieses Stellantriebes den gewünschten Wert liefern - wie eben der Orginal-Sensor das macht. Zudem ist der Arduino über USB mit dem PC verbunden.
Es müssen zuerst dem Arduino die Werte über USB übermittelt werden, sodass diese dann über I2C weitergeleitet werden können.
Ich habe jedoch noch nie mit Arduino gearbeitet und meine LabVIEW Erfahrungen sind auch nicht sehr groß.
Die erste Frage ist erstmal, ob ich mit LabVIEW ein Programm schreiben kann, dass dem Arduino Werte über USB schickt, die gespeichert werden und bei der Anfrage des Masters sofort gesendet werden?
Im Arduino Forum wurde darauf hingewiesen, dass der Arduino ein EEPROM hat und man dies eventuell darüber realisieren könnte. Wie schreib ich jedoch über LabVIEW was in den EEPROM? Ich habe bis jetzt nur Bausteine gefunden, mit denen ich die digitalen / analogen Pins beschreiben kann.
Ich habe mir erst einmal die Zusatzbausteine heruntergeladen, sodass ich LabVIEW und Arduino verknüpfen kann. Ich habe einmal die einfachen I2C Bausteinen (Arduino Init, Arduino I2C Read, Arduino I2C Write) und einmal Bausteinen von Arduino Compatible Compiner for Labview Home / Student.
Wie realisiere ich jedoch jetzt, dass mein Arduino ein Slave sein soll? Wie gebe ich dem Arduino eine Slave-Adresse? Wie sende ich ihm die Daten? Und wie werden dann die Daten an den I2C geschickt?
Ich habe schon probiert mit den zwei verschiedenen Baugruppen eine Software zu schreiben (sh. Anhang). Bin ich damit auf dem richtigen Weg oder ist das kompletter Schrott?
Ich freue mich über jede Hilfe
Schon mal vielen Dank im Voraus!
Sarah
ist es wichtig, das du die Daten des Sensors über Software ändern kannst?
Wenn nicht dann würde ich das weg lassen.
Die Arduino Libs für LV unterstützen nicht alle Funktionen des Arduino, kann es sein das die I2C Slave Funktion überhaupt nicht unterstützt wird? Glaube nicht das viele Nutzer diese Funktion benötigen.
Einen Arduino zu Programmieren ist nicht wirklich schwer, daher würde ich den simulierten Sensor auch in Arduino Code umsetzen. Für die Messwerte des Sensors hast du ja z.B. Analoge oder Digitale Eingänge, mit ein paar Potis, LEDs und Schaltern/Tastern solltest du damit also schon recht viel erreicht bekommen.
ist es wichtig, das du die Daten des Sensors über Software ändern kannst?
Wenn nicht dann würde ich das weg lassen.
Die Arduino Libs für LV unterstützen nicht alle Funktionen des Arduino, kann es sein das die I2C Slave Funktion überhaupt nicht unterstützt wird? Glaube nicht das viele Nutzer diese Funktion benötigen.
Einen Arduino zu Programmieren ist nicht wirklich schwer, daher würde ich den simulierten Sensor auch in Arduino Code umsetzen. Für die Messwerte des Sensors hast du ja z.B. Analoge oder Digitale Eingänge, mit ein paar Potis, LEDs und Schaltern/Tastern solltest du damit also schon recht viel erreicht bekommen.
Gruß Max
Hallo Max,
also die Werte müssen sich ändern, da z.B. immer wieder ein neuer Volumenstrom über I2C übergeben wird und somit der Stellantrieb immer wieder nachregeln soll.
Also in LV gibt es ja schon extra die Bausteine für I2C und Arduino - das Problem liegt ehr daran erst einmal die Daten auf den Arduino zu bekommen
Teilweise sollen eben auch vom Benutzer in LV Werte eingegeben werden und diese dann an den Stellantrieb übergeben werden.
Ich habe jetzt einmal probiert dem Arduino Werte zu senden.
Einmal habe ich das mit dem Baustein Send Receive realisiert, und einmal mit VISA Bausteinen.
Jedoch findet man nirgends irgendwie ein Beispiel wie man mit dem Send Receive Daten sendet bzw ob das überhaupt möglich ist - laut der Bezeichnung müsste es jedoch klappen oder nicht?
Ich habe mein Programm auf der Grundlage von (http://www.stefanocottafavi.com/labview-...d-float-1/ ) aufgebaut. Ich habe es im Anhang hinzugefügt.
Das Programm Arduino Daten gibt dann auch immer die Fehlermeldung (Fehler 5003 bei Arduino Daten.viLabVIEW Interface for Arduino.lvlib:Init.vi. A timeout occurred while trying to read form the Arduino.) aus - was bedeutet das genau für mein Programm - also was muss ich ändern?
Mit den VISA Bausteinen habe ich das Problem, dass nur Strings eingelesen werden können - ich brauch ja aber ein Array aus Integer Auch das Programm findet ihr im Anhang (Arduino Daten_Serial)
du hast meine Eingangsfrage falsch verstanden oder falsch beantwortet.
Die Werte müssen sich ändern lassen, keine Frage. Nur muss dies über eine Software passieren oder könnte man das auch als "Hardware" realisieren? Ein Arduino hat ja schon digitale/analoge Ein-/Ausgänge warum diese nicht einfach mit einem kleinen Arduino Programm und etwas Hardware wie Potis, LEDs, Schaltern/Tastern nutzen?
Mein Ansatz wäre jetzt eher den Simulierten Sensor aus den I2C Beispielen zusammen zu bauen. Vorteil wäre eben das der Arduino für sich laufen kann ohne weitere Software auf dem PC zu benötigen. Dazu kommt, das die Arduino Community recht gut aufgestellt ist. LV+Arduino ist dagegen eher nicht weit verbreitet. "Nachteil" für dich ist eben, das du dich mit Arduinos beschäftigen musst. Wobei man diese später auch für viele Projekte sehr gut einsetzen kann.
(09.08.2018 07:45 )MaxP schrieb: Hallo Sarah,
du hast meine Eingangsfrage falsch verstanden oder falsch beantwortet.
Die Werte müssen sich ändern lassen, keine Frage. Nur muss dies über eine Software passieren oder könnte man das auch als "Hardware" realisieren? Ein Arduino hat ja schon digitale/analoge Ein-/Ausgänge warum diese nicht einfach mit einem kleinen Arduino Programm und etwas Hardware wie Potis, LEDs, Schaltern/Tastern nutzen?
Mein Ansatz wäre jetzt eher den Simulierten Sensor aus den I2C Beispielen zusammen zu bauen. Vorteil wäre eben das der Arduino für sich laufen kann ohne weitere Software auf dem PC zu benötigen. Dazu kommt, das die Arduino Community recht gut aufgestellt ist. LV+Arduino ist dagegen eher nicht weit verbreitet. "Nachteil" für dich ist eben, das du dich mit Arduinos beschäftigen musst. Wobei man diese später auch für viele Projekte sehr gut einsetzen kann.
Gruß Max
Hallo, nein leider muss dass alles über eine Software laufen. Ich lese gleichzeitig über Modbus Register aus dem Stellantrieb aus. Diese Daten werden dann in LabVIEW verarbeitet und es werden neue Werte berechnet (aus den Daten vom Modbusregister und einigen Parametern die der Benutzer am Anfang vom Programm eingibt). Die berechneten Werte werden werden dann wieder mittels I2C meinen Stellantrieb übermittelt. Folglich bin ich an die Softwareverwendung gebunden
(09.08.2018 08:32 )Freddy schrieb: Hallo Sarah,
es gibt von NI einige fertige I2C VI.
Damit arbeite ich, die solltest Du Dir mal ansehen.
Gruß
Freddy
Hey Freddy,
diese Bausteine funktionieren aber doch nur, wenn ich bei meiner Hardware das "USB-8451 I2C-/SPI-Schnittstellengerät" von National Instruments verbaut habe oder nicht?
weil ich habe ja Arduino und da gibt es zwar auch schon vorgefertigte Bausteine, aber die Dokumentation ist da halt einfach miserabel
Zitat:leider muss dass alles über eine Software laufen.
Nein.
Zitat:Ich lese gleichzeitig über Modbus Register aus dem Stellantrieb aus. Diese Daten werden dann in LabVIEW verarbeitet und es werden neue Werte berechnet (aus den Daten vom Modbusregister und einigen Parametern die der Benutzer am Anfang vom Programm eingibt). Die berechneten Werte werden werden dann wieder mittels I2C meinen Stellantrieb übermittelt.
- Dein Stellantrieb kommuniziert sowohl über Modbus (RS232? TCP?) und über I2C - parallel? Was ist denn das für ein Antrieb?
- Du kannst die Modbus-Kommunikation mit LabVIEW/PC machen. Die berechneten Stelltwerte dann ber (virtuellem) COM-Port zum Arduino schicken. Dort dann per I2C zum Stellantrieb. Den Arduino-Teil dabei direkt mit der Arduino-IDE (nicht mit LINX/LIFA!) programmieren…
Zitat:diese Bausteine funktionieren aber doch nur, wenn ich bei meiner Hardware das "USB-8451 I2C-/SPI-Schnittstellengerät" von National Instruments verbaut habe oder nicht?
Ja, da hast du recht.
Aber für deinen Arduino gibt es garantiert auch fertige Bibliotheken, die die I2C-Kommunikation implementieren…
Zitat:leider muss dass alles über eine Software laufen.
Nein.
Zitat:Ich lese gleichzeitig über Modbus Register aus dem Stellantrieb aus. Diese Daten werden dann in LabVIEW verarbeitet und es werden neue Werte berechnet (aus den Daten vom Modbusregister und einigen Parametern die der Benutzer am Anfang vom Programm eingibt). Die berechneten Werte werden werden dann wieder mittels I2C meinen Stellantrieb übermittelt.
- Dein Stellantrieb kommuniziert sowohl über Modbus (RS232? TCP?) und über I2C - parallel? Was ist denn das für ein Antrieb?
- Du kannst die Modbus-Kommunikation mit LabVIEW/PC machen. Die berechneten Stelltwerte dann ber (virtuellem) COM-Port zum Arduino schicken. Dort dann per I2C zum Stellantrieb. Den Arduino-Teil dabei direkt mit der Arduino-IDE (nicht mit LINX/LIFA!) programmieren…
- Ja genau also mein Stellantrieb wird einerseits über Modbus RTU ausgelesen und fordert wiederum Daten über I2C von einem Sensor, bzw. der Sensorsimulation an.
Der Stellantrieb dient zur Volumenstromregelung. Die Modbus Verbindung dient eigentlich nur dafür, die aktuelle Klappenposition und so etwas zu bestimmen.
Zuerst werden Daten per I2C gesendet, dann regelt der Stellantrieb und dann werden Informationen über den Betriebszustand mittels Modbus ausgelesen.
- Den Programmablauf habe ich mir auch so vorgestellt, die Frage ist jedoch, wie ich die Werte auf den Arduino schicke und es dann möglich ist, dass diese Werte über I2C weitergeleitet werden. Irgendwie muss ich dann ja meinem Programm sagen, dass er die Daten auf dem Arduino weiterschickt, jedoch gibt es dafür keine Bausteine die das meiner Meinung nach machen.
Deswegen habe ich probiert gleich mit den fertigen Arduino-IDE Bausteinen die Daten per I2C zu senden (sh. Programm im Post 3)
(09.08.2018 08:55 )GerdW schrieb:
Zitat:diese Bausteine funktionieren aber doch nur, wenn ich bei meiner Hardware das "USB-8451 I2C-/SPI-Schnittstellengerät" von National Instruments verbaut habe oder nicht?
Ja, da hast du recht.
Aber für deinen Arduino gibt es garantiert auch fertige Bibliotheken, die die I2C-Kommunikation implementieren…
Ja, aber die ist eben so schlecht dokumentiert, dass man nicht wirklich weiß, wie man es aufbauen soll. Und all meine Versuche sind bis jetzt gescheitert.
Bei meinem aktuellen Programm (hab ich hier im Anhang mal hinzugefügt) schreibt der erste Baustein die 20 per I2C aber dann wenn er lesen soll kommt die Fehlermeldung:
Fehler 5003 bei LabVIEW Interfache for Arduino I2C Read.vi .... A timeout occurred while trying to read from the Arduino.
Aber ich verstehe nicht, wo mein Fehler ist
PS: Ich hab das Programm auch mal als Bild hinzugefügt, falls ihr die Bausteine eben nicht habt
Zitat:Den Programmablauf habe ich mir auch so vorgestellt, die Frage ist jedoch, wie ich die Werte auf den Arduino schicke und es dann möglich ist, dass diese Werte über I2C weitergeleitet werden. Irgendwie muss ich dann ja meinem Programm sagen, dass er die Daten auf dem Arduino weiterschickt, jedoch gibt es dafür keine Bausteine die das meiner Meinung nach machen.
- Der Datenaustausch mit einem Arduino kann über die (simulierte) serielle Schnittstelle erfolgen.
- Die Arduino-IDE bringt dafür Beispiele mit!
Zitat:Deswegen habe ich probiert gleich mit den fertigen Arduino-IDE Bausteinen die Daten per I2C zu senden
Ich rate davon ab, für diese Anwendung LINX/LIFA zu benutzen.
Arbeite mit der Arcuino-IDE und den dort angebotenen Bibliotheken.
Zitat:wenn er lesen soll kommt die Fehlermeldung: Fehler 5003 bei LabVIEW Interfache for Arduino I2C Read.vi .... A timeout occurred while trying to read from the Arduino. Aber ich verstehe nicht, wo mein Fehler ist
Du verwendest LINX/LIFA - hast du die entsprechende Runtime auf deinen Arduino aufgespielt?
Nochmal: ich empfehle, den Arduino mit der Arduino-IDE zu programmieren!