# Ich habe Probleme ein Libnodave Programm in C für Windows zu erstellen



## iga-graz (22 März 2010)

Hallo zusammen,

ich möchte mich schon mal für die offene Formulierung der Fragestellung entschuldigen, aber mir ist nichts besseres eingefallen.

Zu meinem Problem:

Ich bin Neuling im C-Programmieren aber ich durchschaue die Sourcen von Libnodave grundsätzlich schon.

Ich habe aber leider ein Problem ein kompilierbares Projekt auf die Beine zu stellen, da ja jede Menge Definitionen in den Sourcen vorhanden sind, die man nicht braucht. (Linux vs. Windows usw.). Die Sourcen überfordern mich ein bisschen.

Ich möchte einfach mal ein kleines ausgedünntes Projekt haben, auf das ich aufbauen kann. Mir reicht es schon wenn ich die Steuerung auf RUN und STOP bekomme.

Also mir ist wichtig wie ich eine Verbindung zur Steuerung aufbaue. (MPI oder TCP ist mir nicht so wichtig)

Vielleicht hat ja einer von euch so ein Mini-Projekt, dass er mir zur Verfügung stellen kann, um mal zu sehen was wesentlich für eine Kommunikation mit der SPS ist. Vielleicht auch mit dem Make-File dazu.

Vielleicht gibt es ja auch andere Mitstreiter, denen dieser Beitrag helfen kann.

Auf jeden Fall schon mal vielen Dank für eure Hilfe.

beste Grüße 

Chris


----------



## bike (22 März 2010)

Ich denke, du solltest uns einmal schreiben, mit welcher Entwicklungsumgebung du programmierst bzw welcher Compiler zum Einsatz kommen soll.
Es gibt für verschiedene Compiler Automake tools.


bike

P.S: Wenn du C lernst, weiß ich nicht ob ein Projekt mit libnodave der  richtige Startpunkt ist


----------



## iga-graz (22 März 2010)

Hi,

ich habe den g++ Compiler (MinGW).

Ich programmiere (und kompiliere) über Eclipse, oder kompiliere direkt über die Kommandozeile.

Du hast natürlich recht, dass das nicht unbedingt das leichteste Kapitel zum Starten ist. Ich programmiere beruflich mit Step7 in AWL und SCL und möchte mich jetzt nun auch mit C bzw. C++ beschäftigen. Ich möchte mit Libnodave quasi mein Wissen auf beiden Seiten intensivieren und eigene Programme für die Manipulation der SPS entwickeln.

Mir geht es darum, mal zu wissen wie ich eine einfache Kommunikation zur SPS aufbauen kann und dann mit wachsendem Wissensstand immer komplexere Programme entwickeln zu können.

Einfach um mal ein kompilierbares Grundprojekt zur Weiterentwicklung zu haben.

BG

Chris


----------



## Thomas_v2.1 (22 März 2010)

Hallo,
ich habe mit dem MinGW anfangs auch gekämpft ;-)

Das einfachste ist erstmal die entsprechenden Funktionen aus der libnodave Bibiliothek statisch zu deinem Projekt zu linken, also ohne Verwendung der dll.

Als erstes einfaches Beispiel kann man sich z.B. das Testprogramm "testISO_TCP" selber übersetzen.
Dazu am Besten ein neues Projektverzeichnis anlegen, und in dieses die Datei "testISO_TCP.c" aus dem libnodave Paket kopieren. Dort hinein kopierst du auch mein angehängtes makefile.
Im makefile musst dann deine lokalen Pfade anpassen. Die entsprechenden Stellen habe ich mit einem Kommentar versehen.
Da wären einmal die Pfade deiner Compiler-Umgebung (include und die libs), und der Pfad zu den libnodave Quellen.

Dann solltest du mittels "make all" eine testISO_TCP.exe erhalten.


----------



## iga-graz (23 März 2010)

Hi Thomas, danke erstmal für deine Anleitung.

Leider ganz so einfach wie du es beschrieben hast geht es nicht.

Ich habe meine Pfade im makefile angepasst und trotzdem bekomme ich beim Übersetzen gleich mal die Meldung, dass die 

#include "nodavesimple.h"
#include "openSocket.h"

nicht gefunden werden. Werden die Headerdateien in " " nicht im Projektverzeichnis gesucht? Wenn ich sie dann in mein Projektverzeichnis kopiere, dann findet er zwar diese, aber ich bekomme jede Menge weiterer Fehler in nodavesimple.h . Und zwar hat der Kompiler ein Problem mit der Definition von EXPORTSPEC.
Ich bekomme in jeder Zeile, in der EXPORTSPEC benutzt wurde einen Syntaxerror.

Hab ich noch einen Schritt vergessen?

BG

Chris


----------



## Thomas_v2.1 (23 März 2010)

Hallo,
beim Anpassen der Pfade musst du die Schrägstriche und Anführungszeichen genauso wie ich im Beispiel setzen. D.h. bei den INCS ohne, und bei NODAVEPATH mit.
Dann sollte er zumindest die Headerdateien finden.

Bekommst du denn Fehler oder nur Warnungen? Warnungen kommen ziemlich viele, die kannst du durch entfernen der Compilierflags -Wall und -pedantic etwas reduzieren, und bei dem bestehenden Code erstmal ignorieren.

EXPORTSPEC sollte durch die Definition von DOEXPORT eigentlich den entsprechend zugewiesenen Wert bekommen. Wie lautet denn der genaue Text der Fehlermeldung?


----------



## iga-graz (23 März 2010)

Hi,

also ich hab immer Syntax Errors vom Kompiler bei EXPORTSPEC bekommen.

Ich hab das jetzt so gelöst, dass ich den EXPORTSPEC und DECL2 mal überhaupt entfernt hab. Dann waren schon mal sehr viele Fehler weg.

Wenn ich das richtig verstanden habe wird mit EXPORTSPEC ja versucht aus der dll die Funktionen zu extrahieren oder? Ich hab ja im make File keinen Link auf die Library angegeben. Zumindest vermute ich, dass das das Problem war.

Jetzt hab ich noch einen Error im nodavesimple.h:
und zwar in der Zeile 

```
daveInterface *  daveNewInterface( _daveOSserialType nfd, char * nname,  int localMPI, int protocol, int speed);
```

bekomme ich 
..\src\nodavesimple.h:270: error: syntax error before "nfd"
von Compiler zurück, also bei der typedef _daveOSserialType dürfte auch noch ein Problem sein.

Darum krieg ich noch einen Folgefehler im testISO_TCP.c.
..\src\testISO_TCP.c:225: error: `_daveOSserialType' undeclared (first use in this function)

Wenn das gelöst ist, dürfte es funktionieren 
	

	
	
		
		

		
			





Vielen Dank bis jetzt.

lg

Chris


----------



## Thomas_v2.1 (23 März 2010)

Was ich oben noch gesehen habe: Du schreibst dass du den g++ verwenden willst. Libnodave ist aber in C. Du musst es auf jeden Fall mit dem gcc übersetzen (wie ich es im makefile auch eingetragen habe).

Zu der Fehlermeldung mit _daveOSserialType:
An der Stelle wird der Datentyp HANDLE verwendet. Der ist nur bekannt wenn du die entsprechenden Windows Headerdateien (windows.h) auf deinem Rechner hast und der Compiler diese auch findet. Aber eigentlich müsste es dann eine andere Fehlermeldung geben. Hmm...

Wie gesagt, bei mir fluppt das mit dem Makefile, dem Dev-Cpp (mit MinGW) und den aktuellen libnodave Quellen Out of the box.


----------



## iga-graz (24 März 2010)

Hi Thomas,
ich lass das jetzt mit eclipse und habe mir deshalb mal den Dev-C++ installiert.

Ich habe meine Ordner auch so angepasst, dass sie mit deinen Pfaden im make file zusammenpassen. Ich musste nur auf das C Laufwerk verweisen.

Was muss ich im Dev-C++ bei den Projektoptionen alles einstellen, damit der Kompiler das make file auch verwendet.

Im Reiter make habe ich natürlich den Haken gesetzt "dieses make file verwenden" und auf mein file verwiesen.

Sind noch Einstellungen erforderlich? Nur mit der Angabe des Pfades meines make files funktioniert es noch nicht.

Da bekomme ich jetzt die gleichen Fehlermeldungen beim Kompilieren wie im eclipse. Was mich zu der Vermutung bringt, dass das eigene make file nicht benutzt wird.

Vielen Dank für deine Hilfe.

BG

Chris


----------



## Thomas_v2.1 (24 März 2010)

Also ich rufe das über eine Eingabeaufforderung auf, und nicht über den Dev-C++.

Wenn du beim makefile die Endung .txt enfernst kannst du über eine Eingabeaufforderung in das Projektverzeichnis wechseln, und dann sollte ein "make all" mit dem makefile das im aktuellen Verzeichnis liegt aufgerufen werden.

Man kann bei make aber auch das makefile mit einem Parameter übergeben, den weiß ich aber so aus dem Kopf nicht (vlt. mal mit make /? befragen).


----------



## iga-graz (24 März 2010)

Hallo Thomas,

kannst du mir bitte noch mal helfen.

Also ich habe jetzt alles noch mal deinstalliert was nach MinGW ausschaut.

Hab das ganze MinGW Paket wieder neu installiert. 

Hab die Umgebungsvariablen gesetzt. (und kontrolliert)

So und jetzt erstelle ich mir einen Projektordner mit:

testISO_TCP.c und deinem makefile mit den angepassten Pfaden.

Und jetzt sollte mit mingw32-make -f makefile der Kompiler eine exe ausspucken.

Bei mir kommen extrem viele Errors.

Hab ich da noch was vergessen?

Dankeschön

bg

Chris


----------



## Thomas_v2.1 (24 März 2010)

Vielleicht solltest du testweise mal ein Hallo-Welt Programm übersetzen, um zu prüfen ob deine Compiler Umgebung überhaupt richtig installiert ist.

Ansonsten kannst du die gesamte Ausgabe vom Aufruf mal in eine Textdatei kopieren und anhängen.
Normalerweise sieht man dann auch wie und mit welchen Optionen der Compiler aufgerufen wird.
Ein makefile ist ja nicht zwingend notwendig, du kannst die einzelnen Objekt-Dateien auch händisch einzeln übersetzen und dann nachher mit den entsprechenden restlichen Bibliotheken zusammenlinken.

Bei mir sieht die erste Zeile der Ausgabe von make beispielsweise so aus:

```
gcc.exe -c D:/libnodave-0.8.4.5/nodave.c -o nodave.obj -I"D:/Dev-Cpp/include" -I"D:/libnodave-0.8.4.5" -DBCCWIN -DDAVE_LITTLE_ENDIAN -DDOEXPORT -std=gnu99 -Wall -pedantic
```


----------



## iga-graz (24 März 2010)

Hi also helloworld kann ich übersetzen, also die umgebung sollte passen.

beim make aufruf werden so viele errors erzeugt, dass der compiler mit zu vielen fehlern abbricht.

und du hast wirklich nur die testISO_TCP.c in den Projektordner kopiert und dein makefile.

Alles andere hat der Kompiler im Libnodave Ordner gefunden?

hmmmm..

Mir gehen schön langsam die Ideen aus.

Wünsche noch einen schönen Abend.

bg

Chris


----------



## Thomas_v2.1 (24 März 2010)

iga-graz schrieb:


> Hi also helloworld kann ich übersetzen, also die umgebung sollte passen.
> 
> beim make aufruf werden so viele errors erzeugt, dass der compiler mit zu vielen fehlern abbricht.
> 
> ...



Noch einfachere Variante, ohne makefile etc.

Zum Erzeugen der testISO_TCP.exe sind 4 Schritte notwendig.
Vorbereitung:
Libnodave Archiv entpacken und in einer Eingabeaufforderung in den Ordner wechseln.

- Schritt 1:
openSocketw.c übersetzen. In dieser sind die Netzwerkfunktionen vorhanden.

```
D:\libnodave-0.8.4.5>gcc.exe -c openSocketw.c -o openSocketw.obj -DBCCWIN -DDAVE_LITTLE_ENDIAN -DDOEXPORT
```

Danach sollte im Ordner eine openSocketw.obj vorhanden sein.

- Schritt 2:
nodave.c übersetzen.

```
D:\libnodave-0.8.4.5>gcc.exe -c nodave.c -o nodave.obj -DBCCWIN -DDAVE_LITTLE_ENDIAN -DDOEXPORT
```

Danach sollte im Ordner eine nodave.obj vorhanden sein.

- Schritt 3:
testISO_TCP.c übersetzen

```
D:\libnodave-0.8.4.5>gcc.exe -c testISO_TCP.c -o testISO_TCP.obj -DBCCWIN -DDAVE_LITTLE_ENDIAN -DDOEXPORT
```

Danach sollte im Ordner eine testISO_TCP.obj vorhanden sein.

- Schritt 4:
Alle Objektdateien und die Bibliothek für die Winsock Funktionen zur exe zusammenlinken.
Hier ist die Stelle wo deine Compilerumgebung ins Spiel kommt Da muss du prüfen wo deine Bibliotheken liegen.

```
D:\libnodave-0.8.4.5>gcc.exe nodave.obj openSocketw.obj testISO_TCP.obj -o testISO_TCP.exe -L"D:/Dev-Cpp/lib" D:/Dev-Cpp/lib/libwsock32.a
```

Jetzt sollte eigentlich eine testISO_TCP.exe im Verzeichnis liegen.

Diesen Ablauf wie oben macht auch make, nur dass dieses noch etwas mehr kann (nur notwendige Dateien übersetzen etc.).
Ich habe aber auch schon Leute gesehen, denen die makefiles zu kryptisch sind und alles über eine batch-Datei übersetzen. Bei kleineren Projekten geht das auch.

Nebenbei: Du hast doch ein 32-Bit Betriebssystem oder?


----------



## iga-graz (25 März 2010)

Hallo Thomas,

also erst mal vielen Dank für deine Anleitung.

Es stimmt, so kann ich es ohne Probleme übersetzen.

Kannst du mir vielleicht noch mal schreiben, wie du dein makefile genau über die Kommandline aufrufst.

Ich habe mir das makefile noch mal genau angeschaut und es macht ja wirklich exakt das gleiche wie wenn ich händisch kompiliere.

In Zukunft wäre das natürlich über das makefile etwas komfortabler. Vielen Dank im voraus. Vielleicht habe ich das make einfach falsch aufgerufen.

BG Chris


----------



## iga-graz (25 März 2010)

Ich hab mich jetzt noch ein bisschen gespielt.

Soweit ich das beurteilen kann habe ich bei deinem make file ein Problem
mit den Includes


```
INCS =  -I"C:/MinGW/include" -I"C:/libnodave-0.8.4.5"
CFLAGS = $(INCS)-DBCCWIN -DDAVE_LITTLE_ENDIAN -DDOEXPORT -std=gnu99 -Wall -pedantic
```
Also wenn ich make mit deinem makefile ohne die $(INCS) Einbindung bei den CFLAGS direkt im libnodave Verzeichnis C:/libnodave-0.8.4.5 ausführe, dann funktioniert die Kompilierung. 

Hier die CFLAGS ohne Includes:

```
CFLAGS = -DBCCWIN -DDAVE_LITTLE_ENDIAN -DDOEXPORT -std=gnu99  -Wall -pedantic
```
Irgendwas funktioniert da mit den Pfaden nicht. Ich habe aber noch keine Ahnung was. Aber ich bin schon mal froh das es überhaupt funktioniert.

BG
Chris


----------



## Thomas_v2.1 (25 März 2010)

iga-graz schrieb:


> Ich hab mich jetzt noch ein bisschen gespielt.
> 
> Soweit ich das beurteilen kann habe ich bei deinem make file ein Problem
> mit den Includes
> ...


Ich glaub ich habe das Problem gefunden.
Bei meinem makefile steht nach dem -I"D:/libnodave-0.8.4.5" noch ein Leerzeichen. Wenn du das löschst fehlt das an den Stellen an denen die Variable später eingesetzt wird, und der gcc kennt somit include Pfad nicht. Prüfe das nochmal nach, bzw. setze hinter $(INCS) noch ein Leerzeichen.

Ich rufe make einfach mit "make all" auf. Dann wird alles entsprechend der Anleitung im makefile übersetzt.


----------



## iga-graz (26 März 2010)

*Lösung und Testumgebung*

Hallo, das war wirklich die Lösung 
	

	
	
		
		

		
		
	


	







.

Vielen Dank dafür.

Auf  das wäre ich nicht gekommen.

Ich kann jetzt ohne Probleme  übersetzen !!!!!!!!!!

Ich muss allerdings mein makefile mit 
 C:\meinProjektverzeichnis\mingw32-make -f  makefile
aufrufen.

Wie du das mit make all machst ist  mir noch ein Rätsel.


Ich habe mir jetzt auch eine Testumgebung mit ACCONtrol S7 aufgebaut, so  wie in deinem Beitrag beschrieben
http://sps-forum.de/showthread.php?t=9875

Das Testprogramm habe ich mittels localhost (127.0.0.1) lauffähig  bekommen. Also alles bereit für weitere Schandtaten.

Ich hoffe  dieser Beitrag hilft auch anderen!

Wenn noch weitere Vorschläge  oder Ideen für die Entwicklung mit Libnodave vorhanden sind bitte  weiterhin posten.

Schönen Tag und BG Chris


----------



## Nobby37 (20 April 2010)

Ich hoffe, dass Du Readme.compiling und Readme.win gelesen hast. Ich konnte damit leicht das Projekt unter VS 2008 übersetzen. Wichtig dabei ist, dass vorher vcvars32.bat aufgerufen wird.


----------

