Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 10 von 10

Thema: S7TCP.DLL - Einfachstes Auslesen von Daten aus der SPS

  1. #1
    Registriert seit
    21.10.2010
    Beiträge
    158
    Danke
    21
    Erhielt 29 Danke für 17 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute.
    Hab mir eine eigene Bibliothek zum Auslesen von Daten aus einer S7-300/S7-400 über das Netzwerk geschrieben.

    Nun will ich sie euch mal kurz vorstellen. Es ist allerding noch eine Beta-Version, da ich noch einige Dinge verbessern will, und auch das Schreiben von Werten will ich noch implementieren.

    Die DLL hat nur 3 exportierte Funktionen, diese sollten selbserklärend sein.
    Code:
    int S7Connect(LPCSTR IP, int SlotNo, S7Conn *conn);
    void S7Disconnect(S7Conn *conn);
    int S7Read(S7Conn *conn, LPCSTR syms[], int iCount, float result[]);
    Der Funktion S7Read wird ein String-Array übergeben, das z.B. so aussehen kann:
    Code:
    LPCSTR sym[] = {"M0.1", "DB65.DBD0", "T21", "db65.dbx2.0", "z100", "MW20"};
    Man kann die Werte also genauso eintragen wie sie z.B. in die Variabeltabelle eingetragen werden.
    Alle Werte, egal ob Bit, Real, Timer oder Zähler, werden als 'float' zurückgegeben, da dies der einfachste Weg ist, und in 99% der Anwendungen reichen wird.

    Angehängt ist ein kleines Code:Blocks-Projekt in C, das die Verwendung der DLL verdeutlicht.
    S7TCP Beispiel.rar

    Schöne Grüße,
    funkey
    Zitieren Zitieren S7TCP.DLL - Einfachstes Auslesen von Daten aus der SPS  

  2. Folgender Benutzer sagt Danke zu funkey für den nützlichen Beitrag:

    Mobi (10.03.2012)

  3. #2
    Registriert seit
    27.10.2005
    Beiträge
    47
    Danke
    1
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Ich habe die DLL mal ausprobiert,
    bekomme als Anwort Error -4 oder Error -5


    Hier ein Mitschnitt mit Wireshark:

    Die Verbindung wird aufgebaut und die Daten werden angefordert.

    S7TCP_wireshark.zip

    S7TCP.png


    Das ist wohl, das Problem mit den sieben Bytes.
    Hier ein Ausschnitt von libnodave:

    Code:
    #define ISOTCPminPacketLength 16
    int DECL2 _daveGetResponseISO_TCP(daveConnection * dc) {
        int res;
        res=_daveReadISOPacket(dc->iface,dc->msgIn);
        if(res==7) {
        if (daveDebug & daveDebugByte) 
            LOG1("CPU sends funny 7 byte packets.\n");
        res=_daveReadISOPacket(dc->iface,dc->msgIn);
        }
        if (res==0) return daveResTimeout; 
        if (res<ISOTCPminPacketLength) return  daveResShortPacket; 
        return 0;
    }
    Geändert von - chris - (10.03.2012 um 15:10 Uhr)

  4. #3
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Zitat Zitat von - chris - Beitrag anzeigen
    Das ist wohl, das Problem mit den sieben Bytes.
    Wobei das eigentlich nicht "funny" ist, sondern ein gültiges Telegramm eines ISO Paketes. Die Länge im TPKT Header abzufragen ist im Grunde genommen der falsche Weg (funktioniert aber trotzdem). Richtig wäre es das Bit im Byte für "Last data unit" der TPDU Nummer abzufragen. Wireshark macht das auch, und darum werden diese Pakete auch als "reassembled" angezeigt.
    Details siehe hier:
    http://www.synapse.de/ban/HTML/P_ISO/Ger/P_iso87.html

    Ich kenne dieses Verhalten nur von WinAC Soft-SPSen. Fragt sich nur warum Siemens das so reinprogrammiert hat, vielleicht sollen dadurch bestimmte Steuerungen erkannt werden, wer weiß. Ist zwar nicht falsch, aber überflüssig.

    Aber ich will hier nicht zu viel unterstützen, denn wenn die erste fehlerhafte Version schon als eine beschränkte Demo-Version daher kommt...naja, da soll er mal lieber selbst seine Fehler suchen.

  5. #4
    Registriert seit
    21.10.2010
    Beiträge
    158
    Danke
    21
    Erhielt 29 Danke für 17 Beiträge

    Standard

    Danke für die Kommentare.
    Das mit den 7 Bytes konnte ich auf meinen Test-SPSen nicht nachvollziehen, das könnte den Error -4 verursachen. Hab jetzt aber versucht, das so ähnlich wie in LibNoDave einzubauen. Ich kann es aber jetzt nicht online testen.
    Error -5 kommt eigentlich wenn das Symbol nicht erkannt wird, welche Symbole hast du der Funktion übergeben?

    Die Demo-Beschränkung habe ich herausgenommen, das war nur ein Test und ich habe es vergessen zu deaktivieren, es hat ja keinen Sinn einer unvollständigen, fehlerhaften DLL auch noch eine Demo-Funktion zuzumuten. Allerdings habe ich jetzt noch keine Längenbeschränkung nach PDUSize implementiert, also Achtung beim Auslesen von vielen Werten.

    Eigentlich wollte ich ja nur fragen, wie ihr mein Konzept findet. Es ist zwar noch nicht fertig, aber ich hoffe es gefällt euch so.
    Soll ich als Rückgabe vielleicht double verwenden, damit die Genauigkeit bei hohen DINT Werten besser passt?
    Außerdem will ich noch folgendes zum Symbol hinzufügen, z.B.:

    MD8S: für signed DINT
    DB65.DBD0F für Float (Real)
    MW20U für unsigned Integer

    Was haltet ihr davon? Wird es schon zu unkomfortabel?

    Die nächste eventuelle Erweiterung wäre, folgende:

    MD0F,10 für 10 Real-Werte ab MD0

    Zu unübersichtlich oder nicht sinnvoll?

    Danke für euren Support.

    S7TCP_V0.2.1.rar
    Geändert von funkey (10.03.2012 um 19:02 Uhr)

  6. #5
    Registriert seit
    27.10.2005
    Beiträge
    47
    Danke
    1
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Ich teste hier mit einer WinAC Soft-SPS und PLCSim mit NetToPLCSim.

    Ich verwende MW100, MW102 und AW2.

    Beide SPSen sind gleichzeitig über Netzwerk erreichbar, ich ändere also nur die IP-Adresse.
    Bei der WinAC Soft-SPS erhalte ich nur noch Error -5 und mit NetToPLCSim funtioniert es immer.

    Mit Libnodave funktioniert es mit beiden SPSen.
    Geändert von - chris - (10.03.2012 um 20:45 Uhr)

  7. #6
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von funkey Beitrag anzeigen
    Danke für die Kommentare.
    Das mit den 7 Bytes konnte ich auf meinen Test-SPSen nicht nachvollziehen, das könnte den Error -4 verursachen. Hab jetzt aber versucht, das so ähnlich wie in LibNoDave einzubauen. Ich kann es aber jetzt nicht online testen.
    Error -5 kommt eigentlich wenn das Symbol nicht erkannt wird, welche Symbole hast du der Funktion übergeben?

    Die Demo-Beschränkung habe ich herausgenommen, das war nur ein Test und ich habe es vergessen zu deaktivieren, es hat ja keinen Sinn einer unvollständigen, fehlerhaften DLL auch noch eine Demo-Funktion zuzumuten. Allerdings habe ich jetzt noch keine Längenbeschränkung nach PDUSize implementiert, also Achtung beim Auslesen von vielen Werten.

    Eigentlich wollte ich ja nur fragen, wie ihr mein Konzept findet. Es ist zwar noch nicht fertig, aber ich hoffe es gefällt euch so.
    Soll ich als Rückgabe vielleicht double verwenden, damit die Genauigkeit bei hohen DINT Werten besser passt?
    Außerdem will ich noch folgendes zum Symbol hinzufügen, z.B.:

    MD8S: für signed DINT
    DB65.DBD0F für Float (Real)
    MW20U für unsigned Integer

    Was haltet ihr davon? Wird es schon zu unkomfortabel?

    Die nächste eventuelle Erweiterung wäre, folgende:

    MD0F,10 für 10 Real-Werte ab MD0

    Zu unübersichtlich oder nicht sinnvoll?

    Danke für euren Support.

    S7TCP_V0.2.1.rar

    Also Ich hab das bei mir in der toolboxlib (http://siemensplctoolboxlib.codeplex.com/) so drinn:

    DB8.DBD4,DWORD
    P#DB7.DBX5.0 BYTE 10,STRING
    MW4,BCDWORD
    P#M0.0 BYTE 8,DATETIME

    bei mir kann man als 3ten Parameter noch das Display Format angeben (wie in der Variablentabelle in step7).
    Die verwende ich dann wenn man toString vom PLCTag aufruft!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  8. #7
    Registriert seit
    24.10.2012
    Beiträge
    1
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Liebe Jochen Kühner,

    Danke, dass Sie sehr viel !!!

  9. #8
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von hut_3e Beitrag anzeigen
    Liebe Jochen Kühner,

    Danke, dass Sie sehr viel !!!
    ??? Hääää? für was?
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  10. #9
    Registriert seit
    17.06.2010
    Ort
    nähe Memmingen
    Beiträge
    610
    Danke
    93
    Erhielt 116 Danke für 100 Beiträge

    Standard

    dass dürfte wohl die wörtliche übersetzung von: "thank you very much" sein )

  11. #10
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von tnt369 Beitrag anzeigen
    dass dürfte wohl die wörtliche übersetzung von: "thank you very much" sein )
    Ja, aber für was???
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 19.01.2011, 11:40
  2. Daten aus der CPU über das Panel auslesen
    Von Andy Latte im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 10.06.2009, 11:29
  3. Daten aus DB auslesen
    Von netx1 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 03.06.2008, 19:06
  4. Daten aus der SPS S7 auslesen mittels Pc/OPC o.ä.
    Von chrisiflip im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 12.03.2008, 13:21
  5. Antworten: 7
    Letzter Beitrag: 12.12.2007, 10:20

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •