Step 7 CPU414 mit CP443: Kommunikation mit Fremd-SPS wird stetig langsamer

momo99

Level-2
Beiträge
54
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wir haben eine 414-3 mit einer CP443-1, darauf laufen etwa 15 Verbindungen mit anderen SPS (ISO-on-TCP). Zusätzlich die Kommunikation mit einer Atvise-Visualisierung.

Für die Kommunikation verwenden wir die Bausteine "AG_SEND_CP400" und "AG_RECV_CP400" (beide V1.2).
Nachdem es von Beginn weg Probleme gab rufen wir die SEND-Aufträge nur noch mit einem 0,5s-Impuls auf (natürlich mit DONE- bzw. ERROR-Überwachung).

Folgendes Problem:
Nach Neustart der CP (z.B. nach Erstellung einer neuen Verbindung) läuft die Kommunikation ganz normal, Laufzeit eines Signales vom Senden bis zur Rückmeldung ca. 1-1,5 sek.
Danach wird die Kommunikation kontinuierlich langsamer, je mehr Daten ausgetauscht werden desto schneller geht diese "Verlangsamung". Wir hatten schon Pingback-Zeiten von über 40 sek. (dabei gehen aber keine Daten verloren).

Allem Anschein nach liegt das Problem im Datenaustausch zwischen CP und CPU, die Diagnose der CP liefert keine Fehler, alle Aufträge laufen im 0,5s-Takt fehlerfrei ab.
Testweise wurde bereits eine 2. CP443 eingebaut, über diese CP haben wir die Atvise-Visu geschaltet - keine Änderung.

Kennt jemand dieses Problem, was kann man machen (evtl. Einstellungen an der CPU ändern)?

lg
momo
 
Ich hatte so einen Effekt schon mal, da lief auf einer CP der Eingangspuffer voll (die Daten wurden von der CPU nicht schnell genug abgeholt).

Rein rechnerisch: Bei ca. 15 Verbindungen mit 0,5s Sendetakt kommen ca. 30 Sendungen pro Sekunde an => es muss der Empfangspuffer ca. alle 33ms geleert werden
Wirf mal einen Blick auf die Zykluszeit. Evtl. den Puffer mehrmals im Zyklus abfragen?!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das klingt schlüssig. Zykluszeit dürfte etwa in dem Bereich liegen.
Allerdings: Schon als wir nur ein paar wenige Verbindungen hatten, war das Problem vorhanden. Die "Verlangsamung" ging eben langsamer.

Evtl. den Puffer mehrmals im Zyklus abfragen?!
Wie macht man das?
 
In dem die "Empfangsfunktion" (bei mir war es z.B. der FC170) mehrmals hintereinander aufgerufen wird.

In diesem FC170 wurde folgendes gemacht:
- Daten empfangen (CALL FC60)
- Auswerten der Empfangsdaten (NDR abfragen, Checksumme prüfen, Daten kopieren/verteilen)
 
Was mir gerade einfällt:
Es sollte doch zu jeder Verbindung eine ID angelegt sein. Diese ID muss beim Empfang angegeben werden.
Damit sollte zu jeder Verbindung eine eigen Empfangsfunktion (z.B. ein Aufruf des FC60) vorhanden sein?!
Dadurch dürfte es nicht zum "volllaufen des Puffer kommen da ja je Zyklus jede Verbindung abgefragt wird.

Wie sind die Verbindungen angelegt und wie werden sie in der CPU behandelt? Stell mal den Code ein!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich rufe den RECV gemeinsam mit der SEND-Funktion im gleichen Netzwerk auf, den kompletten Kommunikationsbaustein dann im OB33, also auch alle 500ms.
Evtl. liegt hier das Problem, soll ich die RECV-Funktionen trennen und aus dem OB1 zyklisch aufrufen?

Hier die Funktion für eine Verbindung, ähnlich für 15 Verbindungen in 15 Netzwerken (mit den ID´s 1-15) gemacht:
Code:
      CALL  "AG_SEND_CP400"
       ACT   :="Send/Rec".AG1_1.IMP
       ID    :=1
       LADDR :=W#16#1FFD
       SEND  :="Komm_AG1".SEND1_1
       LEN   :=20
       DONE  :="Send/Rec".AG1_1.DONE
       ERROR :="Send/Rec".AG1_1.ERR_S
       STATUS:="Send/Rec".AG1_1.STAT_S

      U     "Send/Rec".AG1_1.IMP
      R     "Send/Rec".AG1_1.IMP
      SPB   M00c
      UN    "Send/Rec".AG1_1.DONE
      UN    "Send/Rec".AG1_1.ERR_S
      UN    "IMP_NST"
      SPB   M00c
      UN    "Send/Rec".AG1_1.IMP
      S     "Send/Rec".AG1_1.IMP

M00c: NOP   0
      CALL  "AG_RECV_CP400"
       ID    :=1
       LADDR :=W#16#1FFD
       RECV  :="Komm_AG1".REC1_1
       NDR   :="Send/Rec".AG1_1.NDR
       ERROR :="Send/Rec".AG1_1.ERR_R
       STATUS:="Send/Rec".AG1_1.STAT_R
       LEN   :="Send/Rec".AG1_1.LEN_R

//eigene Überwachung
      U     "SysTkt2,0"                 //Lifebit senden
      =     "Komm_AG1".SEND1_1.Life_a
      L     S5T#10S                     //Lifebit retour
      U     "Komm_AG1".REC1_1.Life_a
      SE    T      1
      L     S5T#10S
      UN    "Komm_AG1".REC1_1.Life_a
      SE    T      2
      U     T      1                    //auswerten
      O     T      2                    //Alarm-Verbindung
      =     "DB_Visu".Stoe.AG1_1
      UN    "DB_Visu".Stoe.AG1_1        //Lampe Verbindung läuft
      =     "DB_Visu".H.Komm_AG1_OK

//ferne Überwachung
      U     "Komm_AG1".REC1_1.Life_p
      =     "Komm_AG1".SEND1_1.Life_p
 
Dann liegt es nicht an der Anzahl der Aufrufe sondern an der Häufigkeit (nur alle 500ms).
Die Empfangsroutine darf nicht im (gleichen) zeitgesteuerten OB aufgerufen werden
da sie häufiger bearbeitet werden muss wie Senderoutine!
Am besten die Empfangsfunktion im OB1 zyklisch aufrufen und mit dem NDR Bit auf
empfangene Daten reagieren.
 
Zurück
Oben