INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

VISA Read und Bytes at Port



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!

18.09.2009, 08:06
Beitrag #1

tanka Offline
LVF-Grünschnabel
*


Beiträge: 39
Registriert seit: Jul 2009

8.6
-
de

95541
Deutschland
VISA Read und Bytes at Port
Hallo,
ich hab folgende Funktionen in der Modbus Library von ni welches ich benutze:
- VISA: Read
- Eigenschaftsknoten Bytes at Port

Meine Frage bezieht sich auf das Entleeren des Eingangspuffers von VISA Read, und zwar was geschieht wenn mehrere Responsetelegramme hintereinander empfangen werden sollen, wird der Eingangspuffer dann überschrieben, serialisiert, verworfen,...

Was passiert außerdem mit dem Eigenschaftsknoten Bytes at Port wenn im Moment erst ein Teil der Responsedaten empfangen wurden?

Wie kann ich mehrere nacheinander eintreffende Responsetelegramme voneinander unterscheiden, bzw. feststellen ob ein Telegramm nicht empfangen wurde?
Die llb gibts bei NI in der developers Zone

Vielleicht weis ja jemand bescheid.

Gruß
tank

   


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
19.09.2009, 08:58
Beitrag #2

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
VISA Read und Bytes at Port
VISA read liest immer höchstens die Anzahl an Bytes aus, die Du an Bytes at Port anschließt.

Hier der Auszug aus der LabVIEW-Hilfe:

VISA Read Details
This function might return less than the number of bytes requested if the function reaches the end of the buffer, reaches a termination character, or if a timeout occurs. The output error cluster indicates if a timeout has occurred.

Whether the data is read synchronously or asynchronously is platform-dependent. Right-click the node and select Synchronous I/O Mode»Synchronous from the shortcut menu to read data synchronously.

When you transfer data from or to a hardware driver synchronously, the calling thread is locked for the duration of the data transfer. Depending on the speed of the transfer, this can hinder other processes that require the calling thread. However, if an application requires that the data transfer as quickly as possible, performing the operation synchronously dedicates the calling thread exclusively to this operation.


Gruß Markus

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
20.09.2009, 09:35 (Dieser Beitrag wurde zuletzt bearbeitet: 28.08.2019 07:58 von Lucki.)
Beitrag #3

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
VISA Read und Bytes at Port
Das sind viele Fragen:
Zitat:- Eigenschaftsknoten Bytes at Port
Hier handelt es sich um eine reine Statusmeldung, im Buffer ändert sich nichts. Man kann den Ausgang dazu benutzen, ihn an VISARed anzuschließen, so daß dann genau die Anzahl Bytes gelesen werden, welche im Buffer sind
Zitat:VISA: Read
Das steht schon im Posting von Markus. Also auf Deutsch: die Funktion wartet, bis eines der drei Ereignisse eingetritt:
a) Die am Eingang angeschlossene Bytezahl (oder mehr) befinden sich im Empfangsbuffer.
b) Falls in VISAKonfig aktiviert: TerminalChr trifft ein. In der Regel ist das 0xA
c) Timeout. Wert wird in Visakonfig eingestellt.
Edit zu b)
Wenn im Moment des Lesens nicht mehr auf das Eintreffen von 0xA gewartet werden muß, weil sich im Puffer schon eine Zeichenkette mit ein oder mehreren 0xA befindet, dann liest VisaRead ohne zu warten den Teil des Puffers bis zum nächsten 0xA aus.

Zitat:Meine Frage bezieht sich auf das Entleeren des Eingangspuffers von VISA Read, und zwar was geschieht wenn mehrere Responsetelegramme hintereinander empfangen werden sollen, wird der Eingangspuffer dann überschrieben, serialisiert, verworfen,...
Überschrieben wird der Empfangsbuffer grundsätzlich nicht. Es gibt da 2 Möglichkeiten.
a) Mit Flußkontrolle (Entweder "Hart" mit RTS/CTS oder "Soft" mit Xoff/Xon): Das Senden von Bytes (auf der Gegenstelle) wird gegebenenfalls verhindert, damit der Empfangsbuffer nicht überläuft.
b) Ohne Fußkontrolle: Hier muß dafür gesorgt sein, das der Empfangsbuffer genügend groß ist bzw. mit genügender Geschwindigkeit entleert wird. Wenn der Buffer voll ist und es wird weiter gesendet, dann wird nichts überschrieben, sondern die weiter gesendeten Bytes werden ins Nirvana gesendet und gehen verloren.

Zitat:Was passiert außerdem mit dem Eigenschaftsknoten Bytes at Port wenn im Moment erst ein Teil der Responsedaten empfangen wurden?
Wie ich schon sagte, passiert beim Lesen von Bytes at Board nie etwas, es wird die momentane Anzahl von Bytes im Buffer ausgegeben, fertig. Man kann auch den Eigenschaftknoten in eine While-Schleife hineintun und so lannge pollen, bis eine erwartete Anzahl von Bytes im Buffer eingetroffen ist.

Zitat:Wie kann ich mehrere nacheinander eintreffende Responsetelegramme voneinander unterscheiden, bzw. feststellen ob ein Telegramm nicht empfangen wurde?
Die Telegramme werden in der Reihenfolge empfangen, in der sie gesendet wurden, won daher gibt es keine Probleme. Mit dem Eigenschaftknoten Bytes on Board kannst Du jederzeit konntrollieren, ob sich vielleicht mehrere Telegramme im Buffer angestaut haben und ob der Stau vielleicht sogar in die Nähe der voreingstellte Buffergröße kommt.
Eine andere Frage ist, wie man in einem Bytestrom von mehreren Telegrammen die Schittstellen zwischen den einzelnen Telegrammen (das Ende jedes Telegramms) feststellt. Möglichkeit 1: Mit TerminalChar. Nachteil ist: Datenbytes dürfen dann nur als ASCII-Zeichen gesendet werden, d.h es werden zwei ASCII-Zeichen für ein Datenbyte gebraucht. (Also z. B die Zeichenkette "FF" für die 8 bit-Zahl 255). Diese Übertragungsart ist der Regelfall, wir man schon daran sieht, daß Visa Read nur das Textformat annimmt. Der genannte "Nachteil" ist eher selten relevant.
Möglichkeit 2: Der Sender sendet nur nach Aufforderung, und man weiß, daß z.B 12 Bytes als Antwort kommen müssen. Dann wartet man mit VisaRead, bis 12 Bytes eingetroffen sind. Probleme mit Bufferüberlauf kann es da gar nicht geben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
27.08.2019, 11:32
Beitrag #4

Ratio Offline
LVF-Grünschnabel
*


Beiträge: 35
Registriert seit: Dec 2017

2017 Deutsch
2017
kA



RE: VISA Read und Bytes at Port
(19.09.2009 08:58 )Y-P schrieb:  VISA read liest immer höchstens die Anzahl an Bytes aus, die Du an Bytes at Port anschließt.

Hier der Auszug aus der LabVIEW-Hilfe:

VISA Read Details
This function might return less than the number of bytes requested if the function reaches the end of the buffer, reaches a termination character, or if a timeout occurs. The output error cluster indicates if a timeout has occurred.

Whether the data is read synchronously or asynchronously is platform-dependent. Right-click the node and select Synchronous I/O Mode»Synchronous from the shortcut menu to read data synchronously.

When you transfer data from or to a hardware driver synchronously, the calling thread is locked for the duration of the data transfer. Depending on the speed of the transfer, this can hinder other processes that require the calling thread. However, if an application requires that the data transfer as quickly as possible, performing the operation synchronously dedicates the calling thread exclusively to this operation.


Gruß Markus

Ich lese von einem Seriellen Port Daten aus (ohne 0A etc. sind spezielle Geräte). Jede runde lese ich 1 Zeichen aus (Bei "Byte Anzahl" von VISA Read 1 definiert). Ich habe aber nun ein Problem, dass mehr Daten kommen als ich auslesen kann, und somit der Buffer überläuft. Wenn das Programm zu viele Daten liest und am Port keine mehr anliegen, passiert nichts tragisches, das habe ich abgefangen. Nun muss ich einfach mehr Daten pro Runde lesen.

Was ich aber nun nicht ganz begreife ist folgendes: Ich lese bis jetzt immer 1 Zeichen (Pro Durchgang in der While Schlaufe). Um die Zeit zu kürzen, habe ich gelesen soll man gleich mehrere Zeichen auslesen. Bei meinem Programm werden die einzelnen Zeichen aber zusammengefügt bis die Grösse des Strings =25 Zeichen sind.

Was passiert nun wenn ich immer 2 Zeichen auslese? Wenn weniger als 2 anliegen gibt es dann einfach 1 Zeichen aus bzw. kann ich nun überhaupt noch auf 25 kommen (da ungerade)? Ich kann mir das nicht wirklich vorstellen wie das läuft, auch übrigens bei 4 oder 8 oder X Zeichen (ich rede aber nicht von der Byte at Port Funktion, sondern von auslesen mit gesetztem Timeout).

Besten Dank für die Hilfe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
27.08.2019, 11:51 (Dieser Beitrag wurde zuletzt bearbeitet: 27.08.2019 11:53 von GerdW.)
Beitrag #5

GerdW Offline
______________
LVF-Team

Beiträge: 17.480
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: VISA Read und Bytes at Port
Hallo Ratio,

Zitat:Was ich aber nun nicht ganz begreife ist folgendes: Ich lese bis jetzt immer 1 Zeichen (Pro Durchgang in der While Schlaufe).
Warum machst du das?
Entweder du empfängst Botschaften mit TermChar: dann nutze das TermChar und lese ganze Botschaften ein.
Oder du hast Botschaften ohne TermChar: dann sollte die Länge (und der Aufbau) der Botschaften schon bekannt sein - und du kannst wieder ganze Botschaften einlesen!

Zitat: Um die Zeit zu kürzen, habe ich gelesen soll man gleich mehrere Zeichen auslesen. Bei meinem Programm werden die einzelnen Zeichen aber zusammengefügt bis die Grösse des Strings =25 Zeichen sind.
Lese doch einfach 25 Bytes, wenn das deine komplette Botschaft ist…

Es hilft immer, ein VI anzuhängen. Und bei Gerätekommunikation: Manual zumindest auszugsweise bereitstellen…

Zitat: (ich rede aber nicht von der Byte at Port Funktion, sondern von auslesen mit gesetztem Timeout).
Wenn du mehr Zeichen abfragst, als innerhalb des Timeouts ankommen, dann bekommst du die im Buffer gesammelten Bytes und eine Timeout-Meldung. Den Timeout-Fehler kann man programmatisch behandeln - und die gelesenen Daten kann man trotzdem auswerten…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
27.08.2019, 12:04
Beitrag #6

Ratio Offline
LVF-Grünschnabel
*


Beiträge: 35
Registriert seit: Dec 2017

2017 Deutsch
2017
kA



RE: VISA Read und Bytes at Port
Diese Telegramme haben keine Term Char, da man Platz bzw. Daten sparen muss (Es handelt sich um ein Funktelegramm). Lediglich die ID etc. weiss ich. Da diese aber auch innerhalb der Daten rein theoretisch vorkommen kann (ID welches eigentlich nicht die ID ist sondern Daten) muss ich die Telegramme zerhacken, auch der Anfang ist nicht immer gleich.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
27.08.2019, 13:22
Beitrag #7

GerdW Offline
______________
LVF-Team

Beiträge: 17.480
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: VISA Read und Bytes at Port
Hallo Ratio,

es wird doch wohl hoffentlich eine Datenstruktur in diesen Telegrammen geben? Kannst du die mal wiedergeben?
Haben die Telegramme eine bestimmte Länge?

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.08.2019, 06:20
Beitrag #8

Ratio Offline
LVF-Grünschnabel
*


Beiträge: 35
Registriert seit: Dec 2017

2017 Deutsch
2017
kA



RE: VISA Read und Bytes at Port
Mein Programm funktioniert mittlerweile. Ja bei den Telegrammen ist jeweils der Anfang bekannt. Ich denke das könnte man ebenfalls mit TermChar benutzen. Ich werde das nächstes Mal so umsetzen.

Danke dir Gerd
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.08.2019, 06:55
Beitrag #9

GerdW Offline
______________
LVF-Team

Beiträge: 17.480
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: VISA Read und Bytes at Port
Hallo Ratio,

zumindest kann man den "start of message" als klaren Marker nutzen, um den Datenstrom, den du von deinem Gerät empfängst, wieder in die einzelnen Messages aufzutrennen…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.08.2019, 08:10 (Dieser Beitrag wurde zuletzt bearbeitet: 28.08.2019 08:10 von Lucki.)
Beitrag #10

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: VISA Read und Bytes at Port
Noch eine kleine Anmerkuung:
Das hervorragendste Merkmal der Funktion "Bytes On Board" ist, dass man sie normalerweise nicht braucht. Aber von Anfängern, der das Prinzip der seriellen Kommuunikation noch nicht vollständig durchschaut haben, wird sie fast immer benutzt, und zwar nicht redundant, sonder falsch, so dass das VI nicht funktioniert.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  VISA Read Fehler 1073807302 Stefan1101 4 7.753 29.08.2016 10:13
Letzter Beitrag: Stefan1101
  Serial Port mit Continuous Serial Read Write Hoang Nguyen 2 7.798 15.04.2016 10:35
Letzter Beitrag: Hoang Nguyen
  VISA Read mit Keithley 6487 dauert lange jusaca 3 5.581 28.01.2016 11:12
Letzter Beitrag: jusaca
  1x COM-Port, 2 x Write & 2x Read Jann 19 15.415 10.12.2015 14:17
Letzter Beitrag: jg
Shocked Error 1073807313 - VISA Read in HOST.vi Hattorii 11 11.628 02.04.2014 15:28
Letzter Beitrag: Hattorii
  VISA Read liest nicht alle Bytes von Bytes at Port numumba 2 7.080 21.01.2014 20:24
Letzter Beitrag: numumba

Gehe zu: