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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: SPS Daten über eine Socket Schnittstelle senden. Aber wie???

  1. #1
    Registriert seit
    27.11.2011
    Beiträge
    43
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,


    ich möchte mit C oder C++ eine TCP Socket Schnittstelle programmieren, die mit einer CP 343-1 von Siemens Daten austauschen kann. Das Problem ist das ich nicht weiß wie ich das Protokoll verarbeiten soll, da Siemens keine Anleitung für die Socket Schnittstelle zur Verfügung stellt. Es wird immer von den Send\Recv und fetch\write Bausteinen gesprochen. Habt Ihr eine Idee wie ich das angehen soll? Würde mich über eine Antwort freuen.
    Zitieren Zitieren SPS Daten über eine Socket Schnittstelle senden. Aber wie???  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    werte einfach libnodave aus ODER, welch verrückter gedanke, benutze einfach libnodave!
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #3
    Registriert seit
    27.11.2011
    Beiträge
    43
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich weiß das es mit Libnodave geht, dies ist allerdings eine nicht kommerzielle Bibliothek eines Programmierers.
    Dies muss ich mit C oder C++ machen und auf ein Echzeit Betriebssystem übertragen

  4. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Wenn du dich mit dem API der BSD-Sockets (z.B. Windows/Linux PC) in C auskennst, hilft dir vielleicht diese Gegenüberstellung der Netzwerkfunktionen weiter:

    1)
    Socket erstellen
    PC: socket()
    S7: Über Verbindungsparametrierung in Netpro

    2)
    Socket parametrieren (Adressen, Ports):
    PC: SOCKADDR_IN Struktur beschreiben
    S7: Über Verbindungsparametrierung in Netpro

    3)
    Verbindung herstellen
    PC: connect()
    S7: Verbindungsauf- und Abbau übernimmt das Betriebssystem der SPS

    4)
    Daten senden
    PC: send()
    S7: AG_SEND

    5)
    Daten empfangen
    PC: recv()
    S7: AG_RECV

    Bei der S7 stellst du bei der Verbindungsparametrierung in Netpro ein, ob die Verbindung zum Partner aktiv aufgebaut werden soll (Client) oder auf eine Verbindung warten soll (Server).
    Soll die S7 aktiv sein, so versucht diese sobald die CPU in RUN ist die TCP-Verbindung zur projektierten Client-Adresse aufzubauen. Der Datenaustausch muss dann im SPS-Programm über die oben erwähnten Funktionen ausprogrammiert werden.

  5. #5
    Registriert seit
    27.11.2011
    Beiträge
    43
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo zusammen,

    bis Punkt fünf hab ich es geschafft. Aber ein kleines Problem hab ich noch ich weiß nicht wie ich die Variablen der SPS im Socket Programm ansprechen soll.
    Die SPS ist bei mir client und das Socket Programm Server. Natürlich möchte ich es auch umgekehrt machen.
    Dank dir Thomas deine Anleitung war echt super

  6. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Zitat Zitat von Energie85 Beitrag anzeigen
    bis Punkt fünf hab ich es geschafft. Aber ein kleines Problem hab ich noch ich weiß nicht wie ich die Variablen der SPS im Socket Programm ansprechen soll.
    Die SPS ist bei mir client und das Socket Programm Server. Natürlich möchte ich es auch umgekehrt machen.
    Über die TCP-Verbindung kannst du direkt keine SPS-Adressen ansprechen. Die Daten die über eine aufgebaute Verbindung ausgetauscht werden, landen genau wie auch auf der PC-Seite in einem Empfangspuffer. Auf S7-Seite ist dieser Empfangspuffer der Datenbereich der bei der AG_RECV Funktion am Parameter RECV angegeben wurde.

    Wenn dein PC-Programm send() mit den Daten "ABC" absendet, landen diese Daten immer in dem Datenbaustein des Empfangsbereichs.
    Du musst also im SPS-Programm den empfangenen Datenstrom in irgendeiner Weise auswerten.
    Da ein TCP-Datenstrom keine Start- oder Endekennung besitzt, musst du dir selber einen Telegrammrahmen ausdenken damit das SPS-Programm erkennen kann wo ein Datensatz beginnt und wo dieser endet.

    Um es auf SPS-Seite einfacher zu handhaben, kannst du auch anstelle der TCP-Verbindung eine ISO-on-TCP Verbindung verwenden. Dann muss dein PC-Programm aber ebenfalls dieses Protokoll beherrschen, und du bist auf Port 102 festgenagelt.

  7. #7
    Registriert seit
    27.11.2011
    Beiträge
    43
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Siemens stellt keine Anleitung zur Beschreibung des Protokolls zur verfügung. Gibt es keine andere möglichkeit die empfangenen Protokolle auf der PC Seite (SPS-->) auszuwerten oder das man den aufbau des Protokolls einsehen kann.

  8. #8
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Zitat Zitat von Energie85 Beitrag anzeigen
    Siemens stellt keine Anleitung zur Beschreibung des Protokolls zur verfügung.
    ISO-on-TCP ist dokumentiert:
    http://tools.ietf.org/html/rfc1006
    und unterlagert:
    http://www.synapse.de/ban/HTML/P_ISO/Ger/P_iso92.html

    Was nicht dokumentiert ist, ist das S7-Protokoll. Dessen Nutzdaten werden in ein ISO-on-TCP-Telegramm eingepackt. Das ist das was libnodave verwendet, und das du nicht nutzen willst (auch wenn es fast die einfachste Möglichkeit darstellt von einem PC mit einer S7 Daten aus auszutauschen).

    Zitat Zitat von Energie85 Beitrag anzeigen
    Gibt es keine andere möglichkeit die empfangenen Protokolle auf der PC Seite (SPS-->) auszuwerten oder das man den aufbau des Protokolls einsehen kann.
    "DU" musst dir das Protokoll selber überlegen.
    Wenn deine Telegrammlänge immer gleich ist (z.B. 100 Bytes) kannst du evtl. auf den Rahmen verzichten, kann da aber keine Erfahrungswerte vorweisen ob das zuverlässig funktioniert.
    Hier gibt es von Siemens auch noch ein rel. aufwändiges Beispiel dazu:
    http://support.automation.siemens.co...ew/de/19033929

    Das Problem ist jetzt aber nicht SPS spezifisch. Man angenommen du schreibst mit den Socket-Funktionen am PC ein einfaches Programm, mit dem Daten unbestimmter Länge von dem einen auf den anderen Rechner übertragen werden sollen. Dann weiß der Empfänger auch nicht wann die Daten vollständig übertragen werden, außer er bekommt es auf irgendeine Weise mitgeteilt.

    Bei serieller Kopplung verwendet man dazu oftmals bekannte Steuerzeichen (STX, ETX, ...). Wenn dann ein "Hallo" übertragen werden soll, wird das in "STX"Hallo"ETX" eingepackt. Die Steuerzeichen dürfen dann nicht im Datenstrom vorkommen, oder müssen entsprechend gekennzeichnet sein (wie wenn du in C mittels printf einen backslash ausgeben möchtest).

  9. #9
    Registriert seit
    07.07.2004
    Beiträge
    3.285
    Danke
    38
    Erhielt 584 Danke für 382 Beiträge

    Standard

    Hallo,

    alles was Thomas_v2.1 hier geschrieben hat, kann ich nur bestätigen. IsoOnTCP gemäß RFC1006 ist die beste Lösung für Dein Problem. Hierbei wird das S7 Protokoll in einen TCP Frame reingestopft und man muss sich als Anwender da keine besonderen Krücken bauen.

    Zitat Zitat von Thomas_v2.1
    Da ein TCP-Datenstrom keine Start- oder Endekennung besitzt, musst du dir selber einen Telegrammrahmen ausdenken damit das SPS-Programm erkennen kann wo ein Datensatz beginnt und wo dieser endet.
    Im einfachsten Fall reservierst Du die ersten 2 Bytes im Telegramm um die Länge der übertragenden Bytes dort einzustellen, diese Anzahl der Bytes auswerten und auslesen. Damit hast Du die einfachste und simpelste Art eines Protokolls implementiert (aber eben nur auf der untersten Ebene TCP).
    Was mich manchmal wundert, das selbst so renommierte Firmen wie Inat/Softing dann von Ihren Protokollwandlern immer von einem TCP/IP Protokoll schreiben, das ganze hat auf dieser Ebene nichts mit dem IP Protokoll zu tun, sondern nur mit TCP ...

    Gruß

    Question_mark
    ''Ich habe wirklich keine Vorurteile.
    Meine Meinung ist nur die Summe der Erfahrungen" ... (Question_mark)
    Zitieren Zitieren Ich mache mir ein eigenes Protokoll  

  10. #10
    Registriert seit
    27.11.2011
    Beiträge
    43
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Dank euch beiden für die antwort
    Was hält Ihr von der fetch\write Methode?

Ähnliche Themen

  1. daten über PN senden und empfangen
    Von Servernexus im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 04.08.2011, 16:43
  2. XML-Daten senden und lesen, aber wie?
    Von tigger im Forum Programmierstrategien
    Antworten: 2
    Letzter Beitrag: 03.12.2009, 13:19
  3. Antworten: 0
    Letzter Beitrag: 05.03.2008, 17:43
  4. Antworten: 8
    Letzter Beitrag: 06.02.2008, 18:19
  5. Daten über DB senden
    Von bigannang im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 08.11.2007, 22:50

Stichworte

Lesezeichen

Berechtigungen

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