libnodave - Kommunikationsaufbau

Fabse

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,
für ein Projekt möchte ich eine Verbindung vom PC (einem C++ Programm) zu einer SPS herstellen.
Im Internet bin ich auf die libnodave Bibliothek gestoßen. Ich verwende eine CPU 315 - 2PN/DP und einen Windows7 Rechner.
Ich wollte nun mit dem testISO_TCP(simplified) Beispielprogramm die Verbindung herstellen.
Da ich nicht so der IT Fachmann bin, beschreibe ich einfach was ich gemacht habe und wo mein Problem liegt. Ich hoffe jemand kann mir helfen

1. Bibliotheken und Headerdateien werden im C++ Programm erkannt und ich kann das Programm auch debuggen.
2. Meine CPU hat die IP Adresse 192.168.0.1, desshalb habe ich meinem PC die IP Adresse 192.168.0.100 zugewiesen. Der PC erkennt die LAN Verbindung.
3. Wenn ich das Programm jetzt starte kommt die Meldung:
"Usage: testISO_TCP IP-Address of CP"und bricht das Programm ab.
Mir fehlt jetzt der Ansatz wie ich überhaupt die Kommunikation zur SPS aufbauen kann, ich hab das Gefühl, dass irgendwas mit der IP Adressen nicht stimmt oder ich noch irgendeine Einstellung in Simatic vornehmen muss, da habe ich nämlich bisher noch nichts geändert ( bloß die Hardwarekonfiguration erstellt und der CPU übergeben).

Ich hoffe jemand kann mir helfen.


 
Die Fehlermeldung sagt doch schon alles:
Du musst hinter testISO_TCP auch die IP-Adresse der SPS angeben.
Gruß
Erich


 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, ich danke dir schonmal für deine schnelle Antwort Erich.

Allerdings glaube ich mitlerweile, dass das Programm sich die ip Adresse selber nimmt und zwar an der Stelle:
fds.rfd=openSocket(102, argv[5]); und zwar das argv[5] kann das sein?
Wenn nicht, weiß vllt. jmd. wo ich das im Code unten angeben muss?

Zudem wollte ich nochmal nachfragen ob ich meinen PC überhaupt direkt per Ethernet an meine CPU anschließen kann, oder ob ich dafür einen gesonderten CP brauche?

#include "StdAfx.h"
#include <stdlib.h>
#include <stdio.h>
#include "nodavesimple.h"
#include "nodave.h"
#include "openSocket.h"

char ip[] = "192.168.0.1";

int main(int argc, char **argv) {
int a,b,c,res;
float d;
daveInterface * di;
daveConnection * dc;
_daveOSserialType fds;

daveSetDebug(daveDebugPrintErrors);

if (argc<2) {
printf("Usage: testISO_TCP IP-Address of CP\n");
exit(-1);
}

fds.rfd=openSocket(102, argv[5]);
fds.wfd=fds.rfd;

if (fds.rfd>0) {
di = daveNewInterface(fds,"IF1", 0, daveProtoISOTCP, daveSpeed187k);
daveSetTimeout(di,5000000);
dc =daveNewConnection(di,2,0, 2); // insert your rack and slot here

if (0==daveConnectPLC(dc)) {
printf("Connected.\n");

res=daveReadBytes(dc,daveFlags,0,0,16,NULL);
if (0==res) {
a=daveGetU32(dc);
b=daveGetU32(dc);
c=daveGetU32(dc);
d=daveGetFloat(dc);
printf("FD0: %d\n",a);
printf("FD4: %d\n",b);
printf("FD8: %d\n",c);
printf("FD12: %f\n",d);
} else
printf("failed! (%d)\n",res);

printf("Finished.\n");
return 0;
} else {
printf("Couldn't connect to PLC.\n");
getchar();
return -2;
}
} else {
printf("Couldn't open TCP port. \nPlease make sure a CP is connected and the IP address is ok. \n");
getchar();
return -1;
}
return 0;
}

Das war vorhin meine erste Frage in so einem Forum wie diesem und ich habe prompt eine Antwort erhalten. Ich muss sagen ich bin echt begeistert.
 
Ein C++ Programmierer sollte eigentlich wissen, was eine Eingabeaufforderung ist und wie man die bedient..

Am Windows-Startknopf gibst Du mal CMD ein und Enter. In dem erschienenen schwarzen Fenster gehst Du mittels "CD \<pfad zu deiner exe>" in das Verzeichnis, wo Deine testISO_TCP.exe liegt und startest nun die testISO_TCP.exe mit Angabe der IP Deiner CPU:
...>testISO_TCP 192.168.0.1

Die hinter testISO_TCP eingegebenen Parameter der Kommandozeile kann die Exe in main() im Array argv auslesen.

Hier in dieser FAQ kannst Du sehen, wie das mit der Eingabeaufforderung aussieht:
http://www.sps-forum.de/faq/62825-libnodave-beispiel-tcp-verbindung-zu-s7-welt.html

Harald
 
Allerdings glaube ich mitlerweile, dass das Programm sich die ip Adresse selber nimmt und zwar an der Stelle:
fds.rfd=openSocket(102, argv[5]); und zwar das argv[5] kann das sein?
Zum Glück hat Software weniger mit Glauben als mit Wissen zu tun.
Mach Dich mal schlau, welche Argumente Du dem Programm beim Aufruf mitgeben musst. argv[...] sind genau die Argumente der Kommandozeile.
Wenn Du selbst programmieren willst, solltest Du das wissen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Fabse,

was Du hier als Code anführst sieht ziemlich stark nach den Libnodave beispielen aus!

Dein Programm gibt Usage: testISO_TCP IP-Address of CP aus da Du hier am Anfang landest:

Code:
[COLOR=#333333]if (argc<2) {[/COLOR]
[COLOR=#333333]printf("Usage: testISO_TCP IP-Address of CP\n");[/COLOR]
[COLOR=#333333]exit(-1);[/COLOR]
[COLOR=#333333]} 
[/COLOR]

Dies lässt wiederum zurückschießen, das Du hier in die Main-Funktion keine Argumente übergibst!
Code:
[COLOR=#333333]...[/COLOR]
[COLOR=#333333]int main(int argc, char **argv)
[/COLOR][COLOR=#333333]...
[/COLOR]


Also am besten noch einmal schauen welche Argumente wirklich im Code erwartet werden oder den Code so modifizieren das keine Argumente notwendig sind
;)

Gruß Dominik

 
Allerdings glaube ich mitlerweile, dass das Programm sich die ip Adresse selber nimmt und zwar an der Stelle:
fds.rfd=openSocket(102, argv[5]); und zwar das argv[5] kann das sein?
Ja, Du kannst die IP auch fest im Programm einprogrammieren:

Code:
char ip[] = "192.168.0.1";

int main(int argc, char **argv) {
...

[COLOR="#FF0000"]
//das Exit bei leerer Kommandozeile verhindern: Zeilen löschen oder auskommentieren
//    if (argc<2) {
//      printf("Usage: testISO_TCP IP-Address of CP\n");
//      exit(-1);
//    }[/COLOR]    

    fds.rfd=openSocket(102, [COLOR="#0000FF"]"192.168.0.1"[/COLOR]);  // oder auch so: fds.rfd=openSocket(102, [COLOR="#0000FF"]ip[/COLOR]);
...
}


Deinen Computer kannst Du direkt mit einem Netzwerkkabel mit der PN-Schnittstelle der CPU verbinden. Oder über einen Switch.

Harald
 
Jo besten Dank an euch alle,
ich bin kein erfahrener Programmierer und das mit der Bedeutung von argv und argc habe ich, so meine ich, nie im Lehrbuch gelesen. Da ich das bisher noch nicht gebraucht habe, habe ich dem auch nicht viel bei gemessen. Vielen Dank. Wie gut, dass ich hier nachgefragt habe.
 
Zurück
Oben