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!
ich absolviere im Moment mein Praxissemester und habe die Aufgabe bekommen ein LabVIEW-Programm zu erstellen, mit dem es möglich sein soll einen Temperaturkalibrator von SIKA (Typ TP38650) vom PC aus anzusteuern.
Mit der beiliegenden Software des Herstellers ist es lediglich möglich eine Solltemperatur des Heizblocks im Kalibrator einzustellen, anschließend zu warten bis angezeigt wird, dass die Temperatur stabil ist, um dann abzulesen was der Referenzfühler im Kalibrator für eine Temperatur anzeigt. Zusätzlich wird die Temperatur des Prüflings - insofern einer am Kalibrator angeschlossen ist - angezeigt. Diese beiden Temperaturen müssen bisher manuell in Excel eingetragen werden um die Temperaturdifferenz (Messfehler des Prüflings) zu ermitteln.
Das LabVIEW-Programm, das ich erstellen soll, muss folgendes können:
- Eingabe des Temperaturbereichs, in dem die Messungen erfolgen sollen (z.B. 100 - 300°C)
- Eingabe der Stufenhöhe (z.B. 10°C) => Es sollen von 100°C bis 300°C alle Temperaturen in 10°C-Abständen angefahren werden.
- Bei jeder anzufahrenden Temperatur soll gewartet werden bis der Kalibrator meldet, dass die Temperatur stabil ist.
- Anschließend soll die aktuelle Temperatur des Referenzfühlers und die des Prüflings abgefragt werden und in Excel abgelegt werden.
Nun zu meinem Problem:
Die Firma, in der ich das Praxissemester absolviere meinte, dass ein LabVIEW-Core1 für dieses Projekt völlig ausreichend wäre. Zu dem Zeitpunkt als ich den Kurs bei NI besuchte, wusste ich allerdings noch nicht, dass es in dem Projekt hauptsächlich um VISA und die Ansteuerung einer Hardware über eine serielle RS232 Schnittstelle geht. Genau diese Themen wurden in dem Kurs nur ganz kurz angeschnitten und es wurde uns geraten bei der Ansteuerung einer Hardware immer auf die NI-Treiber zurückzugreifen. Nun habe ich vor knapp einer Woche mein zu bearbeitendes Projekt erhalten. Als erstes habe ich nach NI-Treibern für den Kalibrator gesucht, die es aber leider nicht gibt, weshalb ich bei SIKA wegen eines Schnittstellenprotokolls angefragt habe. Dieses habe ich auch erhalten (Anhang1). Seitdem versuche ich seit ein paar Tagen mehr oder weniger vergeblich mit dem Kalibrator zu kommunizieren. Mir würde es vorerst einmal genügen, wenn ich dem Kalibrator über LabVIEW beispielsweise eine Solltemperatur vorgeben könnte, er diese einliest und anschließend auch anfährt, oder ich beispielsweise seinen Gerätetyp anfordern könnte und eine passende Antwort erhalten würde. Leider werde ich aus dem Schnittstellenprotokoll nicht schlau. Ich habe versucht mit Hilfe von den Beispielprogrammen "Basic_Serial_Write_and_Read" oder "Continuous_Serial_Write_and_Read" und dem Schnittstellenprotokoll Befehle zu Schreiben und anschließend auszulesen, aber der kalibrator hat auf nichts reagiert, was ich gesendet habe. Das einzige was funktioniert ist das Auslesen von Werten, die der Kalibrator dauerhaft sendet (aktuelle Blocktemperatur & aktuelle Temperatur am Referenzfühler). Diese beiden Werte sendet der Kalibrator ununterbrochen (Anhang2). Diese Werte will ich eigentlich aber nur dann abfragen, wenn der Kalibrator meldet, dass die angefahrene Temperatur stabil ist.
Ich verlange nicht, dass ich hier ein vollständiges VI zur Ansteuerung des Kalibrators erhalte, aber es wäre für mich als absoluten LV-Neuling schon einmal ein erster Erfolg, wenn ich dem Kalibrator Daten übergeben könnte, die er verarbeiten kann. Vielleicht kann mir jemand erklären, wie ich die Befehle aus dem Schnittstellenprotokoll senden muss, dass der Kalibrator was damit anfangen kann. Ich hoffe, ich habe mein Problem ausführlich genug beschrieben, sodass mir jemend auf die Sprünge helfen kann.
das Protokoll ist doch wunderschön im PDF erklärt: Botschaften, die von STX/ETX eingerahmt sind.
Beachten musst du nur, dass STX/ETX eben als Binärwert angegeben sind: einfach Stringkonstanten im Hex-Displaymodus verwenden!
Versuche doch mal, den gelesenen String im Bild anhand der Protokollbeschreibung zu entschlüsseln!
Vielen Dank für die schnelle und hilfreiche Antwort! Das Problem mit dem Übergeben von Sollwerten wurde gelöst!
Ich hatte STX/ETX nicht als Hex-Konstante angegeben. Nun da ich den Eingabestring mit den passenden Hex-Konstanten einrahme kann ich dem Kalibrator immerhin schon einmal Sollwerte zuweisen. Das nächste sich jetzt ergebende Problem ist, dass ich den zugewiesenen Sollwert im Anschluss gerne abfragen würde. Dies sollte eigentlich kein Problem sein, doch wenn ich den Wert abfrage, erhalte ich in der Ausgabe wieder nur die aktuelle Blocktemperatur und die Referenzfühlertemperatur. Kann es sein, dass mein einmalig angeforderter Sollwert ausgegeben wird, aber gleichzeitig wieder von den dauerhaft ausgegebenen Werten überschrieben wird, so dass ich ihn in der Ausgabe nicht sehen kann?
Kann ich die andauernde Ausgabe der Werte des Kalibrators irgendwie unterdrücken, sodass ich auch wirklich nur den Wert bekomme, den ich auch wirklich anfordere, oder muss ich hierzu den erhaltenen String irgendwie filtern?
Zitat:Versuche doch mal, den gelesenen String im Bild anhand der Protokollbeschreibung zu entschlüsseln!
Den gelesenen String verstehe ich soweit. Im Moment lese ich die Messwerte für die aktuelle Blocktemperatur und die Referenzfühlertemperatur aus. Diese Werte sendet mir der Kalibrator dauerhaft. Ich habe mal das FP und BD angehängt bei dem ich versucht habe mit "z" die aktuelle Temperatur anzufordern. Angezeigt bekomme ich aber wieder nur die dauerhaft gesendeten Werte.
Sorry für den Doppelpost, aber ich habe im Moment entdeckt, dass der angeforderte Wert wie vermutet irgendwo zwischen den dauerhaft gesendeten Werten erscheint. Das bedeutet, um diesen angeforderten Wert irgendwo angezeigt zu bekommen, muss ich den gelesenen Text filtern oder? Bräuchte eine Anregung wie ich das umsetzen könnte!?
22.12.2014, 18:36 (Dieser Beitrag wurde zuletzt bearbeitet: 22.12.2014 18:39 von GerdW.)
wenn du deine Botschaften einliest, musst du sie doch sowieso schon filtern:
- STX suchen
- folgendes ETX suchen
- Botschaft zwischen STX und ETX auswerten
Wenn du das machst, ist es doch ein leichtes, die Botschaft, die als Kennung ein "s" enthält, auszufiltern…
Frage:
Wieso musst du einen Sollwert vom Gerät zurücklesen? Wenn du einen Sollwert vorgibst, ist er dir doch schon bekannt!
Oder funktioniert dein Gerät anders?
Zu deinem BD-Bild:
- Der "Run Continuous"-Modus ist nur zum Debuggen gedacht. Wenn dein Programm dauerhaft laufen soll, benötigst du eine Schleife…
- Es ist nicht sinnvoll, dauernd den seriellen Port zu initialisieren und wieder zu schließen…
- warum schaltest du den TermChar aus? Du hast doch ein sehr schön definiertes ETX-Zeichen!!!
Zitat:wenn du deine Botschaften einliest, musst du sie doch sowieso schon filtern:
- STX suchen
- folgendes ETX suchen
- Botschaft zwischen STX und ETX auswerten
Im Moment filtere ich noch gar nichts, ich weise dem Kalibrator nur manuell Werte zu indem ich die Befehle aus dem Schnittstellenprotokoll eingebe.
Der Kalibrator sendet mir ja andauernd Werte, wobei jeder einzelne Wert mit STX beginnt und ETX endet, wie muss mein Filter denn dann aussehen, dass ich aus diesen ganzen Daten die eine Botschaft finde, die ich benötige?
Zitat:Wenn du das machst, ist es doch ein leichtes, die Botschaft, die als Kennung ein "s" enthält, auszufiltern…
Im Moment ist es noch nicht so leicht für mich, da das mein erstes Programm ist, das ich selber erstelle.
Zitat:Frage:
Wieso musst du einen Sollwert vom Gerät zurücklesen? Wenn du einen Sollwert vorgibst, ist er dir doch schon bekannt!
Oder funktioniert dein Gerät anders?
Das mit dem Sollwert war nur ein Beispiel um zu sehen, ob das Auslesen von zusätzlichen Werten neben den dauerhaft gesendeten Werten funktioniert, weil ich eben hier schon genau wusste nach welchem Wert ich in der Ausgabe suchen muss.
Zitat:Zu deinem BD-Bild:
- Der "Run Continuous"-Modus ist nur zum Debuggen gedacht. Wenn dein Programm dauerhaft laufen soll, benötigst du eine Schleife…
- Es ist nicht sinnvoll, dauernd den seriellen Port zu initialisieren und wieder zu schließen…
Ich mache ja im Moment nichts anderes als zu Debuggen. Ich versuche im Moment nur mit dem Kalibrator zu kommunizieren (Daten einlesen, Daten auslesen). Erst wenn es auch noch funktioniert, dass ich genau den einen gewünschten Wert auslesen kann, werde ich mit dem eigentlichen Programm anfangen, das dann eben auch Benutzerein- und Ausgaben, Schleifen usw. beinhaltet.
Zitat:- warum schaltest du den TermChar aus? Du hast doch ein sehr schön definiertes ETX-Zeichen!!!
Der TermChar war in meinem Programm schon vordefiniert False, das war keine Absicht. Ich muss auch zugeben, dass ich immer noch nicht genau verstehe was mein TermChar eigentlich macht. Ist der TermChar auf True erkennt das Gerät das Abschlusszeichen. Inwiefern hilft mir das weiter?
Zitat:Der TermChar war in meinem Programm schon vordefiniert False, das war keine Absicht. Ich muss auch zugeben, dass ich immer noch nicht genau verstehe was mein TermChar eigentlich macht. Ist der TermChar auf True erkennt das Gerät das Abschlusszeichen. Inwiefern hilft mir das weiter?
VISARead liest Daten ein, bis:
- die gewünschte Anzahl Bytes gelesen wurde
- das eingestellte TermChar im Datenstrom auftaucht
- der Timeout erreicht wurde
- ein anderer Fehler auftritt
Wie hilft dir also das TermChar? Du stellst ETX ein, dann liest VISARead solange Daten ein, bis eben ein ETX im Datenstrom auftaucht. Dein Gewinn: du erhälst genau eine Botschaft vom VISARead geliefert, die du dann auswerten kannst (z.B. mit den String-Funktionen). Da dein Gerät dauernd Daten liefert, musst du natürlich auch dauernd Botschaften mit VISARead abholen, da sonst irgendwann der Lesepuffer deiner seriellen Schittstelle überläuft…