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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Libnodave und Borland Builder 5.0

  1. #1
    Registriert seit
    05.08.2005
    Beiträge
    19
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!
    Ich habe gerade angefangen mich mit Libnodave auseinander zu setzen.
    Die Dateien habe ich aus dem Internet heruntergeladen und installiert.
    * Aus dem DOS-Fenster lassen sich die Anwendungen problemlos starten.
    * das Excel VBA Beispiel klappt.
    * Ich habe das Modul12 in ein VB6 Programm eingebunden. Auch hier klappt der Zugriff auf die SPS mit dem IBH NetlINK über ein GUI.

    Jetzt möchte ich eigentlich meine Standard-Programmierumgebung nutzen, den Borland Builder Version 5.0.

    Hat jemand ein BeispielProjekt, wie die Funktionen korrekt definiert werden müssen?
    Die DLL habe ich wie folgt eingebunden:

    //---------------------------------------------------------------------------
    #define THEDLL "Libnodave.dll"
    HINSTANCE hDLL;

    loaddll(char *name)
    {
    char s[256];
    hDLL=LoadLibrary(name);
    if (hDLL == NULL)
    {
    wsprintf(s,"%s nicht gefunden!",name);
    MessageBox(GetFocus(),s,"Error",MB_OK|MB_ICONSTOP);
    return 0;
    }
    return 0;
    }

    Wird ohne Fehler kompiliert!

    Beispiel für einen Funktionsaufruf in Borland: Ist das Richtig??
    daveInternalStrerror(long en)
    {typedef long (CALLBACK* LP2INT) (long ); LP2INT p;
    p = (LP2INT) GetProcAddress(hDLL,"daveInternalStrerror"); return p(en);
    }

    so sieht es korrekt in VB aus:
    private Function daveInternalStrerror Lib "libnodave.dll" Alias "daveStrerror" (ByVal en As Long) As Long

    Mit freundlichem Gruß
    V.Jähn
    Zitieren Zitieren Libnodave und Borland Builder 5.0  

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

    Standard

    Zitat Zitat von Volkmer Beitrag anzeigen
    Jetzt möchte ich eigentlich meine Standard-Programmierumgebung nutzen, den Borland Builder Version 5.0.
    Den kenne ich nicht, aber es sieht nach C aus, ja?
    Die DLL habe ich wie folgt eingebunden:
    ...
    Wird ohne Fehler kompiliert!
    Schön, hat aber ja noch gar nichts mit Libnodave zu tun.
    daveInternalStrerror(long en)
    {typedef long (CALLBACK* LP2INT) (long ); LP2INT p;
    p = (LP2INT) GetProcAddress(hDLL,"daveInternalStrerror"); return p(en);
    }
    Warum zum Teufel willst du dir die Mühe machen, die Funktionen über LoadLibrary und GetProcAddress einzubinden und alle Prototypen neu zu definieren? Ich kenne nur einen vernünftigen Grund um so etwas zu tun: Wenn du mehrere "Plug-In" -Dll hättest mit identischer Schnittstelle hättest und zur Laufzeit auswählen wolltest, ob du nun Libnodave oder eine andere Bibliothek, für sagen wir, Allen Bradley, nimmst.
    Da das aber wohl nicht der Fall ist: Wenn du die Bibliothek auf "normale" Weise einbindest, stehen die Funktionsprototypen in nodave.h.
    #define BCCWIN
    #define DAVE_LITTLE_ENDIAN
    #include "nodave.h"
    oder
    #include "nodavesimple.h"

  3. #3
    Volkmer ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.08.2005
    Beiträge
    19
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo!

    Mit dem Neudefinieren der Funktionen konnte ich mittlerweile die wesentlichen Funktionen ausführen (starten, stoppen der CPU, lesen und schreiben von Bytes - mit Ausnahme von Real/Float-Variablen).

    Wenn ich die Header Dateien einbinde, bekomme ich nach der Compiliereung die Fehlermeldungen

    [Linker Fehler]Unresoved ecternal '__stdcall dave.....
    ..............

    für alle aufgerufenen Funktionen.

    Ich habe die notwendigen Header-Dateien in das Programmverzeichnis kopiert, ebenso die dll.

    der Programmkopf lautet, wie folgt
    #include <vcl.h>
    #pragma hdrstop

    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    //---------------------------------------------------------------------------
    #include <functional>
    #include "windows.h"
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define BCCWIN
    #define DAVE_LITTLE_ENDIAN
    #include "Unit1.h"
    #include "nodave.h"
    #include "openSocket.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"

    Ich verwende Borland C++ Builder Version 5.0

    An dem automatisch?? generierten Makefile habe ich keine Änderungen vorgenommen.

    Mit freundlichem Gruß
    V.Jähn

  4. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Kann man nicht auch die Delphi-Komponente nutzen, würde einiges an Arbeit ersparen, die ist allerdings mir Delphi7 geschrieben, ob das mit dem Builder5.0 paßt?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #5
    Registriert seit
    19.09.2005
    Ort
    Freudenstadt
    Beiträge
    811
    Danke
    64
    Erhielt 101 Danke für 64 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Kann man nicht auch die Delphi-Komponente nutzen, würde einiges an Arbeit ersparen, die ist allerdings mir Delphi7 geschrieben, ob das mit dem Builder5.0 paßt?
    Die Komponente sollte mit allen Delphi-Versionen ab Delphi 6.0 funktionieren (eigentlich schon ab Version 5.0, hab ich aber schon lange nicht mehr getestet), nur mit Delphi 8.0 nicht, mangels Win32-Unterstützung in der Version 8.0.

    Mit dem C++ Builder wird sie wohl in keiner Version funktionieren, dafür müßte die Komponente meines Wissens erst nach C++ portiert werden, was aber eigentlich kein Problem sein sollte (außer der Arbeit, die damit verbunden ist ).


    Gruß Axel
    Man muß sparn wo mn knn!

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Hm, ich dachte, ich hätte mal gelesen, daß eigentlich eh Delphi unter der Haube von BB5.0 steckt und alle Komponenten dort in Objectpascal vorliegen, man somit auch Delphi-Komponenten und Bibliotheken verwenden kann. Dazu bräuchte man dan wohl die vorkompilierten Dateien *.dcr
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. #7
    Registriert seit
    30.01.2004
    Ort
    Erfurt
    Beiträge
    961
    Danke
    42
    Erhielt 109 Danke für 87 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Dazu bräuchte man dan wohl die vorkompilierten Dateien *.dcr
    Also der BCB 5.0 auf meinem Rechner hier kann Pascal Units (*.PAS) in das aktuelle Projekt mit einbinden und dann natürlich auch übersetzen.
    __
    Mit freundlichem Gruß Peter

    ...Wir sind Alle Zeitreisende. Die überwiegende Mehrzahl schafft allerdings täglich nur einen Tag.... (Jasper Fforde: "In einem andern Buch")

  8. #8
    Registriert seit
    19.09.2005
    Ort
    Freudenstadt
    Beiträge
    811
    Danke
    64
    Erhielt 101 Danke für 64 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Hm, ich dachte, ich hätte mal gelesen, daß eigentlich eh Delphi unter der Haube von BB5.0 steckt und alle Komponenten dort in Objectpascal vorliegen, man somit auch Delphi-Komponenten und Bibliotheken verwenden kann. Dazu bräuchte man dan wohl die vorkompilierten Dateien *.dcr
    Hab mich jetzt gerade mal schlau-gegoogled:
    Offensichtlich kann der C++ Builder auch Delphi-Komponenten einbinden, wenn der Quellcode vorhanden ist und ein paar spezielle Anforderungen eingehalten werden, was bei meiner Komponente für libnodave der Fall ist.

    Demnach müßte sich die Komponente auch mit dem C++ Builder kompilieren und einbinden lassen ... wenn das schon mal jemand gemacht hat, würde ich mich über eine kurze Info freuen !


    Gruß Axel
    Man muß sparn wo mn knn!

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

    Standard

    Zitat Zitat von Volkmer Beitrag anzeigen
    Wenn ich die Header Dateien einbinde, bekomme ich nach der Compiliereung die Fehlermeldungen

    [Linker Fehler]Unresoved ecternal '__stdcall dave.....
    ..............

    für alle aufgerufenen Funktionen.
    Das deutet darauf hin, daß der Compiler eine falsche Vorstellung von den Aufrufkonventionen hat. Warum, weiß ich jetzt nicht. Vermutungen:
    1. Es ist noch was mit den "conditional defines" nicht in Ordnung. Aber BCCWIN und DAVE_LITTLE_ENDIAN hast du ja da stehen. Sicherheitshalber sollten sie UNMITTELBAR vor
    #include "nodave.h"
    stehen.
    2. Es ist was mit "mangled names": C++ kann ja zwei Funktionen gleichen Namens mit verschiedenen Parametern unterscheiden, Beispiel:
    int tuwas(int: eineVariable){
    }
    int tuwas(float: eineVariable){
    }
    Der Compiler kommt klar, er weiß daß es zwei Funktionen sind, weil er C++ kann. Der Linker hat aber keine Ahnung davon und würde nur zwei Einsprungpunkte gleichen Namens "tuwas" finden. Darum hängt der Kompiler was dran, wie: "tuwas_int", "tuwas_float" oder "tuwas_i4","tuwas_f4" oder was auch immer. Das sind die "mangled names". Wenn dein Compiler nun denkt, die Funktionen aus "nodave.h" seien in C++ geschrieben, gibt er dem Linker mangled names und die gibt es in Libnodave.lib oder Libnodave.dll nun mal nicht . Abhilfe: Dem Compiler sagen, daß es "nur" C ist:

    extern "C" {
    #define BCCWIN
    #define DAVE_LITTLE_ENDIAN
    #include "nodave.h"
    #include "openSocket.h"
    }
    Allerdings meine ich, daß dafür schon "conditional defines" in nodave.h enthalten sind. Aber Probieren geht über Studieren.

  10. #10
    Volkmer ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.08.2005
    Beiträge
    19
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!
    Mittlerweile habe ich die DLL einbinden können! Man musste wie folgt vorgehen:

    Mittels des Programms implib (im Lieferumfang des Builders) muss eine Library gebildet werden.

    => implib libnodave.lib libnodave.dll

    => Anschließend muss auch diese Library mit in das Projekt eingebunden werden!

    Zum Schluss alles compilieren!

    Die meisten Funktionen laufen nun - auch das Lesen von Float-Variabeln.

    Allerdings habe ich nun ein Verständnisproblem mit den daveput-Funktionen.

    Leider sind die Funktionen in den Dokumenten nur spärlich beschrieben.

    Mir gelingt es immer nur eine Variablen in den Buffer zu schreiben.

    Mit freundlichem Gruß
    V.Jähn

    PS.: Ein Dank noch an Zottel für das Entwickeln und Bereitstellen der DLL!

Ähnliche Themen

  1. Zeilennummern in C++-Builder 5?
    Von Cerberus im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 22.01.2009, 08:59
  2. ABB compact control builder ?
    Von prinz1978 im Forum Sonstige Steuerungen
    Antworten: 0
    Letzter Beitrag: 19.09.2008, 18:26
  3. Ungarisch in Panel Builder von Allen Bradley
    Von tigger im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 02.07.2008, 11:50
  4. Easy Builder EB500
    Von easy im Forum HMI
    Antworten: 0
    Letzter Beitrag: 30.03.2008, 07:35

Lesezeichen

Berechtigungen

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