Mit LibNoDave eigenes Programm erstellen

HoschiD

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!
Ich bin neu hier und brauche dringend eure Hilfe!
Ich sitze gerade an meiner Bachelor-Arbeit und soll mich jetzt noch mit LibNoDave beschäftigen.
Erst einmal zu den Dingen, die mir zur Verfügung stehen:

Siemens CPU 313 C
Siemens CP 343-1 Lean

An der CPU sind schalter für die Eingänge und LEDs für die Ausgänge angeschlossen. Quasi ein Hardware-PLCSim... :smile:
Nun zu meinem Problem:
Ich möchte ein Programm schreiben (in C), mit dem ich eine Temperatur überwachen kann. Dazu ist zur Simulation an einem analogen Eingang ein Poti angeschlossen, der die Ist-Temperatur darstellt, die gemessen wird. Nun wird zusätzlich noch eine Soll-Temperatur vorgegeben. Mit einem Programm soll nun mit Hilfe von LibNoDave die Soll- mit der Ist-Temperatur verglichen werden. Übersteigt die Ist-Temperatur die Soll-Temperatur, soll gekühlt werden, also einfach z. B. der Ausgang A124.0 gesetzt werden und bei Unterschreiten der Soll-Temperatur dementsprechend die "Kühlung" ausgehen und eine "Heizung" angehen, also z. B. der Ausgang A124.1.
Das eigentliche Problem ist, dass ich mich mit LibNoDave überhaupt nicht auskenne und auch mich auch schon tagelang durch alle möglichen Foren gekämpft habe, aber noch immer kein Ergebnis...
Zu dem, was ich mir gedacht habe: Es gibt ja bei LND im Ordner "win" die Datei testISO_TCP.exe. Mit dieser kann ich auch schon auf die SPS zugreifen. Also die Verbindung steht. Jetzt dachte ich mir, ich könnte diese Datei (bzw. vielmehr die testISO_TCP.c) als Basis nehmen, um die Kommunikation zur SPS aufzubauen und per "Endlosschleife" mit daveReadBits (oder besser daveReadBytes?!?) die Ist-Temperatur abfragen, mit der Soll-Temperatur vergleichen und per If-Abfrage die mit daveWriteBits (oder besser daveWriteBytes?!?) die Merker M0.0 bzw. M0.1 für "kühlen" bzw. "heizen" setzen.
Wäre ja auch alles noch nicht so schwer. Aber es hängt leider schon an etwas anderem:
Ich hatte mir dann also gedacht: Ok, nimm dir erst mal Code::Blocks und die die testISO_TCP.c und mache daraus eine ausführbare .exe. Das klappt aber leider schon gar nicht. Hab auch schon die libnodave.dll aus dem win-Ordner zu Code::Blocks kopiert und alles mögliche an Header-Dateien. Leider kommen beim Kompilieren immer die Fehlermeldungen, dass Variablen nicht deklariert sind. Dachte, ich könnte das einfach so Kompilieren, aber da habe ich mich ja definitiv getäuscht.
Deshalb jetzt meine Fragen an euch:
Wie gehe ich am Besten daran, ein eigentlich so einfaches Programm mit LND zu realisieren? Was muss ich beachten oder vorher wissen?
Sorry, dass ich vielleicht blöde Fragen stelle, aber ich bin eigenglich nicht der Programmier-Typ und muss jetzt innerhalb der nächsten 2 Wochen irgendwie ein lauffähiges Programm auf die Beine stellen. Wie gesagt, es ist ja nicht viel und wahrscheinlich auch total simpel, aber mich überfordert es gerade, LND mit einzubeziehen, was aber ja notwendig ist...

Vielen Dank schonmal im Voraus an euch!
HoschiD
 
Vielleicht sollte ich noch dazu sagen, dass ich mittlerweile etwas weiter bin. Habe jetzt die "nodavesimple.h" durch die "nodave.h" ersetzt und in dieser die Zeilen für ein "eigenes OS / API" auskommentiert. Jetzt bekomme ich immer nur die Fehlermeldungen wegen dem "EXPORTSPEC", das ja bereits in diesem Beitrag http://www.sps-forum.de/archive/index.php/t-10408.html erläutert wird. Da steht ja in der Antwort von Zottel, dass -DBCCWIN und -DDAVE_LITTLE_ENDIAN für Windows angegeben werden muss. Aber wo?! Doch irgendwie / irgendwo im Block "#ifdef BCCWIN.......", oder?! Muss ich da einfach das "OS_KNOWN" ersetzen?!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
am besten ist es die defines dem Compiler mit der Option -D mit auf den Weg zu geben, dann musst du den Quellcode garnicht anfassen.
Ich habe mal eine Schritt-für-Schritt Anleitung geschrieben wie man ein Testprogramm von der Eingabeaufforderung heraus für den gcc unter Windows übersetzt und zusammenlinkt. Die Pfade musst du natürlich noch entsprechend anpassen:

http://www.sps-forum.de/showthread....-für-Windows-zu-erstellen?p=250944#post250944

Vom Prinzip her macht make (außer ein paar anderen Sachen) nicht mehr als ebenfalls diese Befehle aufzurufen. Es gibt auch Leute die kopieren sich sowas einfach in eine Batch-Datei zusammen. Bei kleineren Projekten geht das noch, bei größeren ist es schon sinnvoll das make vorher nachschaut was sich überhaupt lohnt neu zu übersetzen.
 
Vielleicht sollte ich noch dazu sagen, dass ich mittlerweile etwas weiter bin. Habe jetzt die "nodavesimple.h" durch die "nodave.h" ersetzt und in dieser die Zeilen für ein "eigenes OS / API" auskommentiert. Jetzt bekomme ich immer nur die Fehlermeldungen wegen dem "EXPORTSPEC", das ja bereits in diesem Beitrag http://www.sps-forum.de/archive/index.php/t-10408.html erläutert wird. Da steht ja in der Antwort von Zottel, dass -DBCCWIN und -DDAVE_LITTLE_ENDIAN für Windows angegeben werden muss. Aber wo?! Doch irgendwie / irgendwo im Block "#ifdef BCCWIN.......", oder?! Muss ich da einfach das "OS_KNOWN" ersetzen?!

Das sind compilerschalter, welche du setzen musst.

Ich denke in Codeblocks geht das unter
Project/Build Options...
Dann Reiter Compiler Settings, Reiter #defines
 
Hallo Thomas, hallo Jochen!
Schonmal vielen Dank für eure Antworten!
Zu Jochen's Antwort: Leider kann ich "Build Options" unter Project nicht anklicken...
@ Thomas: Mit deiner Anleitung hat's super funktioniert! Ich musste zwar erst ein bisschen rum probieren (hatte unter anderem Zugriffsprobleme und musste Code::Blocks nochmal neu installieren), aber dann lief's.
Vielen Dank euch!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So, ich hab's jetzt geschafft, Merker zu schreiben und zu lesen und damit dann Ausgänge zu schalten. Das hat alles nach ein bisschen Suchen Probieren hervorragend funktioniert!!
Als nächstes geht es dann daran, einen analogen Ausgang auszulesen, damit ich diesen Wert dann mit einem Soll-Wert vergleichen kann.
Das mache ich dann über daveReadBytes, richtig?!
Wenn ich den ausgelesenen Wert dann in eine Variable speichern will, kann ich einfach folgendes schreiben?!:
solltemp=daveReadBytes(dc,daveAnaIn,0,0,2,NULL);
Das heißt doch im Endeffekt, dass ich den ersten analogen Eingang lesen möchte, oder?!
Kann das außerdem sein, dass ich noch irgendetwas mit einem "get..." machen muss?!
Und kann es sein, dass ich die ausgelesenen Werte irgendwie umwandeln muss?! Das hatte nämlich mal ein Kommillitone von mir erwähnt...
Und welche Möglichkeiten hätte ich, die ausgelesenen Werte in eine Textdatei schreiben zu lassen?!
Danke nochmal an alle!!

Lg HoschiD
 
Zuletzt bearbeitet:
Zurück
Oben