# libnodave anfänger sucht hilfe



## chrisi01 (12 Dezember 2007)

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:


```
//---------------------------------------------------------------------------

#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
> ...



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


----------



## vierlagig (12 Dezember 2007)

müßte



> "COM1", "9600"


nicht


```
"COM1", 9600
```
heißen?


----------



## chrisi01 (12 Dezember 2007)

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


----------



## chrisi01 (12 Dezember 2007)

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


----------



## chrisi01 (12 Dezember 2007)

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


----------



## vierlagig (12 Dezember 2007)

testprogramm läuft? was ist da anners, so im direkten code-vergleich?


----------



## chrisi01 (13 Dezember 2007)

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
> ...




kann dies sein?

mfg

Chris


----------



## Zottel (17 Dezember 2007)

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...


----------



## Rainer Hönle (17 Dezember 2007)

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.


----------



## chrisi01 (17 Dezember 2007)

hi

@Zottel

hab nun folgendes gemacht und der fehler bleibt:


```
//---------------------------------------------------------------------------

#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
> ...



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


----------



## Rainer Hönle (18 Dezember 2007)

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?


----------



## chrisi01 (20 Dezember 2007)

hi

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


```
//---------------------------------------------------------------------------

#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


----------



## Rainer Hönle (21 Dezember 2007)

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.


----------



## chrisi01 (21 Dezember 2007)

hi

hab nun folgenden 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


----------

