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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: S7 FB für MODBUS TCP

  1. #1
    Registriert seit
    22.05.2005
    Ort
    sonniges Maifeld
    Beiträge
    1.067
    Danke
    77
    Erhielt 205 Danke für 159 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Gemeinde,

    ich hab da mal ein Problem. Ich habe heute mehr oder weniger erfolgreich einen FB für Modbus/TCP zusammgezirkelt.
    Funktioniert auch soweit. Mit dem Testprogramm ModScan32 von WinTech spreche ich die SPS an.
    Funktionscode 03h, n Register lesen, SPS antwortet, passt.

    Jetzt das Problem: Ich wollte den Empfangpuffer für AG_SEND so groß wählen, das wenn ModScan mit den Funktionscode 10h, n Register schreiben kommt mein Baustein auf jeden Fall alles im Puffer hat. Funzt nicht.

    Weil:

    Für den Funktioncode 3h ist das Kommandotelegramm 12Byte lang (6B Header + 1B Slave-Adresse + 1B Funktionscode + 2B Register Offset + 2B Anzahl Register). Gebe ich am AG_RECIEVE für den Empfangbereich 12 Byte an wird korrekt übertragen, ist er grösser werden die 12Byte wie in einem Ringspeicher angehängt, also nicht mehr vernünftig auszuwerten.

    Also, wie stelle ich das an, ich kann ja nicht wissen wie viele Bytes der Partner mir senden will. Funktionscode 6h reicht hier nicht aus, da Real-Werte in meinem Anwendungsfall damit nicht übertragen werden können.

    Wieso macht der AG_RECIEVE so einen Müll ?


    Geändert von Lars Weiß (03.03.2008 um 19:36 Uhr)
    "Man kann auf seinem Standpunkt stehen, aber man sollte nicht darauf sitzen" - Erich Kästner
    Zitieren Zitieren S7 FB für MODBUS TCP  

  2. #2
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Wenn Du anhand Deines Headers auf die Datenlänge schliessen kannst, ist folgendes möglich:

    Lies in einen AG_Rec Aufruf deinen Header ein (die Länge sollte schon konstant sein)

    Durch diesen Header ermittelst Du die Länge Deiner Nutzdaten. Diese kannst Du dann in einem weiteren Empfangsauftrag dann längengenau abholen.

  3. #3
    Avatar von Lars Weiß
    Lars Weiß ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.05.2005
    Ort
    sonniges Maifeld
    Beiträge
    1.067
    Danke
    77
    Erhielt 205 Danke für 159 Beiträge

    Standard

    Du meinst einen AG_Recieve mit konstanter Länge und direkt darunter einen zweiten Aufruf wo ich die Länge anpasse ? Ich werde es morgen mal versuchen, danke für den Tipp.
    "Man kann auf seinem Standpunkt stehen, aber man sollte nicht darauf sitzen" - Erich Kästner

  4. #4
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Exakt. Der 1. Empfangsbaustein liest Deinen festen Header aus und "leert" somit schonmal den Empfangspuffer um Deine eingestellte Empfangslänge.
    Der Aufruf danach holt dann nur noch Deine Nutzdaten ab.
    Schreib doch mal, obs geklappt hat. Hab das schon mal auf diese Weise gemacht, funktioniert eigentlich einwandfrei.
    Siemens empfielt für variable Empfangslängen auch diese Vorgehensweise.

  5. #5
    Registriert seit
    17.04.2007
    Ort
    Kiel
    Beiträge
    496
    Danke
    162
    Erhielt 67 Danke für 63 Beiträge

    Standard

    Sag mal Bescheid, wenn Du es hinbekommen hast und erkläre doch bitte kurz den Aufbau. In meinem nächsten Projekt, muss ich mir auch eine solche Kopplung basteln.

    Gruß aus Kiel

  6. #6
    Avatar von Lars Weiß
    Lars Weiß ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.05.2005
    Ort
    sonniges Maifeld
    Beiträge
    1.067
    Danke
    77
    Erhielt 205 Danke für 159 Beiträge

    Standard

    Also, do sieht mein Versuch der variablen Empfangslänge aus:

    Code:
      CALL  "AG_RECV"
           ID    :=1
           LADDR :=W#16#100
           RECV  :=P#DB2.DBX0.0 BYTE 6
           NDR   :=#ndr1
           ERROR :=#error
           STATUS:=#status
           LEN   :=#len
          UN    #ndr1
          SPB   m002
    // ANY-Pointer zusammensetzen
          LAR1  P##Pointer_VAR
          L     B#16#10                     // Syntax-ID
          T     LB [AR1,P#0.0]
          L     B#16#2                      // Datentyp Byte
          T     LB [AR1,P#1.0]
          L     "RECV_BUFFER".LENGHT_LOW    // Anzahl Bytes
          T     LW [AR1,P#2.0]
          L     2                           // Quell-DB
          T     LW [AR1,P#4.0]
          L     P#DBX 6.0                   // Byte Offset
          T     LD [AR1,P#6.0]
     
          CALL  "AG_RECV"
           ID    :=1
           LADDR :=W#16#100
           RECV  :=#Pointer_VAR
           NDR   :=#ndr1
           ERROR :=#error
           STATUS:=#status
           LEN   :=#len
    m002: BE
    Das passt so leider auch nicht, da ModScan 12 Bytes schickt und so im ersten Aufruf von AG_Recieve die 6 Bytes überschrieben werden.
    "Man kann auf seinem Standpunkt stehen, aber man sollte nicht darauf sitzen" - Erich Kästner

  7. #7
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Wenn Du also immer mindestens 12 Bytes empfängst, hol doch im ersten Auftrag erstmal diese 12 Bytes ab. Den Rest dieses Telegramms (sofern es denn dann noch einen gibt) kannst Du doch dann immer noch nach belieben abholen.

  8. #8
    Avatar von Lars Weiß
    Lars Weiß ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.05.2005
    Ort
    sonniges Maifeld
    Beiträge
    1.067
    Danke
    77
    Erhielt 205 Danke für 159 Beiträge

    Standard

    Wenn ich 12 Bytes in meinen 12Byte Empfangspuffer schreibe passt es, kommen 14 Bytes werden mir die ersten beiden wieder übschrieben.

    Ich könnte kotzen ...
    "Man kann auf seinem Standpunkt stehen, aber man sollte nicht darauf sitzen" - Erich Kästner

  9. #9
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Von welchem Aufruf werden die ersten Bytes überschrieben, vom 1. oder 2. Aufruf?

    Ansonsten probier doch mal, dass überspringen des 2. Aufrufs wegzulassen. Es könnte sein, das Du das NDR erst dann bekommst, wenn der FC alle Bytes umkopiert hat. (Bin mir da aber nicht ganz sicher) Wenn das der Fall wäre, würde der 2. Aufruf nichts mehr vorfinden, da der 1. ja schon alles umkopiert hat. (evtl auch in mehreren Zyklen)

  10. #10
    Avatar von Lars Weiß
    Lars Weiß ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.05.2005
    Ort
    sonniges Maifeld
    Beiträge
    1.067
    Danke
    77
    Erhielt 205 Danke für 159 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Die Bytes werden schon im ersten Aufruf überschrieben
    "Man kann auf seinem Standpunkt stehen, aber man sollte nicht darauf sitzen" - Erich Kästner

Ähnliche Themen

  1. Modbus TCP mit PN CPU
    Von wupper-sps im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 22.09.2011, 18:41
  2. Antworten: 0
    Letzter Beitrag: 05.08.2010, 08:14
  3. [ Modbus ] S7-200
    Von caret im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 21.01.2010, 20:01
  4. Modbus+
    Von FvE im Forum Feldbusse
    Antworten: 1
    Letzter Beitrag: 09.04.2009, 18:19
  5. ModBus
    Von hausenm im Forum Feldbusse
    Antworten: 6
    Letzter Beitrag: 17.03.2009, 11:36

Lesezeichen

Berechtigungen

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