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 

parametertyp - datenzeiger: kein Anschluß unter dieser Kiste



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.11.2007, 17:20
Beitrag #11

t4b-1re-2 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 155
Registriert seit: May 2007

8.5
2007
de

99*
Deutschland
parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
' schrieb:Ich verwende auch PostgreSQL, aber mit DLLs habe ich da nichts zu tun.... Was hast Du denn vor?

siehe:
http://www.LabVIEWforum.de/index.php?showtopic=7581
oder auch
http://sourceforge.net/projects/pqsql2LabVIEW/

Ich verwende die C-API von PostgreSQL die in Form einer dll (bzw. unter Linux einer .so) vorliegt. und binde deren Funktionen in LV ein. Das heißt ich verzichte vollständig auf ODBC und auf das Database-Toolkit von LV. Erreiche dadurch aber, dass die Datenbankschnittstelle sowohl unter Linux als auch unter Windows 1zu1 funktioniert, was bei ODBC nicht der fall sein dürfte - jedenfalls nicht so ohne weiteres - und definitiv nicht beim DB-Toolkit, welches ADO verwendet, was Microsoft proprietär ist.

Momentan bin ich gerade dabei mir die COPY-Funktionen ( http://www.postgresql.org/docs/8.2/interac...PQ-COPY-RECEIVE ) verfügbar zu machen. Was (noch) daran scheitert, dass mein Aufruf von PQgetCopyData in LV nur Grütze liefert - siehe oben...

Viele Grüße
t4b-1re-2
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.11.2007, 22:32
Beitrag #12

rolfk Online
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
' schrieb:Also ich mache das immer so, wie in dem Bild.
Ich verwende auch noch LV7.1, in LV8.2 habe ich gesehen, dass da zusätzliche Optionen drinn sind.
Wozu, wie die zu verwenden sind, weis ich auch nicht.

Das ist im Prinzip in Ordnung. Trotzdem eine Warnung. Wenn Du einen String als Buffer verwendest sollte der entsprechende Parameter auch wirklich ein String sein. LabVIEW sucht nach Rückkehr von der Call Library Node einen als C String Pointer übergebenen Pointer nach einem NULL Charakter und kappt den String da ab. Wenn die DLL aber binäre Daten zurückgibt ist ein NULL Byte sehr schnell irgendwo vorhanden.

Für binäre Datenpointer also besser ein U8 1D Array Pointer in der Call Library Node konfigurieren.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.11.2007, 22:45
Beitrag #13

rolfk Online
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
' schrieb:Wie ich das mit dem Array lösen soll ist mir noch nicht klar. Da in LabVIEW die Arrays dynamisch sind, wird die Arraylänge vorangestellt, was in C dann natürlich nicht passt. Einzige Lösung scheint wohl zu sein statt Arrays ebenfalls Cluster zu verwenden, wobei dann aber die Größe bekannt sein muß und dieses Cluster dann "von Hand" angelegt werden muss!? http://forums.ni.com/ni/board/message?boar...uireLogin=False
Das geht so nicht wenn der String oder das Array ein Pointer ist (type *name). Wenn es dagegen ein Fixed size Array ist (type name[zahl]) dann ist das die richtige Weise.

Zitat:Dein Problem liegt glaube ich am Parametertyp Datenzeiger:

Wozu der gut ist weiß ich nicht. Die Beschreibung dazu ist recht dürftig. Wenn ich das auswähle, kommt bei mir auch der Fehler dass die Verbindung ungültig ist.

In Englisch heisst das glaube ich "Instance Data Pointer". Das ist ein impliziter Datenpointer der mit der jeweiligen Call LibraryNode assoziert ist und auch an die Callbackfunktionen die im nächsten Tab konfiguriert werden können übergeben werden. Das ist nur für ganz Advanced Anwendungen, etwa ein direktes Ansprechen von Hardwaretreibern, um LabVIEW z.B. die Möglichkeit zu geben einen Aufruf der innerhalb der Call Library Node am Warten ist, abrechen zu können wenn der Benützer den Abort Button betätigt.

Zitat:Aber wenn Du Datentyp: "An Datentyp anpassen verwendest" dann kannst Du auch verbinden. Was dann bei "Format" einzustellen ist, ist mir allerdings auch nicht klar. Vielleicht kann ich Dir morgen mehr sagen, wenn es denn bei mir klappen sollte.

Nicht machen!!! Dann werden die LabVIEW Datentypen direkt übergeben. Das hat nichts mit gewöhnlichen C Datentypen zu tun und funktioniert nur wenn die entsprechende Library explizit dafür programmiert wurde um direkt mit LabVIEW Datentypen umzugehen.

Es ist 99.9999999999999% sicher anzunehmen dass jede DLL die man in freier Wildbahn entgegekommen kann mit diesen Datentypen im besten Fall crasht, und eventuel gar Schlimmeres macht.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.11.2007, 23:16 (Dieser Beitrag wurde zuletzt bearbeitet: 02.12.2007 14:04 von jg.)
Beitrag #14

rolfk Online
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
Zitat:
' schrieb:siehe:
http://www.LabVIEWforum.de/index.php?showtopic=7581
oder auch
http://sourceforge.net/projects/pqsql2LabVIEW/

Ich verwende die C-API von PostgreSQL die in Form einer dll (bzw. unter Linux einer .so) vorliegt. und binde deren Funktionen in LV ein. Das heißt ich verzichte vollständig auf ODBC und auf das Database-Toolkit von LV. Erreiche dadurch aber, dass die Datenbankschnittstelle sowohl unter Linux als auch unter Windows 1zu1 funktioniert, was bei ODBC nicht der fall sein dürfte - jedenfalls nicht so ohne weiteres - und definitiv nicht beim DB-Toolkit, welches ADO verwendet, was Microsoft proprietär ist.

Momentan bin ich gerade dabei mir die COPY-Funktionen ( http://www.postgresql.org/docs/8.2/interac...PQ-COPY-RECEIVE ) verfügbar zu machen. Was (noch) daran scheitert, dass mein Aufruf von PQgetCopyData in LV nur Grütze liefert - siehe oben...

Der Datenpointer den Du da gerne haben möchtest ist ein Pointer auf einen Pointer, Das unterstützt LabVIEW nicht direkt, da es nicht eindeutig ist. In C kann ein Pointer im Pinzip ein Array sein oder einfach ein Pointer. Ein Pointer to Pointer kann also ein Array von Pointern sein, ein Pointer zu einem Array, ein Array von Arrays, oder auch ein Pointer zu einem Pointer. LabVIEW kann diese Dinge alle nicht direkt unterstützen und was noch schlimmer ist, kann auch nicht raten welche der vier Möglichkeiten nun gemeint ist, abgesehen von den Memorymangementdetails die hier alles noch extra komplex machen.

So wie ich die Funktionsbeschreibung lese wird der Speicher vom PostgreSQL Treiber angelegt. Das ist im Prinzip schon einmal nicht schlecht, da Du diesen Parameter dann einfach als einen Pointer auf einen uInt32 konfigurieren kannst. Der Inhalt aus diesem Buffer kannst Du dann mit einem Memorycopy in einen LabVIEW String kopieren, aber das ist auch nicht ganz trivial. Zuerst musst Du nämlich ein entsprechendes Array von Bytes anlegen, dann mit memcpy() die Daten aus dem PostgreSQL Buffer in Dein LabVIEW Array kopieren.
Zuletzt bitte den Pointer mit PQfreemem() von PostgreSQL wieder deallozieren.

Die memcpy() Funktionen kannst Du auch direkt aus LabVIEW mit einer CLN aufrufen nur heissen sie dort MoveBlock(). Der Libraryname ist dann "LabVIEW".

Ein kurzes Beispiel ist angehängt aber natürlich ohne Gewähr. Ich habe noch nie mit PostgreSQL gearbeitet und weiss auch nicht genau wie der PGConn handle parameter genau gemeint ist, noch wann wirklich ein Fehler von der Funktion angegeben wird.


Sonstige .vi  POSTGRE_Copy_Data.vi (Größe: 19,98 KB / Downloads: 215)
(LV 8.5)

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.11.2007, 09:33
Beitrag #15

Guest
Unregistered


 







parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
' schrieb:...
Für binäre Datenpointer also besser ein U8 1D Array Pointer in der Call Library Node konfigurieren.

Rolf Kalbermatter

Danke Rolf, hat sich einfach angehört. Klappt aber logischerweise nicht, da dann die Datentypen nicht zusammenpassen.

   

Auch hätte ich da Bedenken, dass die dll damit zurecht kommt. Die erwartet doch einen Pointer auf die angegebene Struktur!? Aber ich bin kein C-Freak.Sad.

Ebenso wird doch dann der Returnwert nicht passen. Da sollten die Daten dann in der definierten Struktur/Cluster vorhanden und verwendbar sein.

Georg
Diese Nachricht in einer Antwort zitieren to top
09.11.2007, 10:00
Beitrag #16

t4b-1re-2 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 155
Registriert seit: May 2007

8.5
2007
de

99*
Deutschland
parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
Hallo Rolf,

zuallererst: Danke für deinen Support!
Ich kann leider nicht ausprobieren du gesendet hast, mein kommt LV8.5 erst die Tage....

Viele Grüße
t4b-1re-2
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
09.11.2007, 10:09 (Dieser Beitrag wurde zuletzt bearbeitet: 09.11.2007 10:25 von rolfk.)
Beitrag #17

rolfk Online
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
' schrieb:Danke Rolf, hat sich einfach angehört. Klappt aber logischerweise nicht, da dann die Datentypen nicht zusammenpassen.

[attachment=36545:Screecshot1.jpg]

Auch hätte ich da Bedenken, dass die dll damit zurecht kommt. Die erwartet doch einen Pointer auf die angegebene Struktur!? Aber ich bin kein C-Freak.Sad.

Ebenso wird doch dann der Returnwert nicht passen. Da sollten die Daten dann in der definierten Struktur/Cluster vorhanden und verwendbar sein.

Cluster sind etwas lästig, aber C technisch ist es auch nur ein Speicherbereich einer bestimmten Anzahl Bytes und als Funktionsparameter wird da eben auch nur ein Pointer auf diesen Speicherbereich übergeben. Das Lästige an Clustern sind zweierlei Dinge. Erstens wenn Du Pointers in der Struktur hast. Das kann LabVIEW so nicht tun. Wenn es dagegen ein fixed size Array ist werden alle Bytes dieses Arrays innerhalb der Struktur selber embedded, d.h. die Struktur wird um soviele Bytes länger.

Das lästigere Problem ist Padding. Für bestimmte Prozessorarchitecturen ist es SEHR nachteilig wenn ein Programm eine Variable im Speicher ansprechen will, die nicht auf einer Adresse beginnt die ein Vielfaches der Grösse dieser Variablen ist. Das heisst z.B. wenn Du eine double Fliesskommazahl hast (8 Bytes im Speicher) sollte die auf einer Adresse im Specher liegen die ohne Rest durch 8 teilbar ist. Auf x86 Prozessoren hält sich der extra Aufwand um so eine Specherstelle anzusprechen in Grenzen, da er ja ohnehin immer noch eine 8bit Vergangenheit mitschleppt. Sparc um nur ein Vorbild zu nennen braucht dazu aber eine Vielzahl der Taktzyklen die ein korrekt aligned Operand benötigen würde.

Wenn man also ein Programm kompiliert, gibt man das Padding als Compileroption mit an, oder fügt eine entsprechende #pragma Anweisung in den C source code. Der auf diese Weise an den Compiler mitgegebene Paddingparameter bestimmt wie der Compiler die verschiedenen Datentypen im Speicher anordnet. Dabei gilt dass ein Operand immer auf einer Adresse angelegt wird die ein ganzzahliges Vielfaches des kleineren der zwei Werte Operandsize und Padding ist. Wenn das Padding 8 ist (der Default für Visual C 32 Bit) dann wird ein Word (16 Bit) also immer auf einer geraden Adresse liegen, ein Long (32 Bit) auf einer durch 4 teilbaren Adresse und ein Double (8 Byte Fliesskommazahl) auf einer durch 8 teilbaren Adresse. Nicht benützte Bytes die auf diese Weise durch den Compiler in die Struktur eingefügt werden, nennt man Paddingbytes oder Fillbytes und sind ohne krumme C Tricks gar nicht ansprechbar.

Unter Windows kann man also davon ausgehen, dass die meisten DLLs ein 8 Byte Padding benützen. Ob das aber bei einer bestimmten DLL so ist muss aus der Dokumentation hervorgehen oder kann eventuel anhand der #pragma Anweisung aus dem Headerfile ersehen werden.

Aber: LabVIEW verwendet aus historischen Gründen unter Windows ein 1 Byte Padding für seine Speicherstrukturen und damit auch für Clusters. Das heisst die Clusters sind immer packed und ohne Fillbytes. An sich ist das keine Katastrophe, mit einem packed Compiler kann man padded Strukturen immer nachbilden, umgekehrt ginge aber nicht. Man muss beim Aufbau der Cluster in LabVIEW einfach aufpassen, dass man diese Fillbytes expliziet mit in den Cluster einbaut, bevor man den Cluster an die Call Library Node gibt.

Im Falle eines Clusters der keine String oder Arraykontrolls enthält ist übrigens die Verwendung des "Pass Native Datatype" die einfachste Weise um doch einen C kompatible structure zu erhalten. Man muss einfach aufpassen dass das Speicherlayout des Clusters mit dem übereinkommt was die DLL als structure erwartet.

ABER: das gilt wirklich nur für flache Cluster. Sobald ein LabVIEW Array oder String in irgendeiner Weise direkt als CLN Parameter oder indirekt in einem Cluster der als CLN Parameter benützt wird vorkommt, ist "Pass als Native Datatype" in 99.999999% der Fälle garantiert falsch!!!!!

Alternativ kann man auch ein genügend grosses Bytearray anlegen in LabVIEW, die entsprechenden Daten vor dem Aufruf da am richtigen Offset hineinbasteln, und nach dem Aufruf die gewünschten Daten am richtgen Offset innerhalb des Arrays wieder herausbasteln. Das ist aber supermühselig und nur in sehr seltenen Fällen sinnvoll (aber war in älteren LabVIEW Versionen die noch kein "Pass native Datatype" hatten die einzige Variante um keine Wrapper DLL schreiben zu müssen).

Zu Deinem Problem selbst, für einen Cluster also "Pass Native Datatype" gebrauchen (aber bitte nur wenn da keine Strings oder Arrays drin sind).
Die Alternative ist um den Cluster zu Typecasten. Das hat aber den Nachteil das Typecast immer einen Big Endian Transformation durchführt und Deine x86 DLL Little Endian Zahlen im Cluster erwartet. Abhilfe ist um den Cluster für VIs die unter einem x86 OS laufen müssen erst mit Swap Bytes and Swap Words zu verkehren, so dass die Big Endianisierung des Typecasts wieder ungeschehen gemacht wird.
Oder seit LabVIEW 8.0 kann man einfach Flatten To String verwenden und dort selektiert man dann die gewünschte Endianess. Aber diesen String sollte man nicht als C String Pointer an die CLN übergeben, wenn man ihn nach dem Aufruf wieder in einen Cluster Unflatten möchte um die darin enthaltenen Daten auszuwerten, da LabVIEW bei der Rückkehr diesen String beim ersten Nullbyte abkappt. Also zuerst in ein Bytearray verwandeln, dann an die CLN als Arraypointer auf U8 übergeben, danach wieder zurückvervandeln in einen String und dann Unflatten. Aber dies ist wirklich mehr rethorisch da ja der Native Datatype das alles auch viel einfacher macht.

Wie dem auch sei, alle diese Varianten funktionieren wirklich nur für Cluster die garantiert keine Strings oder Arrays enthalten.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.11.2007, 12:50 (Dieser Beitrag wurde zuletzt bearbeitet: 02.12.2007 14:04 von jg.)
Beitrag #18

Guest
Unregistered


 







parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
Vielen, vielen Dank Rolf für Deine Mühen und ausführlichen Erklärungen. Ich schreibe den Text hier nun schon zum dritten Mal. Und jedes Mal wird er etwas kürzer. Ist nicht mein Tag heuteSad.

Aber es ist mir nun einiges klarer. Insbesondere von dem Padding hatte ich keine Ahnung. Ist doch ganz schön kompliziert das Ganze. Ich werde wohl auf jeden Fall einen Wrapper.dll brauchen, die ich dazwischenschalte um die Arrays aus der Struktur herauszunehmen. Ich werde ja sowieso eine brauche wg. der callback-Funktionen.

In der Zwischenzeit hatte ich versucht meine Anwendung auf ein kleines Beispiel herunterzubrechen. Mit VisualStudio bin ich leider zu keinem Ergebnis gekommen. Es hapert wohl an irgendwelche Einstellungen. Gegen Mitteg kam mir dann die Idee es mit Eclipse und MiniGW zu probieren. Da hat es auf Anhieb geklappt. Ist halt nicht so überladen das Ganze.

Diesen Code habe ich nun beigelegt. Nachdem ich viel im Netz gesucht habe, bin ich mir sicher, dass es viele gibt, die dieses gleiche Problem haben. So wäre es gut, wenn es ein Musterbeispiel von einem Profi wie Dir geben würde, von dem sich dann das meiste ableiten läßt. Meinst Du, Du kannst das machen?

Die Arrays müßtest Du halt dann rausnehmen, damit es nicht zu aufwändig wird für Dich. Ich muß nun leider los und kann erst am Montag weitermachen.

Schönes WE
Georg

(VI LV 8.2)


Angehängte Datei(en)
Sonstige .zip  DLLParametertest.zip (Größe: 198,06 KB / Downloads: 190)

Sonstige .vi  cbus_initialize.vi (Größe: 27,47 KB / Downloads: 192)
Diese Nachricht in einer Antwort zitieren to top
09.11.2007, 13:03
Beitrag #19

t4b-1re-2 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 155
Registriert seit: May 2007

8.5
2007
de

99*
Deutschland
parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
Hallo Rolf,

doch noch mal kurz die bitte, ob du dein Beispiel zwecks MoveBlock() nicht in eine LV8.2 Datei konvertieren kannst.

Viele Grüße
t4b-1re-2
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.11.2007, 13:14
Beitrag #20

RoLe Offline
LVF-Guru
*****


Beiträge: 1.236
Registriert seit: Jul 2007

-
1997
en

0
Schweiz
parametertyp - datenzeiger: kein Anschluß unter dieser Kiste
Du findest sonst hier auch ein MoveBlock und eine Diskusion zum Thema.

http://forums.ni.com/ni/board/message?boar...ssage.id=279278

http://zone.ni.com/devzone/cda/epd/p/id/2242

Gruss
Roland

.·´¯)--> Leben ist das, was dir passiert, wenn du eifrig dabei bist andere Pläne zu machen <--(¯`·.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Übergabe von Datenzeiger Cubaner 3 6.010 22.01.2008 13:18
Letzter Beitrag: rolfk

Gehe zu: