Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: liblvdave (libnodave und LabVIEW)

  1. #11
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Drei Gedanken, da ich gerade selbst nicht klar sehe:

    1. Ich kenne C# nicht. Da es ein C-Derivat ist, würde ich vermuten, daß es C-header files einbinden kann. Bei C++ wäre zusätzlich nötig:

    extern "C" {
    #include "nodave.h"
    }

    Das ist nötig, damit C++ es wie "normales" C behandelt und ein paar ++-Erweiterungen nicht anzuwenden versucht. Etliche header files anderer Bibliotheken haben das "extern "C" { " und "}" schon als erste und letzte (verarbeitete) Zeile eingebaut. Libnodave hat das nicht. Das liegt daran, daß ich die Möglichkeit offen halten wollte, es auf möglichst vielen Compilern zu übersetzen, also auch solche, die wegen ihres Alters (DOS) oder weil sie für Systeme gemacht sind, die kein C++ kennen (8051, AVR), nix von C++ wissen.
    Damit ich klarer sehe: Kann C# C-header includen? Ist das ein gewöhnlicher Weg?

    2. Normalerweise braucht das Anwenderprogramm von der inneren Struktur von daveInterface absolut keine Ahnung zu haben. Durch einbinden des headers wird sie ihm aber bekannt. Die Funktionszeiger braucht wohl kein Anwenderprogramm der Welt. Aber die Bibliothek braucht sie, um verschiedene Protokolle großenteils gleich aber an entscheidenden Stellen verschieden zu behandeln. Ein einfaches Anwenderprogramm (in C) sollte auch funktionieren, wenn man ihm eine vereinfachte header-Datei unterschöbe, in der daveInterface einfach mit void gleichgesetzt würde. Das sollte solange gut gehen, wie nicht versucht wird, auf interne Felder vn daveInterface zu zugreifen. Die einzig interessanten Felder für ein Anwenderprogramm sind timeout, falls jemand feststellt, das die Antwort von seiner CPU länger dauert und der Name, wenn jemand mit mehreren Verbindungen gleichzeitig arbeiten würde (ja, das geht!).
    Es könnte eine vereinfachte header-Datei geben, die nur diese Felder "zeigt". Aber ich will ja nicht zwei header pflegen und zueinander passend halten. C++ kann sowas mit einem header file, indem "#pragma interface" die Sichtbarkeit einschränkt.

    3. Dem C#-Compiler liegen doch ganz sicher irgendwelche Beispiele bei, wie auf Standard-DLLs zugegriffen wird. Schick mir ein kleines, damit ich sehe, was da anders ist.

  2. #12
    Anonymous Gast

    Standard

    Hallo,

    C# kann die Header-Files nicht einbinden, da es auf den .Net Framework aufbaut. Will man Funktionen ausserhalb des Frameworks (z.B. weitere Windows-Funktionen) nutzen muß man sich mit Dll-Aufrufe rumschlagen (P/Invoke). Um Libnodave nutzen zu können muß ich auf die Funktionen der kompilierten Dll zurueckgreifen. Die Definitionen sind ja dann leider nicht bekannt . . .

    Gruß

    Bewareofthis

  3. #13
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Ok, mit ein bischen googlen weiß ich jetzt, daß C# keine header einbindet. Wie es nun geht, weiß ich auch nicht. Es könnte gehen, daß du die "komplizierten" Funktionszeiger-Felder einfach wegläßt. Erstens brauchst du nicht auf sie zuzugreifen und zweitens besorgt sich Libnodave den Speicher selbst, so daß deine Anwendung auch die Größe nicht kennen muß.

    Wenn man die Bibliothek in C# neu schreiben wollte, sollte das ähnlich wie in JAVA gehen. Dafür habe ich eine Version geschrieben. Dort gibt es ein Objekt namens PLCInterface, daß nichts spezielles kann. ListReachablePartners ist eine "leere" methode. Das davon abgeleitete MPIinterface überschreibt die Methode und tut was.

    S7Connection ist eine abstrakte Verbindung zur S7, die Datenpakete zusammenstellen und analysieren aber nicht versenden oder empfangen kann. Dazu überschreibt dann MPIConnection die abstrakten Methoden.
    Das sind dann genau die Dinge, die in C über Funktionszeiger abgewickelt würden.

    Natürlich könnte auch JAVA über JNI auf die .DLL zugreifen. Das würde darauf hinauslaufen, daß es ein "Wrapper"-Objekt Methoden hat, die einzelne Funktionen der DLL aufrufen. Soweit ich mich erinnere, würde eine weitere .dll in C erstellt, die die Methoden des Wrapper-Objekts enthält. Sie schafft die Übernahme und Übergabe von Daten an JAVA indem jni.h eingebunden wird.

    Da sähe dann so aus:

    Eine vorhandene nuetzlich.DLL enthält die fuktion tuDies().
    Der header nuetzlich.h definiert sie als int tuDies(float).

    Um tuDies(). in JAVA zu nutzen braucht es eine weitere .DLL jNuetzlich.dll

    Der Code sähe ungefähr so aus:
    Code:
    #include "jni.h"
    #include "nuetzlich.h"
    
    jinteger JtuDies(jfloat jf) {
    	float f;
            int i;
    	jinteger ji;
    	f=fromJfloat(jf);	 // heißt nicht genauso, aber im Prinzip eine Routine aus JNI, die
    					//  den Wert für C aus der JAVA-Variablen "extrahiert"
    	i=tuDies(f);		// Aufruf der eigentlichen Funktion
    	ji=jIntfromC(i);		// in eine JAVA-Variable packen
    	return ji;
    }
    Das wäre mit einem C-Compiler zur neuen .DLL Jnuetzlich.dll zu verarbeiten.

    Auf der JAVA Seite nun das Wrapper-Objekt:
    Code:
    public class Nuetzlich {
    	public static native int jtuDies(float f); 
    }
    Eine andere Klasse ruft nun Nuetzlich.jtuDies() auf.

    Lange Rede, kurzer Sinn: Ich stelle mir vor, daß das in C# ähnlich ist? Muß mir mal am W.E. Mono reintun...

    [/code]

  4. #14
    Anonymous Gast

    Standard

    Hab mal die Definitionen verfolgt, wenn ich das alles nachbilde, hab ich im Prinzip alles neu geschríeben.
    Funktionert das, wenn ich nur "Blanko-Strukturen" definiere und die dann in den Aufrufen übergebe? Denke mal net.

    Gruß

    Bewareofthis

    P.S.:
    Daher war mir "Zottel" ein Begriff :
    -->http://www.mycsharp.de/wbb2/thread.php?threadid=4451


  5. #15
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Anonymous
    Hab mal die Definitionen verfolgt, wenn ich das alles nachbilde, hab ich im Prinzip alles neu geschríeben.
    Funktionert das, wenn ich nur "Blanko-Strukturen" definiere und die dann in den Aufrufen übergebe? Denke mal net.

    Gruß

    Bewareofthis

    P.S.:
    Daher war mir "Zottel" ein Begriff :
    -->http://www.mycsharp.de/wbb2/thread.php?threadid=4451

    Doch, zum Teil funktioniert es mit Blanko-Strukturen. Habe es gerade probiert, allerdings mit reinem C unter LINUX. Ich kann das testMPImin.c kompilieren, wenn im header nix anderes steht als

    Code:
    struct _daveInterface {
    	_daveOSserialType fd;
    }
    daveConnection kann ich auch so ähnlich verkürzen.

    Das klappt für das Minmalprogramm. Mit den anderen Testprogrammen kriege ich Probleme, weil sie aus daveConnection die Felder AnswLen, resultPointer, maxPDUlen nutzen.

    In diesem Fall müssen auch die dazwischen liegenden Felder erhalten bleiben, damit der "abstand" der Felder zum Beginn der Struktur noch stimmt.
    Insofern ist nodave.h nicht für solche Vereinfachung "optimiert". Dann stünden die von außen benötigten Felder vorne.
    Natürlich könnte man die Lücken durch gleich lange Felder von bytes oder sonstigem schließen.

    Was mir noch zu denken gibt: Ich habe gesehen, dß C# struct kennt, im Gegensatz zu JAVA.
    Ist ein in C# definiertes Struct automatisch genauso lang wie ein in C definiertes? Aber wenn nicht, wie sollte es dann überhaupt gehen?

    Das das mit dem "Verkürzen" klappt, liegt daran, daß das Anwendungsprogramm je nur einen Zeiger auf daveInterface oder daveConnection bekommt und auch nur diesen Zeiger wieder beim Aufruf angibt. Im Grunde also einfach nur ein 32-bit-wert. Sowohl das Anlegen der Strukturen als auch der Zugriff auf die Bestandteile geschehen (fast, Ausnahmen oben) nur innerhalb des Bibliothekscodes.
    Was natürlich nicht gehen kann, ist die Bibliothek selbst mit dem "vereinfachten" header zu übersetzen, sonst wäre er auch überflüssig.

  6. #16
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Im Anhang eine "verkürzte" Version von nodave.h. Alles was zwischen
    #ifdef COMPLETE
    und
    #endif
    steht, egal ob Felder, #defines oder ganze structs, braucht die Minimalanwendung testMPImin.c nicht zu kennen.

    Anbei noch diese URL:
    http://msdn.microsoft.com/library/de...ketutorial.asp

    War nach meiner unmaßgeblichen Meinung das beste, was ich bei google heute gefunden habe.
    Angehängte Dateien Angehängte Dateien

  7. #17
    Anonymous Gast

    Standard

    Thx Zottel

    werd mich mal darüber machen bei gelegenheit.
    Hab jetz noch ori. Prodave bekommen das scheint zu funktionieren.
    Allerdings hab ich bisher noch keine so komplexen Strukturen gefunden wie bei Libnodave.

    Gruss

    Bewareofthis

  8. #18
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Die "komplexe" Struktur in daveInterface (6 oder 7 Zeiger auf Funktionen) sorgt dafür, daß du z.B auf eine 200 mit denselben Funktionen zugreifen kannst, wie auf die 300 und 400. Bei Prodave brauchst du dafür andere Funktionen.
    Sie sorgt ebenso dafür, daß du mit dem Parameter "protocol" das Übertragungsprotokoll wählen kannst. Prodave benutzt, soweit ich weiß, einen Haufen von Registry-Einträgen, die bei der Installation verschiedener Siemens-Software angelegt mittels des Controls "PC-PG-Schnittstelle einstellen" verändert werden. Das ist, alles zusammengenommen, weit komplexer und es ist nicht auf andere Betriebssysteme übertragbar.
    Als Konsequenz benötigt Libnodave eben auch keine Installation und hat eine weit höhere Chance, auch unter der nächsten Version von Windows zu laufen. Schau dir an, wie viele Beiträge sich alleine hier damit beschäftigen, daß irgendeine Version von Step7 auf irgendeiner Version von Windows bescheuerte Fehler erzeugt und wieviel Zeit (hoffentlich) gut bezahlte Leute mit dieser Scheiße verbringen!
    Ganz zuletzt: Wie die verkürzte header-Datei zeigt, könnte ein Teil der Komplexität vor der Anwendung "versteckt" werden. Um das möglichst weit treiben zu können, müßte lediglich die Reihenfolge der Elemente in ein paar structs verändert werden. Es scheint mir aber eher dem Geist von "open source" angemessen, dem Benutzer Zugriff auf einfach alles zu geben. Auch die Funktionen, die mit einem _ anfangen, sind alle im Header aufgeführt, obwohl der "Normalanwender" sie nicht braucht.
    Vielleicht findet der ein oder andere User ja eine nützliche Anwendung dafür...

Ähnliche Themen

  1. Labview-Libnodave-CP5611-SPS
    Von Günni1977 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 07.05.2010, 17:12
  2. libnodave und labview?
    Von Tomas im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 18.06.2009, 13:53
  3. LabView mit RS-232
    Von da_kine im Forum Sonstige Steuerungen
    Antworten: 8
    Letzter Beitrag: 20.03.2007, 16:47
  4. Labview mit SPS
    Von hakan im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 20.07.2006, 11:04
  5. Labview und S7
    Von Anonymous im Forum Hochsprachen - OPC
    Antworten: 4
    Letzter Beitrag: 09.12.2005, 21:58

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •