libnodave anfänger sucht hilfe

chrisi01

Level-1
Beiträge
51
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
hi

hab erst heute mit libnodave angefangen und c++ kann ich auch nicht soooo gut komm aber normalerweise relativ gut klar. Nun hab ich mir folgendes zusammengebastelt:

Code:
//---------------------------------------------------------------------------

#pragma hdrstop
#define BCCWIN
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "nodavesimple.h"
//#include "nodave.h"
#include "setport.h"
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
_daveOSserialType fds;
daveInterface * di;
daveConnection * dc;
int res;
fds.rfd=setPort("COM1", "9600", 'O');
fds.wfd=fds.rfd;
if (fds.rfd > 0) {
	di = daveNewInterface(fds, "IF1", 0, daveProtoPPI, daveSpeed9k);
	daveSetTimeout(di,5000000);
	if (daveInitAdapter(di) == 0) {
		dc = daveNewConnection(di, 2, 0, 0);
		if (daveConnectPLC(dc) == 0) {
			if (daveReadBytes(dc, daveDB, 1, 0, 2, NULL) == 0) {
				res = daveGetS16(dc);
			}
		}
	}
}
getchar();
}
//---------------------------------------------------------------------------

was ich im moment auslese ist mir noch relativ egal (später will ich die zustände der ausgänge und ein paar zählerwerte auslesen) hauptsache es würde mal gehen aber es macht es noch nicht es kommt immer folgendes:

[ILINK32 Fehler] Error: Nicht aufl÷sbares externes 'setPort' referenziert von C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\EIGENE DATEIEN\RAD STUDIO\PROJEKTE\DEBUG\FILE1.OBJ
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes '__stdcall daveNewInterface(_daveOSserialType, char *, int, int, int)' referenziert von C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\EIGENE DATEIEN\RAD STUDIO\PROJEKTE\DEBUG\FILE1.OBJ
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes '__stdcall daveSetTimeout(_daveInterface *, int)' referenziert von C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\EIGENE DATEIEN\RAD STUDIO\PROJEKTE\DEBUG\FILE1.OBJ
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes '__stdcall daveInitAdapter(_daveInterface *)' referenziert von C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\EIGENE DATEIEN\RAD STUDIO\PROJEKTE\DEBUG\FILE1.OBJ
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes '__stdcall daveNewConnection(_daveInterface *, int, int, int)' referenziert von C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\EIGENE DATEIEN\RAD STUDIO\PROJEKTE\DEBUG\FILE1.OBJ
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes '__stdcall daveConnectPLC(_daveConnection *)' referenziert von C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\EIGENE DATEIEN\RAD STUDIO\PROJEKTE\DEBUG\FILE1.OBJ
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes '__stdcall daveReadBytes(_daveConnection *, int, int, int, int, void *)' referenziert von C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\EIGENE DATEIEN\RAD STUDIO\PROJEKTE\DEBUG\FILE1.OBJ
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes '__stdcall daveGetS16(_daveConnection *)' referenziert von C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\EIGENE DATEIEN\RAD STUDIO\PROJEKTE\DEBUG\FILE1.OBJ

kann mit den fehlern gar nichts anfangen vllt. kann mir wer von euch helfen? Achja ich nutzte CodeGear c++ noch als Konsolenanwendung später soll es dann noch in ein VCL. Als Verbindung verwende ich eine PPI Schnittstelle mit einer CPU 222 und 9,6kbit/sec (zumindest ist die schnittstelle und das kabel darauf eingestellt).

mfg

chris
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
hi

nein weil dann sieht er es als int an er erwartet aber einen char *

fehler ohne ""

[BCC32 Fehler] File1.cpp(20): E2034 Konvertierung von 'int' nach 'char *' nicht möglich
[BCC32 Fehler] File1.cpp(20): E2342 Keine Übereinstimmung des Typs beim Parameter 'baud' ('char *' erwartet, 'int' erhalten)
[BCC32 Warnung] File1.cpp(35): W8004 'res' wurde ein Wert zugewiesen, der nie verwendet wird

ich weiss die datentypen machen einen wahnsinnig mich auch manchmal ;)

mfg

chris
 
soviel ich weis in ' ' setzten wenn es einstellig ist z.b. '0' bei mehr stelligen muss es in " " also "9600" (auf char bezogen) und wenn man es als int angeben will dürfen gar keine hochkommas hin. Zumindest geht '9600' auch nicht da meckert er ebenfalls über int zu char konvertierung wie oben

mfg

chris
 
hi

also ich geh davon aus du meinst die DIP Schalter von der PPI Schnittstelle richtig? die stehen auf 01000 und die verbindung klappt auch mit dem Testprogramm das bei libnodave dabei ist. Ich kann nur mein eigenes Programm nicht kompilieren.

mfg

chris
 
hi

folgendes:

das testprogramm liegt schon vorkompiliert (also als exe) vor und funktioniert. Ebenfalls liegt das Testprogramm als Quelltext vor dies lässt sich aber aus dem selben Grund wie mein eigenes Programm nicht kompilieren.

Hab irgendwo bei google gefunden das der Fehler darauf hindeutet das eine dll datei nicht passt (ist für vc++ gemacht und geht deshalb mit borland nicht man könnte sie mit coff2omf.exe umwandeln aber dies klappt nicht:

C:\>coff2omf.exe libnodave.dll 1.dll
COFF to OMF Converter Version 1.0.0.74 Copyright (c) 1999, 2000 Inprise Corporat
ion
ERROR: COFF error: libnodave.dll
(coffread.cpp, 1502) : invalid machine type detected


C:\>


kann dies sein?

mfg

Chris
 
Ich kenne mich mit den dll-Formaten nicht gut aus. Ich habe die dll früher mal mit Borland-Tools compiliert. Mit dem Ergebnis daß alle anderen Probleme hatten. Borland erzeugt also wohl ein irgendwie eigenes dll-Format. Es scheint mir aber unwahrscheinlich, daß Borland-Tools mit der dll nichts anfangen können, da wahrscheinlich auch alle System-dlls und die Mehrzahl aller dlls von Drittanbietern mit VC++ kompiliert sein werden. Daher sollte kein Umwandeln nötig sein. Möglicherweise mußt du deinen Tools die "richtigen" Namen über das .lib-file bekannt machen?

Bei Einbinden des Headers ist wichtig:
1. BCCWIN muß definiert sein.
2. Libnodave ist C, nicht C++.


Beispiel:

#define BCCWIN

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

Aber das mit dem "extern "C"" sollte eigentlich schon im header file enthalten sein...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Microsoft-DLL nehmen und mit dem Borland-Tool "IMPLIB" eine für Borland passende Importbibliothek erzeugen.
Aufruf:
IMPLIB LibName DLLName
Kann sein, dass es dann schon funktioniert.
 
hi

@Zottel

hab nun folgendes gemacht und der fehler bleibt:

Code:
//---------------------------------------------------------------------------

#pragma hdrstop
#define BCCWIN
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern "C" {
#include "nodavesimple.h" //wenn ich die nodave.h nehm geht es auch nicht.
}
//#include "nodave.h"
#include "setport.h"
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
_daveOSserialType fds;
daveInterface * di;
daveConnection * dc;
int res;
char buffer [255];
fds.rfd=setPort("COM1", "9600", 'O');
fds.wfd=fds.rfd;
if (fds.rfd > 0) {
	di = daveNewInterface(fds, "IF1", 0, daveProtoPPI, daveSpeed9k);
	daveSetTimeout(di,5000000);
	if (daveInitAdapter(di) == 0) {
		dc = daveNewConnection(di, 2, 0, 0);
		if (daveConnectPLC(dc) == 0) {
			if (daveReadBytes(dc, daveSysInfo,0,0,20,NULL) == 0) {
				res = daveGetS16(dc);
			}
		}
	}
}
itoa (res, buffer, 255);
printf(buffer);
getchar();
}
//---------------------------------------------------------------------------

@Rainer Hönle

ich hoffe ich hab dich richtig verstanden wenn ja dann passiert folgendes:

C:\Programme\CodeGear\RAD Studio\5.0\bin>IMPLIB libnodave.lib 1.dll

Borland Implib Version 3.0.22 Copyright (c) 1991, 2000 Inprise Corporation
Error : unable to open file

C:\Programme\CodeGear\RAD Studio\5.0\bin>

die libnodave.lib hab ich natürlich ins gleiche verzeichniss kopiert (also in das bin verzeichniss)

edit: jetzt hab ich dich verstanden:

C:\Programme\CodeGear\RAD Studio\5.0\bin>IMPLIB libnodave.lib libnodave.dll

Borland Implib Version 3.0.22 Copyright (c) 1991, 2000 Inprise Corporation

C:\Programme\CodeGear\RAD Studio\5.0\bin>

hab die dll natürlich auch reinkopieren müssen hab ich vorhin falsch verstanden gehen tut es aber trotzdem nicht muss ich irgendwas wieder irgendwohin zurück kopieren?

mfg

chris
 
Zuletzt bearbeitet:
Wenn aus der libnadave.dll eine libnodave.lib erzeugt wurde, dann entspricht dieses Format den Borland-Wünschen. Wenn es trotzdem noch nicht aufgelöste Symbole gibt, kann dies an den calling conventions hängen. Wie ist der Compiler eingestellt: stdcall, cdecl, pascal? Wie wurde die dll compiliert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi

hab mir die lib nun mit implib aus der dll erzeugt und sie so verwendet:

Code:
//---------------------------------------------------------------------------

#pragma hdrstop
#pragma comment(lib,"libnodavec.lib");
#define BCCWIN
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern "C" {
#include "nodavesimple.h"
//#include "nodave.h"
}
#include "setport.h"
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
_daveOSserialType fds;
daveInterface * di;
daveConnection * dc;
int res;
fds.rfd=setPort("COM1", "9600", 'O');
fds.wfd=fds.rfd;
if (fds.rfd > 0) {
	di = daveNewInterface(fds, "IF1", 0, daveProtoPPI, daveSpeed9k);
	daveSetTimeout(di,5000000);
	if (daveInitAdapter(di) == 0) {
		dc = daveNewConnection(di, 2, 0, 0);
		if (daveConnectPLC(dc) == 0) {
			if (daveReadBytes(dc, daveDB, 1, 0, 2, NULL) == 0) {
				res = daveGetS16(dc);
			}
		}
	}
}
getchar();
}
//---------------------------------------------------------------------------

nun sagte r zwar noch [BCC32 Warnung] File1.cpp(4): W8094 Falsche Verwendung von #pragma comment( <typ> [,"string"]) aber das dürfte nicht das Problem sein denn laufen tut das Programms chonmal es lässt sich compilieren vielen dank an alle

mfg

chris
 
Na ist doch prima.
Diese #pragma-Anweisung ist für Billisoft die Mitteilung, dass die angegebene Lib für das Linken verwendt werden soll. Kann auch über Angabe bei Linker erfolgen.
 
hi

hab nun folgenden Code:

Code:
//---------------------------------------------------------------------------

#pragma hdrstop
#pragma comment(lib,"libnodavec.lib");
#define BCCWIN
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern "C" {
#include "nodavesimple.h"
//#include "nodave.h"
}
#include "setport.h"
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
_daveOSserialType fds;
daveInterface * di;
daveConnection * dc;
int res;
char buffer [255];
fds.rfd=setPort("COM1", "9600", 'O');
fds.wfd=fds.rfd;
if (fds.rfd > 0) {
printf("Etabliere #1\n");
	di = daveNewInterface(fds, "IF1", 0, daveProtoPPI, daveSpeed9k);
	daveSetTimeout(di,5000000);
	if (daveInitAdapter(di) == 0) {
	printf("Etabliere #2\n");
		dc = daveNewConnection(di, 2, 0, 0);
		if (daveConnectPLC(dc) == 0) {
		printf("Etabliere #3\n");
			if (daveReadBytes(dc, daveDB, 1, 0, 2, NULL) == 0) {
				res = daveGetS16(dc);
				printf("Etabliere #4\n");
			}
		}
	}
}
itoa (res, buffer, 255);
printf(buffer);
getchar();
}
//---------------------------------------------------------------------------

leider hab ich keine doku mehr zu daveNewConnection gefunden weiss nicht mehr wo ich das her hatte wer kann mir da helfen? auserdem bleibt er da auch stehen er zeigt nur
Etabliere #1
Etabliere #2
an

an was könnte das liegen? ich nutzte die PPI Schnittstelle auf 9,6kbit/s eingestellt und COM1. Gehen tut libnodave denn wenn ich die testPPI.exe probier die fertigcompiliert beilag ließt er Daten von der SPS es muss also an meinen programm irgendwo liegen

mfg

chris
 
Zurück
Oben