# Libnodave und ISO over TCP



## muhmann (9 Juli 2010)

hallo zusammen,

leider habe ich zu meinem problem keine passende antwort gefunden, daher dieser thread.

ich versuche derzeit meinem PC die kommunikation mit einer S7-300 beizubringen. ich programmieren hierzu Libnodave in C und verwende das ISO over TCP protokoll.

die kommunikation funktioniert soweit einwandfrei. ich kann ohne probleme die speicher auslesen bzw. die analogeingänge direkt auslesen.

hier erstmal mein quellcode:

```
void plc_readout(void)
{
    int                    a, res;
    char                ip[] = "192.168.0.1";
    daveInterface        *di;
    daveConnection        *dc;
    _daveOSserialType    fds;

    daveSetDebug(daveDebugPrintErrors);

    fds.rfd = openSocket(102, ip);
    fds.wfd = fds.rfd;

    if(fds.rfd > 0)
    {
        // Init new connection
        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, daveP, 0, 272, 2, NULL);    // Read 2 bytes direct form analog input channel 0 (PEW272)
            if(0 == res)
            {
                a = daveGetU16(dc);                                // Read 2 bytes direct form analog input channel 0 (PEW272)
                printf("Analog Input Ch 0: %d\n", a);
            } else {
                printf("failed! (%d)\n", res);  
            }
            printf("Finished.\n");
        } else {
            printf("Couldn't connect to PLC.\n");    
        }
    } else {
    printf("Couldn't open TCP port. \nPlease make sure a CP is connected and the IP address is ok.\n");    
    }
    closeSocket(fds.rfd);            // Close connection
}
```
ich greife hier direkt auf einen analogeingang zur spannungsmessung meiner S7-300 zu. klappt auch soweit wunderbar. es ist auch nichtmal nötig dass die SPS im Run-Modus ist. man kann auch im Stop-Modus direkt auf die analogeingänge zugreifen und die spannung bzw. den digitalen wert der spannung auslesen.

mein problem ist nun folgendes:
wenn ich meinen PC und die SPS einschalte, warte bis die SPS hochgefahren ist, ich mein programm gestartet hab, bekomme ich die fehlermeldung dass Libnodave den port zur SPS nicht öffnen konnte. der port der hier geöffnet werden soll ist 102.

ich habe versucht die kommunikation über den konsolenbefehl "netstat -an" nachzuvollziehen. dabei hat sich gezeigt das Libnodave versucht den Port zu öffnen indem er die "SYN_GESENDET" anfrage an die SPS schickt. dummerweise antwortet die SPS aber nicht mit einem ACK dadrauf.
wenn ich nun aber den simatic manger starte und mein SPS-programm nochmals auf die SPS lade, dann funktioniert auch die kommunikation mit Libnodave und der SPS problemlos. es scheint also dass der simatic manger irgendwie den port öffnen kann, aber Libnodave nicht.

hat schonmal jemand diese erfahrung gemacht bzw. weiß wie man dieses problem beheben kann?
also damit ich, auch ohne mein SPS-programm erneut aufzuspielen, eine verbindung direkt nach dem einschalten des PCs und der SPS mit Libnodave herstellen kann?

vielen dank schonmal im voraus


----------



## muhmann (12 Juli 2010)

keiner eine idee was man da machen könnte?


----------



## argv_user (12 Juli 2010)

muhmann schrieb:


> keiner eine idee was man da machen könnte?



Ja, eine habe ich dann doch.

Dein Quellcode sieht aus als würdest Du ihn mit einem Mausklick aufrufen?
Wie auch immer: Wenn beim Verbindugsaufbau etwas nicht klappt, so heißt
die Devise: Versuch abbrechen, ein paar Sekunden warten, dann neu versuchen.

Was bei ISO-on-TCP auch helfen kann: In der SPS eine explizite Verbindung anlegen.


----------



## muhmann (12 Juli 2010)

ja das ist richtig. ich rufe die funktion mit einem klick bzw. tastendruck auf. aber das habe ich schon mehrfach getestet, es funktioniert so einwandfrei. ich kann in kurzer zeit mehrfach auf meine taste drücken ohne das verbindungsprobleme entstehen.

ich bin leider mit der S7 nicht so bewandert. wie kann man da denn eine explizite verbindung zu einem PC einrichten?

edit:
zumindest habe ich rausgefunden dass die kommunikation zum teil funktioniert. ich kann direkt nach dem einschalten über das industrial ethernet auf den scalance x-208 switch zugreifen bzw. anpingen, aber nicht die cpu direkt anpingen.


----------



## PN/DP (13 Juli 2010)

muhmann schrieb:


> [...]bekomme ich die fehlermeldung dass Libnodave den port zur SPS nicht öffnen konnte. der port der hier geöffnet werden soll ist 102


Für mich klingt das eher nach einem Problem auf Deinem PC.
Hast Du mit der Forums-Suche schon dies und das gefunden?

Gruß
Harald


----------



## Thomas_v2.1 (13 Juli 2010)

PN/DP schrieb:


> Für mich klingt das eher nach einem Problem auf Deinem PC.
> Hast Du mit der Forums-Suche schon dies und das gefunden?



Die dort geschilderten Probleme passen aber nicht zum Problem von muhmann. Er will auf eine Steuerung auf Port 102 verbinden, und keine Verbindungen zu seinem PC auf Port 102 zulassen.

Wenn er eine Verbindung zu einem anderen Netzwerkteilnehmer auf Port 102 aufbauen will, wird im Normalfall der lokale Port vom Betriebssystem ausgesucht und liegt dann irgendwo im freien tausender Bereich. Außer er gibt beim Verbindungsaufbau explizit eine lokale Portnummer als Endpunkt an. Danach sieht sein Programm aber nicht aus.


----------



## muhmann (13 Juli 2010)

danke für die links, die hatte ich nicht gefunden. zumindest weiß ich nun welcher s7-dienst für diesen port zuständig ist. vielleicht lässt sich damit etwas anfangen 

aber wie thomas schon sagte, trifft das leider nicht ganz auf mein problem zu. ich möchte nur von einem PC aus auf den port 102 der SPS zugreifen.

```
openSocket(102, ip);
```
der port steht auf dem PC zur verfügung und wird auch, wie vorgesehen, vom simatic manager geöffnet. nur leider gelingt mir dies nicht mit libnodave. prinzipiell ist es mir nicht wichtig welchen port ich für die SPS öffnen muss, nur das ich ihn öffnen kann. aber soweit ich weiß ist dieser port speziell für ISO over TCP verbindungen gedacht.

zusätzlich weiß ich jetzt noch das mein scalance switch da probleme macht. irgendwie scheint da das routing zwischen switch, CPU und libnodave probleme zu machen.


----------



## PN/DP (13 Juli 2010)

Thomas_v2.1 schrieb:


> Wenn er eine Verbindung zu einem anderen Netzwerkteilnehmer auf Port 102 aufbauen will, wird im Normalfall der lokale Port vom Betriebssystem ausgesucht und liegt dann irgendwo im freien tausender Bereich.


Ach ja richtig! Port 102 ist ja der Zielport und nicht der eigene. 

@muhmann
Wie hängt Deine CPU am Ethernet?
Ist das eine PN-CPU oder hat die einen IE-CP oder gar einen Ethernet-to-MPI-Adapter?
Eine Desktop-Firewall auf dem PC funkt nicht dazwischen?

Gruß
Harald


----------



## muhmann (13 Juli 2010)

oh sorry, ich hatte ganz vergessen die hardware aufzuschreiben die ich verwende.

also hier mal mein zeug:
als stromversorgung benutze ich bei der s7-300 eine PS307 5A. dazu noch die CPU 315F-2PN/DP. sowie je ein digitales und analoges IO modul und eine scalance x208 switch.

die CPU hängt über ein ethernetkabel direkt an der switch und die switch wiederum ist mit meinem PC verbunden.

einen eigenen CP habe ich nicht. zumindest soweit ich das bisher verstanden habe  ich habe leider bisher nur erfahrungen mit B&R sowie mitsubishi SPSen, daher bin ich nicht so bewandert was die s7 angeht. ich bitte milde walten zu lassen 

als firewall wird nur die windows eigene benutzt und die macht keine probleme mit dem port 102.


----------



## muhmann (23 Juli 2010)

nach langer zeit mal ein kleines update, dank urlaub 

ich weiß zumindest jetzt woran es liegt, dass ich direkt nachdem hochfahren von PC und SPS keine verbindung über tcp zustande bekomme. es ist die scalance switch. ich kann weder auf das WBM zugreifen, noch sie mit ihrer ip adresse anpingen. erst nachdem der simatic manager eine verbindung zur cpu aufgebaut hat, läuft auch die switch. sprich WBM und ping funktionieren.

weiß vielleicht jemand ob eine projektierung dieser switch in meinem S7 programm abhilfe schaffen könnte?

die andere lösung ist die, irgendwie eine verbindung über den S7-Dienst "s7otbxsx.exe" aufzubauen. damit arbeitet auch der simatic manager.


----------



## Rainer Hönle (23 Juli 2010)

Oder mal den wireshark bemühen und schauen, was Siemens am Anfang macht.


----------



## Jochen Kühner (23 Juli 2010)

muhmann schrieb:


> nach langer zeit mal ein kleines update, dank urlaub
> 
> ich weiß zumindest jetzt woran es liegt, dass ich direkt nachdem hochfahren von PC und SPS keine verbindung über tcp zustande bekomme. es ist die scalance switch. ich kann weder auf das WBM zugreifen, noch sie mit ihrer ip adresse anpingen. erst nachdem der simatic manager eine verbindung zur cpu aufgebaut hat, läuft auch die switch. sprich WBM und ping funktionieren.
> 
> ...



Kannst es ja mal mit Ethernet über die S7 Online Schnitstelle und libnodave versuchen. Dazu musst du aber meine geupdatete Version von LibNoDave verwenden, die orginale unterstützt Ethernet über S7Online nicht. Die geupdatete Version ist in meiner Connection Lib integriert. Dort ist auch ein testprogramm, mit dem kannst du ja erst mal versuchen obs damit funktioniert, das du dir keine unötige arbeit machst! Download hier: http://jochensserver.dyndns.org/wordpress/?page_id=55


----------



## muhmann (23 Juli 2010)

alles klar, habt vielen dank ihr beiden 

ich werde beide varianten testen und anschließend berichten.


----------



## muhmann (27 Juli 2010)

wie versprochen die lösung des problems.

das problem lag ganz einfach daran, dass bei meinem simatic manager als verbindungspunkt TCP/IP (Auto) ausgewählt war. da ich nicht genau wusste was die "Auto" einstellung bewirkt, kam ich auch nicht auf die idee, dass es vielleicht ein IP problem sein könnte. in diesem fall ist es so, dass mein PC in einem anderen subnet liegt als die CPU und die switch. CPU und switch liegen in 192.168.0.xxx und der PC in 192.168.111.xxx. kein wunder das es nicht funktioniert. der S7-Dienst "s7otbxsx.exe" hat das immer erkannt und dem PC eine passende IP adresse zugewiesen, was mir nicht aufgefallen ist. mea culpa :-|

ich habe dem PC also eine zweite IP adresse zugewiesen die dem subnet der CPU+switch entspricht und schon funktionierte es.

nochmals danke für eure hilfe


----------

